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<stdio.h>#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset 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设置的截图:

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

STM32CubeIDE+FREERTOS踩坑记录相关推荐

  1. 又一次移植最新lvgl8到esp32的踩坑记录

    又一次移植最新lvgl8到esp32的踩坑记录 一.创建工程 1.在vscode新建esp32工程 2.添加lvgl最新版本的相关仓库代码 3.创建lv_conf.h 4.修改main.c 5.配置和 ...

  2. 为Jupyter notebook配置R kernel过程及踩坑记录

    为Jupyter notebook配置R kernel过程及踩坑记录 注意:本文为作者安装过程及折腾的过程,内容比较冗杂,如果读者想直接创建一个属于自己的子环境则参考: 如下文章: anaconda下 ...

  3. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  4. TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...

  5. 使用Java读取 “Python写入redis” 的数据踩坑记录

    https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...

  6. osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落

    前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...

  7. vue-i18n使用及踩坑记录

    使用步骤 1. 安装 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from 'vue' import VueI18n from ' ...

  8. SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

    SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity.dao. ...

  9. mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...

最新文章

  1. php处理微信返回xml数据,php将微信返回的xml格式转换成数组
  2. python代码需要背吗-纠结应该先学Python还是Java?看完就有数了
  3. 【版本更新】Aspose.Slides V17.10发布 | 支持免费下载
  4. php中怎么让主键自增长,在数据库设计中,无论如何也该设计一个自增ID字段作为主键吗?...
  5. 比较全的C语言面试题
  6. android调用fragment的方法,AndroidX下使用Activity和Fragment的变化
  7. 理论基础 —— 索引 —— B 树、B+ 树与 B* 树
  8. HDOJ 4302 Holedox Eating (multiset || 线段树)
  9. 【物流选址】基于matlab粒子群算法求解多物流中心选址问题【含Matlab源码 1458期】
  10. 三次握手时,客户端发送的 SYN 报文为什么会被丢弃?
  11. 实现app第一次安装浮层引导View!
  12. 认知电子战 (1.1):传统电子战
  13. vue 使用正则判断邮箱格式是否正确 手机号 证件啥的都可以套用
  14. C#编程_实现简易的任务管理器
  15. 微软开源在线代码编辑器,编辑器天花板之Monaco Editor
  16. Android开发交流群
  17. tiri单片机_51单片机的SCON寄存器与C程序解析
  18. 国产荔枝糖FPGA开发板实现FM发射
  19. android 360加固 反编译,[原创]逆向360加固等dex被隐藏的APK
  20. heic格式的图片怎么转换为jpg格式?

热门文章

  1. 华为电脑怎么把虚拟化打开_电脑怎么在bios开启虚拟化?
  2. php知识星球,解锁知识星球企业认证功能?重点看这6点
  3. 数模【数据的拟合方法-总结】【温度与电阻的关系模型、农业生产实验模型、血药浓度模型、化工氯气生产等级模型、人口预测模型】
  4. Android 自定义键盘 随机键盘
  5. 经济学原理上中国故事2019尔雅满分答案
  6. mac卸载软件怎么卸载干净?详细方法教程分享
  7. 爬取街拍图片_如何拍摄好街拍照片
  8. Java注解处理器使用详解
  9. Yolov3中xmin,ymin,xmax,ymax的疑惑
  10. 深入学术研究,物理学家用VR演示弦理论猜想