一、踩过的坑
1、CubeMX 生成工程的时候询问是否升级固件F103的1.61版本库,可以直接忽略,选择本地已经安装的1.60。否则不会导入HAL库到工程中。
2、产生代码的最后一步,选择对每个外设分别生成.c/.h文件,项目结构更清晰。
3、要启用下载的话必须在Pinout页面选择PA13和PA14,为调试接口,以STM32F103RB为例。
4、接口配置Configuration 中选择SYS,启用DEBUG为Serial Wire,时基选择SysTick. (1ms)。
5、要使用RTC的话,需要选择RCC 外部低速时钟LSE为:Crystal.
6、创建好工程需要对项目进行设置,配置调试和下载SW,选择为J-Link/J-Trace Cortex, Port为SW, FlashDownload 选上Reset and Run.
7、CUBEMX的串口数据位数包括校验位,有校验在8位位宽的时候数据设置为9,无校验设置为8.
8、生成工程中需要增加以下代码:
(1)stm32f1xx_it.c 在对应的USART1_IRQHandler添加中断入口USART1_ReceiveIDLE();
(2)usart.c 中完成USART1_ReceiveIDLE():
uint32_t temp;
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);
temp = huart1.Instance->SR;
temp = huart1.Instance->DR;
HAL_UART_DMAStop(&huart1);
temp = huart1.hdmarx->Instance->CNDTR;
Usart1_RX.rx_len = UART1_BUFF_SIZE - temp;
Usart1_RX.receive_flag=1;
HAL_UART_Receive_DMA(&huart1,Usart1_RX.RX_Buf,UART1_BUFF_SIZE);
}
(3)usart.c中添加void USART1_ClearIT()主要是启用 HAL_UART_Receive_DMA和 __HAL_UART_ENABLE_IT。
{
__HAL_UART_DISABLE_IT(&huart1,UART_IT_PE);
__HAL_UART_DISABLE_IT(&huart1,UART_IT_TXE);
__HAL_UART_DISABLE_IT(&huart1,UART_IT_TC);
__HAL_UART_DISABLE_IT(&huart1,UART_IT_RXNE);
__HAL_UART_DISABLE_IT(&huart1,UART_IT_LBD);
__HAL_UART_DISABLE_IT(&huart1,UART_IT_CTS);
__HAL_UART_DISABLE_IT(&huart1,UART_IT_ERR);
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);
HAL_Delay(10);
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_TC);
HAL_UART_Receive_DMA(&huart1, Usart1_RX.RX_Buf, UART1_BUFF_SIZE);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
}
(4)在Main.c中 启用接收中断,调用void USART1_ClearIT()。然后就可以通过Usart1_RX.receive_flag和 Usart1_RX.rx_len来处理数据了。
记录于【2018-11-6】