Blame view

RIOT/cpu/stm32_common/include/periph_cpu_common.h 4.53 KB
fb11e647   vrobic   reseau statique a...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
  /*
   * Copyright (C) 2016 Freie Universitรคt Berlin
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @ingroup         cpu_stm32_common
   * @{
   *
   * @file
   * @brief           Shared CPU specific definitions for the STM32 family
   *
   * @author          Hauke Petersen <hauke.peterse@fu-berlin.de>
   */
  
  #ifndef PERIPH_CPU_COMMON_H
  #define PERIPH_CPU_COMMON_H
  
  #include "cpu.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * @brief   Length of the CPU_ID in octets
   */
  #define CPUID_LEN           (12U)
  
  /**
   * @brief   All STM timers have 4 capture-compare channels
   */
  #define TIMER_CHAN          (4U)
  
  /**
   * @brief   Use the shared SPI functions
   * @{
   */
  #define PERIPH_SPI_NEEDS_TRANSFER_BYTES
  #define PERIPH_SPI_NEEDS_TRANSFER_REG
  #define PERIPH_SPI_NEEDS_TRANSFER_REGS
  /** @} */
  
  /**
   * @brief   Available peripheral buses
   */
  typedef enum {
      APB1,           /**< APB1 bus */
      APB2,           /**< APB2 bus */
  #if defined(CPU_FAM_STM32L0) || defined(CPU_FAM_STM32L1) || defined(CPU_FAM_STM32F1)\
      || defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F3)
      AHB,            /**< AHB bus */
  #elif defined(CPU_FAM_STM32F2) || defined(CPU_FAM_STM32F4)
      AHB1,           /**< AHB1 bus */
      AHB2,           /**< AHB2 bus */
      AHB3            /**< AHB3 bus */
  #else
  #warning "unsupported stm32XX family"
  #endif
  } bus_t;
  
  /**
   * @brief   Overwrite the default gpio_t type definition
   * @{
   */
  #define HAVE_GPIO_T
  typedef uint32_t gpio_t;
  /** @} */
  
  /**
   * @brief   Definition of a fitting UNDEF value
   */
  #define GPIO_UNDEF          (0xffffffff)
  
  /**
   * @brief   Define a CPU specific GPIO pin generator macro
   */
  #define GPIO_PIN(x, y)      ((GPIOA_BASE + (x << 10)) | y)
  
  /**
   * @brief   Available MUX values for configuring a pin's alternate function
   */
  typedef enum {
      GPIO_AF0 = 0,           /**< use alternate function 0 */
      GPIO_AF1,               /**< use alternate function 1 */
      GPIO_AF2,               /**< use alternate function 2 */
      GPIO_AF3,               /**< use alternate function 3 */
  #ifndef CPU_FAM_STM32F0
      GPIO_AF4,               /**< use alternate function 4 */
      GPIO_AF5,               /**< use alternate function 5 */
      GPIO_AF6,               /**< use alternate function 6 */
      GPIO_AF7,               /**< use alternate function 7 */
      GPIO_AF8,               /**< use alternate function 8 */
      GPIO_AF9,               /**< use alternate function 9 */
      GPIO_AF10,              /**< use alternate function 10 */
      GPIO_AF11,              /**< use alternate function 11 */
      GPIO_AF12,              /**< use alternate function 12 */
      GPIO_AF13,              /**< use alternate function 13 */
      GPIO_AF14,              /**< use alternate function 14 */
      GPIO_AF15               /**< use alternate function 15 */
  #endif
  } gpio_af_t;
  
  /**
   * @brief   Timer configuration
   */
  typedef struct {
      TIM_TypeDef *dev;       /**< timer device */
      uint32_t max;           /**< maximum value to count to (16/32 bit) */
      uint32_t rcc_mask;      /**< corresponding bit in the RCC register */
      uint8_t bus;            /**< APBx bus the timer is clock from */
      uint8_t irqn;           /**< global IRQ channel */
  } timer_conf_t;
  
  /**
   * @brief   PWM configuration
   */
  typedef struct {
      TIM_TypeDef *dev;       /**< Timer used */
      uint32_t rcc_mask;      /**< bit in clock enable register */
      gpio_t pins[4];         /**< pins used, set to GPIO_UNDEF if not used */
      gpio_af_t af;           /**< alternate function used */
      uint8_t chan;           /**< number of configured channels */
      uint8_t bus;            /**< APB bus */
  } pwm_conf_t;
  
  /**
   * @brief   Get the actual bus clock frequency for the APB buses
   *
   * @param[in] bus       target APBx bus
   *
   * @return              bus clock frequency in Hz
   */
  uint32_t periph_apb_clk(uint8_t bus);
  
  /**
   * @brief   Enable the given peripheral clock
   *
   * @param[in] bus       bus the peripheral is connected to
   * @param[in] mask      bit in the RCC enable register
   */
  void periph_clk_en(bus_t bus, uint32_t mask);
  
  /**
   * @brief   Disable the given peripheral clock
   *
   * @param[in] bus       bus the peripheral is connected to
   * @param[in] mask      bit in the RCC enable register
   */
  void periph_clk_dis(bus_t bus, uint32_t mask);
  
  /**
   * @brief   Configure the given pin to be used as ADC input
   *
   * @param[in] pin       pin to configure
   */
  void gpio_init_analog(gpio_t pin);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* PERIPH_CPU_COMMON_H */
  /** @} */