1. freertos时钟配置问题
选择freertos后,系统时钟sys建议选择TIM6。至于原因可以参考:
STM32 HAL使用TIM6代替Systick作为时基_stm32f4 hal tim6-CSDN博客
2. freertos 任务配置问题
建立的任务除了要注意设置优先级外,还应该注意设置stack size,因为在任务中运行比较大的函数,尤其是printf函数比较多的时候,内存设置过小容易导致程序卡死。
3. C,C++混合编程问题
这里涉及两个相互调用,即在C+文件中调用C文件和在C中调用C+文件。在工程生成之初,就要选择生成C++代码,然后在编译器添加C+编译路径要包含有C+的文件路径。
另外调用C++文件中的函数,要采用外包一层的方式,参考下文:
编译的时候,C+源文件对应的h文件里还添加了
#ifdef __cplusplus
....//带有C++特性的代码
#endif
4. 添加串口调试重映射printf方式,在使用cubeide生成代码中,需要在main.cpp如下位置添加代码:
/* USER CODE BEGIN 0 */
// 重定向print start
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart5 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
// 重定向print end
/* USER CODE END 0 */
5. stm32cubeide +dma + uart 实现不定长数据接收,参考如下博客
STM32—cubeIDE+DMA+USART 接收任意长度的数据_cubeide串口数据任意长度-CSDN博客
重点是,打开dma接收,打开串口闲时中断,在串口闲时中断中添加处理函数
main.c中
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart7, receive_gps_buff, receive_gps_buff_size);
__HAL_UART_ENABLE_IT(&huart7, UART_IT_IDLE); //使能串UART2 IDLE中断
/* USER CODE END UART7_IRQn 0 */
HAL_UART_IRQHandler(&huart7);
/* USER CODE BEGIN UART7_IRQn 1 */
if(RESET != __HAL_UART_GET_FLAG(&huart7, UART_FLAG_IDLE)) //判断是否是空闲中
{
__HAL_UART_CLEAR_IDLEFLAG(&huart7); //清楚空闲中断标志(否则会 直不断进入中断)
HAL_UART_DMAStop(&huart7); //停止本次DMA传输
uint8_t data_length = receive_buff_size - __HAL_DMA_GET_COUNTER(&hdma_uart7_rx); //计算接收到的数据长度
// char temp[data_length];
// memcpy(temp,0,data_length);
// memcpy(temp,receive_buff,data_length);
HAL_UART_Receive_DMA(&huart7, receive_buff, receive_buff_size);
data_length = 0; //调用中断处理函数
}