STM32CubeIDE+FREERTOS踩坑记录

1. STM32Cube生成的FREERTOS系统是加了CMSIS_RTOS封装的,该封装下函数的调用要比FREERTOS简单一点,将中断调用和线程调用综合到了一起,但又不提示这个函数支不支持中断调用,需要细致研读代码才行。。。而且CMSIS_RTOS封装的功能并不全面,当需要实现复杂功能时,还是得直接调用FREERTOS的API。

2. 想要使用通用的CMSIS_RTOS封装,需要研读其代码,CMSIS_V2的官方API文档链接如下:CMSIS-RTOS API v2https://www.keil.com/pack/doc/CMSIS/RTOS2/html/group__CMSIS__RTOS.html

 3. printf的问题是STM32CubeIDE的一大问题,在没有keil的USE MicroLib选项下,printf共出现了如下问题:调用printf没有输出;调用printf有输出,但是不能带格式化字符串,否则就卡住。经过乱七八糟的研究,确定和几个因素有关:

        无FREERTOS的情况下使用HAL_Delay函数要注意时基的中断优先级,最好调到最高;

        有FREERTOS的情况下按照要求调整时基不为sysclk,注意中断优先级按默认来,我使用了TIM3和TIM2作为时基都没有问题。

        有FREERTOS的情况下要注意线程优先级对printf函数的影响,printf本质上是一个函数,在其执行过程中另一个线程调用该函数会导致堵塞与错误,因此应当使用Mux互斥量将printf函数保护起来。

        另外,IDE的MCU Setting需要注意配置,否则严重影响printf函数!

附上printf的重定向代码:

#include

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

附上函数上锁的代码:

osMutexAcquire(myMutex01Handle, osWaitForever );
printf("Task2 %d\n",cnt);
osMutexRelease(myMutex01Handle);

附上IDE设置的截图:

STM32CubeIDE+FREERTOS踩坑记录_第1张图片

4. 注意硬件的UART及SPI引脚与软件定义要一致,记得将UART2的引脚从PA改为PD

5. 在如下文章的指导下完成了串口的不定长DMA接收UART DMA with IDLE Line Detection » ControllersTechhttps://controllerstech.com/uart-dma-with-idle-line-detection/

     结合实践,需要注意的地方有以下几点:

  • 要关闭半接收中断,否则严重影响处理逻辑,因为没法判断是不是半接收中断
  • UART的速率无法和MCU的处理速度相比,因此一般不会出现超长数据导致的数据被遗漏问题。只要在中断中尽快开启下一次DMA接收就能分多次完整的接收超长数据。但是为了避免可能出现的时序问题,请不要一次发送超过缓冲区大小的数据。
  • 环形缓冲区使用了memcpy函数,会使用一定时间,因此,我认为该逻辑的最好使用场景是发送端一次性发送的数据不超过接收缓冲区(不是环形缓冲区)。

6. 在调试ADC+DMA+FREERTOS的过程中,出现了osThreadFlagsWait与osMutexAcquire无法顺利执行的情况,甚至定义一个不会用到的局部变量都会导致程序的运行状态卡死等莫名奇妙的bug。经过彻夜研究发现,Cube生成的任务中,默认的defaultTask最好不要做任何的修改。另一个重要的点是每个任务的优先级会对程序的运行产生及其重要的影响,当空的defaultTask的优先级高于其他任务时,程序卡死,低于或者相等时,程序正常运行。建议保持各线程优先级相同,免得出现BUG。

7. CubeIDE的中文字符显示十分的小,且有乱码。解决乱码的方式是将字符集改为GBK,参考网址如下:

STM32CubeIDE中文乱码 - 飞起的小田 - 博客园使用STM32CubeIDE编辑中文出现乱码情况,一共有两个地方都出现了问题 1.从别处复制中文注释内容到STM32CubeIDE编辑器,经STM32CubeIDE自动生成代码后,中文注释个别出现乱码https://www.cnblogs.com/tianxxl/p/11978402.html        改变中文字符很小及调整字体大小的方法如下:

STM32学习笔记 —— STM32CubeIDE中文大小不一乱码情况_Vinson的专栏-CSDN博客_stm32cubeide中文乱码中文大小不一乱码情况菜单栏 ==Windows -> Preferences ==https://blog.csdn.net/wschou/article/details/1064847898. STM32CubeIDE添加DSP库的方法和Keil不同,只找到添加静态库的方法,如下所示:

STM32CUBEIDE添加DSP库_jinhuiyu0403的专栏-CSDN博客硬件环境:STM32L496。软件环境:STM32CUBEIDE1.4.1。目标:移植DSP库至工程并应用。1.首先确定DSP库位置,注意是GCC文件夹而不是ARM。D:\STM32Cube\Repository\STM32Cube_FW_L4_V1.16.0\Drivers\CMSIS\DSP\Lib\GCC2.在工程中创建DSP文件夹和DSP\Include3.将libarm_cortexM4lf_math.a拷入DSP文件夹;将D:\STM32Cube\Repositoryhttps://blog.csdn.net/jinhuiyu0403/article/details/108007400

你可能感兴趣的:(STM32,stm32,freertos)