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 */