Rev 8 | Rev 10 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 8 | Rev 9 | ||
|---|---|---|---|
| Line 58... | Line 58... | ||
| 58 | /* USER CODE END PFP */ |
58 | /* USER CODE END PFP */ |
| 59 | 59 | ||
| 60 | /* Private user code ---------------------------------------------------------*/ |
60 | /* Private user code ---------------------------------------------------------*/ |
| 61 | /* USER CODE BEGIN 0 */ |
61 | /* USER CODE BEGIN 0 */ |
| 62 | 62 | ||
| - | 63 | void HAL_GPIO_WRITE_ODR(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) |
|
| - | 64 | { |
|
| - | 65 | /* Check the parameters */ |
|
| - | 66 | assert_param(IS_GPIO_PIN(GPIO_Pin)); |
|
| - | 67 | ||
| - | 68 | GPIOx->ODR |= GPIO_Pin; |
|
| - | 69 | } |
|
| - | 70 | ||
| - | 71 | ||
| - | 72 | /** Errata code from Stack Overflow |
|
| - | 73 | 1. Disable the I2C peripheral by clearing the PE bit in I2Cx_CR1 register. |
|
| - | 74 | 2. Configure the SCL and SDA I/Os as General Purpose Output Open-Drain, High level |
|
| - | 75 | (Write 1 to GPIOx_ODR). |
|
| - | 76 | 3. Check SCL and SDA High level in GPIOx_IDR. |
|
| - | 77 | 4. Configure the SDA I/O as General Purpose Output Open-Drain, Low level (Write 0 to |
|
| - | 78 | GPIOx_ODR). |
|
| - | 79 | 5. Check SDA Low level in GPIOx_IDR. |
|
| - | 80 | 6. Configure the SCL I/O as General Purpose Output Open-Drain, Low level (Write 0 to |
|
| - | 81 | GPIOx_ODR). |
|
| - | 82 | 7. Check SCL Low level in GPIOx_IDR. |
|
| - | 83 | 8. Configure the SCL I/O as General Purpose Output Open-Drain, High level (Write 1 to |
|
| - | 84 | GPIOx_ODR). |
|
| - | 85 | 9. Check SCL High level in GPIOx_IDR. |
|
| - | 86 | 10. Configure the SDA I/O as General Purpose Output Open-Drain , High level (Write 1 to |
|
| - | 87 | GPIOx_ODR). |
|
| - | 88 | 11. Check SDA High level in GPIOx_IDR. |
|
| - | 89 | 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain. |
|
| - | 90 | 13. Set SWRST bit in I2Cx_CR1 register. |
|
| - | 91 | 14. Clear SWRST bit in I2Cx_CR1 register. |
|
| - | 92 | 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register. |
|
| - | 93 | **/ |
|
| - | 94 | ||
| - | 95 | void HAL_I2C_ClearBusyFlagErrata_2_14_7(I2C_HandleTypeDef *hi2c) |
|
| - | 96 | { |
|
| - | 97 | ||
| - | 98 | static uint8_t resetTried = 0; |
|
| - | 99 | if (resetTried == 1) |
|
| - | 100 | { |
|
| - | 101 | return; |
|
| - | 102 | } |
|
| - | 103 | uint32_t const SDA_PIN = GPIO_PIN_7; |
|
| - | 104 | uint32_t const SCL_PIN = GPIO_PIN_6; |
|
| - | 105 | GPIO_InitTypeDef GPIO_InitStruct; |
|
| - | 106 | ||
| - | 107 | // 1 |
|
| - | 108 | __HAL_I2C_DISABLE(hi2c); |
|
| - | 109 | ||
| - | 110 | // 2 |
|
| - | 111 | GPIO_InitStruct.Pin = SDA_PIN | SCL_PIN; |
|
| - | 112 | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; |
|
| - | 113 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
| - | 114 | GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; |
|
| - | 115 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
| - | 116 | ||
| - | 117 | HAL_GPIO_WRITE_ODR(GPIOB, SDA_PIN); |
|
| - | 118 | HAL_GPIO_WRITE_ODR(GPIOB, SCL_PIN); |
|
| - | 119 | ||
| - | 120 | // 3 |
|
| - | 121 | GPIO_PinState pinState; |
|
| - | 122 | if (HAL_GPIO_ReadPin(GPIOB, SDA_PIN) == GPIO_PIN_RESET) |
|
| - | 123 | { |
|
| - | 124 | for (;;) |
|
| - | 125 | { |
|
| - | 126 | } |
|
| - | 127 | } |
|
| - | 128 | if (HAL_GPIO_ReadPin(GPIOB, SCL_PIN) == GPIO_PIN_RESET) |
|
| - | 129 | { |
|
| - | 130 | for (;;) |
|
| - | 131 | { |
|
| - | 132 | } |
|
| - | 133 | } |
|
| - | 134 | ||
| - | 135 | // 4 |
|
| - | 136 | GPIO_InitStruct.Pin = SDA_PIN; |
|
| - | 137 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
| - | 138 | ||
| - | 139 | HAL_GPIO_TogglePin(GPIOB, SDA_PIN); |
|
| - | 140 | ||
| - | 141 | // 5 |
|
| - | 142 | if (HAL_GPIO_ReadPin(GPIOB, SDA_PIN) == GPIO_PIN_SET) |
|
| - | 143 | { |
|
| - | 144 | for (;;) |
|
| - | 145 | { |
|
| - | 146 | } |
|
| - | 147 | } |
|
| - | 148 | ||
| - | 149 | // 6 |
|
| - | 150 | GPIO_InitStruct.Pin = SCL_PIN; |
|
| - | 151 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
| - | 152 | ||
| - | 153 | HAL_GPIO_TogglePin(GPIOB, SCL_PIN); |
|
| - | 154 | ||
| - | 155 | // 7 |
|
| - | 156 | if (HAL_GPIO_ReadPin(GPIOB, SCL_PIN) == GPIO_PIN_SET) |
|
| - | 157 | { |
|
| - | 158 | for (;;) |
|
| - | 159 | { |
|
| - | 160 | } |
|
| - | 161 | } |
|
| - | 162 | ||
| - | 163 | // 8 |
|
| - | 164 | GPIO_InitStruct.Pin = SDA_PIN; |
|
| - | 165 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
| - | 166 | ||
| - | 167 | HAL_GPIO_WRITE_ODR(GPIOB, SDA_PIN); |
|
| - | 168 | ||
| - | 169 | // 9 |
|
| - | 170 | if (HAL_GPIO_ReadPin(GPIOB, SDA_PIN) == GPIO_PIN_RESET) |
|
| - | 171 | { |
|
| - | 172 | for (;;) |
|
| - | 173 | { |
|
| - | 174 | } |
|
| - | 175 | } |
|
| - | 176 | ||
| - | 177 | // 10 |
|
| - | 178 | GPIO_InitStruct.Pin = SCL_PIN; |
|
| - | 179 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
| - | 180 | ||
| - | 181 | HAL_GPIO_WRITE_ODR(GPIOB, SCL_PIN); |
|
| - | 182 | ||
| - | 183 | // 11 |
|
| - | 184 | if (HAL_GPIO_ReadPin(GPIOB, SCL_PIN) == GPIO_PIN_RESET) |
|
| - | 185 | { |
|
| - | 186 | for (;;) |
|
| - | 187 | { |
|
| - | 188 | } |
|
| - | 189 | } |
|
| - | 190 | ||
| - | 191 | // 12 |
|
| - | 192 | GPIO_InitStruct.Pin = SDA_PIN | SCL_PIN; |
|
| - | 193 | GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; |
|
| - | 194 | GPIO_InitStruct.Pull = GPIO_PULLUP; |
|
| - | 195 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
| - | 196 | ||
| - | 197 | // 13 |
|
| - | 198 | hi2c->Instance->CR1 |= I2C_CR1_SWRST; |
|
| - | 199 | ||
| - | 200 | // 14 |
|
| - | 201 | hi2c->Instance->CR1 ^= I2C_CR1_SWRST; |
|
| - | 202 | ||
| - | 203 | // 15 |
|
| - | 204 | __HAL_I2C_ENABLE(hi2c); |
|
| - | 205 | ||
| - | 206 | resetTried = 1; |
|
| - | 207 | } |
|
| - | 208 | ||
| 63 | /* USER CODE END 0 */ |
209 | /* USER CODE END 0 */ |
| 64 | 210 | ||
| 65 | /** |
211 | /** |
| 66 | * @brief The application entry point. |
212 | * @brief The application entry point. |
| 67 | * @retval int |
213 | * @retval int |
| Line 83... | Line 229... | ||
| 83 | 229 | ||
| 84 | /* Configure the system clock */ |
230 | /* Configure the system clock */ |
| 85 | SystemClock_Config(); |
231 | SystemClock_Config(); |
| 86 | 232 | ||
| 87 | /* USER CODE BEGIN SysInit */ |
233 | /* USER CODE BEGIN SysInit */ |
| - | 234 | /* Peripheral clock enable */ |
|
| 88 | 235 | ||
| 89 | /* USER CODE END SysInit */ |
236 | /* USER CODE END SysInit */ |
| 90 | 237 | ||
| 91 | /* Initialize all configured peripherals */ |
238 | /* Initialize all configured peripherals */ |
| 92 | MX_GPIO_Init(); |
239 | MX_GPIO_Init(); |
| 93 | MX_SPI1_Init(); |
240 | MX_SPI1_Init(); |
| 94 | MX_I2C1_Init(); |
241 | MX_I2C1_Init(); |
| 95 | /* USER CODE BEGIN 2 */ |
242 | /* USER CODE BEGIN 2 */ |
| 96 | cc_init(); |
243 | cc_init(); |
| 97 | 244 | ||
| - | 245 | HAL_I2C_ClearBusyFlagErrata_2_14_7(&hi2c1); |
|
| - | 246 | MX_I2C1_Init(); |
|
| 98 | init_bmp(&hi2c1); |
247 | init_bmp(&hi2c1); |
| 99 | uint32_t lastTick = HAL_GetTick(); |
248 | uint32_t lastTick = HAL_GetTick(); |
| 100 | /* USER CODE END 2 */ |
249 | /* USER CODE END 2 */ |
| 101 | 250 | ||
| 102 | /* Infinite loop */ |
251 | /* Infinite loop */ |
| Line 144... | Line 293... | ||
| 144 | RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
293 | RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
| 145 | RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; |
294 | RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; |
| 146 | RCC_OscInitStruct.HSIState = RCC_HSI_ON; |
295 | RCC_OscInitStruct.HSIState = RCC_HSI_ON; |
| 147 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
296 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
| 148 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
297 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
| 149 | RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; |
298 | RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4; |
| 150 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
299 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
| 151 | { |
300 | { |
| 152 | Error_Handler(); |
301 | Error_Handler(); |
| 153 | } |
302 | } |
| 154 | 303 | ||
| Line 159... | Line 308... | ||
| 159 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
308 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
| 160 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
309 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
| 161 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; |
310 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; |
| 162 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
311 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
| 163 | 312 | ||
| 164 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) |
313 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) |
| 165 | { |
314 | { |
| 166 | Error_Handler(); |
315 | Error_Handler(); |
| 167 | } |
316 | } |
| 168 | } |
317 | } |
| 169 | 318 | ||