STM32CubeMX工程修改過程:
【stm32_cyhal_uart.c】
註釋掉第194和199行的HAL_UARTEx_SetTxFifoThreshold。
註釋掉第204行的HAL_UARTEx_DisableFifoMode。
第208行if (__HAL_UART_GET_IT(obj->huart, UART_IT_RXNE))改成if (__HAL_UART_GET_FLAG(obj->huart, UART_FLAG_RXNE))。
第211行__HAL_UART_SEND_REQ(obj->huart, UART_RXDATA_FLUSH_REQUEST)改成__HAL_UART_FLUSH_DRREGISTER(obj->huart)。
第615行obj->context.rxBufIdx = obj->huart->NbRxDataToProcess改成=1。
第709行obj->huart->RxISR改成stm32_cyhal_uart_RxISR,並在所在的函數(第687行)上方聲明
extern void (*stm32_cyhal_uart_RxISR)(UART_HandleTypeDef *huart);
第713行USART_CR1_RXNEIE_RXFNEIE改成USART_CR1_RXNEIE。
用/**/註釋掉第870-900行的下面兩個語句塊。
if ((event & CYHAL_UART_IRQ_RX_FULL) != (uint32_t)CYHAL_UART_IRQ_NONE)
if ((event & CYHAL_UART_IRQ_TX_EMPTY) != (uint32_t)CYHAL_UART_IRQ_NONE)
第913行obj->huart->RxISR改成stm32_cyhal_uart_RxISR。
第916和921行USART_CR1_RXNEIE_RXFNEIE改成USART_CR1_RXNEIE。
註釋掉第1011-1013行整個case 7U:語句。
【cyabs_freertos_helpers.c】
去掉第72行vApplicationGetIdleTaskMemory和第105行vApplicationGetTimerTaskMemory前面的__WEAK。
【stm32f4xx_hal_uart.c】
第305和3731行UART_SetConfig函數前面的static void改成HAL_StatusTypeDef,並在函數內容的最後加上return HAL_OK。
【wifi_bt_if.c】
註釋掉第95-101行整個if (stm32_cypal_sdio_hw_init(hsdio) == 0u)語句塊。
【btfw.c】
替換成正確的藍牙固件。替換前的c文件大小是31113位元組,替換後是223498位元組。
【libbtstack.ar】
替換成適用於CortexM4核的藍牙協議棧庫文件。
注意STM32H7和STM32F4用的libbtstack.ar是不一樣的。
H7的libbtstack.ar大小是926608位元組,而F4的libbtstack.ar大小是925964位元組。
【main.c】
在int main(void)上方添加串口打印函數。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *fp)
{
if (ch == '\n')
HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY);
else
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END 0 */
【startup_stm32f407xx.s】
Heap_Size改成0x2000,避免wiced_bt_create_heap失敗導致no Default heap錯誤。
【stm32f4xx_hal_conf.h】
第193行USE_HAL_UART_REGISTER_CALLBACKS的值改成1。
【stm32f4xx_it.c】
USART2_IRQHandler函數外面加上:
#include "platform_hal_wrapper.h"
extern hci_uart_cb_t hci_uart_cb;
void (*stm32_cyhal_uart_RxISR)(UART_HandleTypeDef *huart);
函數裏面的HAL_UART_IRQHandler語句前加上:
/* USER CODE BEGIN USART2_IRQn 0 */
if (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET && __HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET)
{
if (hci_uart_cb.inited && stm32_cyhal_uart_RxISR != NULL)
{
stm32_cyhal_uart_RxISR(&huart2);
return;
}
}
/* USER CODE END USART2_IRQn 0 */