没踩过的STM32 HAL库的那些坑_hal库哪些坑-程序员宅基地

技术标签: stm32单片机开发  stm32  嵌入式  单片机  

一.前言

STM32 hal库很好用,但是也有一些坑,这里把网上网友遇到的各种坑预先记录一下,方便自己和各位小伙伴避避坑。

二.那些没踩过的坑

1.无法使用CMSIS-DAP下载器或者JTAG下载器给单片机烧录程序

产生这个原因是因为STM32 cubeMX生成的工程里默认没有配置DAT下载器或者JTAG下载器所使用到的SWDIO引脚和SWCLK引脚,因此造成无法下载程序,解决办法也很简单,在使用cubeMX生成工程之前,设置如下选项即可,把Debug模式从disable改成
Serial Wire。这样cubeMX生成的代码就会自动设置下载器用到的两个引脚了。
在这里插入图片描述

改成Serial Wire模式之后,便可以看到下载用到的两个引脚已经被设置了,如下图所示:
在这里插入图片描述
其实这个坑也有一个更加直接的解决办法,就是直接用官方的ST-LINK来给单片机下载程序,那么就不会存在这个问题。

2.使用硬件I2C会有bug

产生这个的原因是因为cubeMX生成的代码中,会把打开I2C时钟的代码_HAL_I2C_RCC_CLK_ENABLE()放到GPIO初始化代码HAL_GPIO_Init()代码之后,这样是不可以的。必须把_HAL_I2C_RCC_CLK_ENABLE()放到HAL_GPIO_Init()前面,如下图。
在这里插入图片描述
注: 坑1和坑2是博主mculover666发现的。我这里作了引用和总结。这里附上原文

3.标准库和hal库关于SUCCESS和ERROR的定义不一样

无论是标准库还是hal库,在stm32fxxx.h文件中(比如stm32f1xx.h或者是stm32f4xx.h)都会定义SUCCESS和ERROR这两个宏,但是:
在标准库中,SUCCESS=1,ERROR=0
在hal库中, SUCCESS = 0,ERROR = 1
在将程序从标准库迁移到hal库的时候尤其要注意这个。

注:本坑出处

4. HAL_Delay()函数锁死

HAL_Delay函数用的是中断延时,当程序中存在多个中断时,容易锁死,需要慎用。
如果在中断服务程序里面调用延迟函数 HAL_Delay 要特别注意,因为这个函数的时间基准是基于滴答定时器或者其他通用定时器实现,实现方式是滴答定时器或者其他通用定时器里面做了个变量计数。如此一来,结果是显而易见的,如果其他中断服务程序调用了此函数,且中断优先级高于滴答定时器,会导致滴答定时器中断服务程序一直得不到执行(即变量计数值无法递减0,导致HAL_Delay函数无法执行完),从而卡死在里面。所以滴答定时器的中断优先级一定要比它们高。
一句话总结就是,调用HAL_Delay函数的中断服务函数的中断优先级必须低于滴答定时器的优先级或者低于HAL_Delay函数使用的定时器的优先级。

5. 移植问题

虽然hal库号称容易移植,但是不同系列芯片之间存在寄存器命名不统一、函数接口不统一等问题。可能会导致更新固件编译不通过,芯片间移植不顺畅等问题。

6. 串口自动关中断

hal库的串口用起来有时候会出问题。hal库据说在接收一个数据之后,便会自动把中断关掉,需要自己重新打开中断才可以。还有串口容易锁死。不知道串口的这些问题怎样才能避免,有小伙伴知道的欢迎在评论区指出或者放出文章链接,非常感谢!

三.使用注意事项

1.例程少,有的例程的编写风格和cubeMX软件生成的风格差异太大。
2.确保常用大部分功能都用Hal实现,尽量不要自己单独写寄存器,如果完全采用Hal编程一般没什么问题。如果混用就有可能出问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42409052/article/details/105891919

智能推荐

MaxCompute|Python 3 环境配置方法_python maxcompute-程序员宅基地

文章浏览阅读471次。MaxCompute Python 3 环境配置方法_python maxcompute

MySQL的存储引擎(InnoDB与MyISAM)_myisam的底层存储结构-程序员宅基地

文章浏览阅读2.5k次,点赞22次,收藏28次。Mysql 底层数据引擎以插件形式设计,最常见的是 Innodb 引擎和 Myisam 引擎,用户可以根据个人需求选择不同的引擎作为 Mysql 数据表的底层引擎。MyISAM 存储引擎是 MySQL 中常见的存储引擎,虽然性能极佳, 拥有较高的插入,查询速度,但却不支持事务处理(transaction),不支持外键。曾(MySQL 5.5及之前版本)是 MySQL 的默认存储引擎。InnoDB 存储引擎是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,事务型数据库的首选引擎_myisam的底层存储结构

ASP.NET MVC 5 中使用Frameset中Session、Cookie值消失的问题完整解决方案_asp.net iis http cookie 丢失-程序员宅基地

文章浏览阅读750次。前言最近这段时间在做一个项目,由于赶时间,我先完成其他的,对于相对麻烦的,就放到最后来完成。所有的事都完成了,但却有一个比较麻烦的事还一直没解决。就是在ASP.NET MVC 5中所使用的Session和Cookie。登录时赋值,然后在其他地方根本无法读取值,读出来的值全是空的。查遍所有网上资料,没有一个解决的。下面列举网络资料解决方案:只需要设置 P3P HTTP Header,基本_asp.net iis http cookie 丢失

MongoDB6 安装教程_an error occurred while loading instance info: inv-程序员宅基地

文章浏览阅读3.7k次,点赞7次,收藏17次。MongoDB6的安装和配置_an error occurred while loading instance info: invalid utf-8 st

前端将DOM转为图片并保存_dom-to-image生成图片保存到本地-程序员宅基地

文章浏览阅读1.2k次。dom-to-image与html2canvas相比,dom-to-image支持带滚动条的节点,但是在移动端的兼容性较差,因为现在做的是PC端的项目而且有虚拟表格所以选择了dom-to-image,大家看场景自由选择~_dom-to-image生成图片保存到本地

tensor多维向量的简单理解-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏15次。tensor是Tensorflow中最基础的数据结构,常常翻译为张量,可以理解为n维数组或矩阵,相关函数:constant(value, dtype=None, shape=None, name='Const', verify_shape=False)三维方向定义,适用于2维和3维0、零维张量import tensorflow as tf#零维张量const0 = tf.constant(1, tf.float16)print(const0)运行结果:.._多维向量

随便推点

【网络同步】浅析帧同步和状态同步_帧同步如何保证客户端同步-程序员宅基地

文章浏览阅读1k次。谈到网络游戏,不可避免要谈到现有两种比较常见的网游同步技术:帧同步和状态同步说到这两个名词,大家夸夸奇谈,都能讲上些许自己的见解,我反正啥也不懂这篇文章就打算着重学习一下这两种技术的基础和原理网络同步的目标就是时刻保证多台机器的游戏表现完全一致。网络同步 = 实时的多端数据同步+实时的多端表现同步战斗逻辑是包括技能逻辑、普攻、属性、伤害、移动、AI、检测、碰撞等等的一系列内容,这常常也被视为游戏开发过程中最难的部分。网络同步按大类来分有两种做法:状态同步和帧同步。_帧同步如何保证客户端同步

酱茄Free开源版WordPress小程序新增文章置顶功能 并提供源码下载_酱茄free小程序源码-程序员宅基地

文章浏览阅读323次。酱茄开源版WordPress小程序又迎来了一次小更新,这个版本主要新增文章置顶功能,并修复首页列表文章显示问题。2020.9. 29 V1.2.01、新增文章置顶功能;2、修复首页列表文章显示问题;3、其他已知细节。WordPress小程序源码下载:www.jiangqie.com/ky安装文档:www.jiangqie.com/docs..._酱茄free小程序源码

python读取yaml格式配置文件_python 获取yaml数据库配置文件-程序员宅基地

文章浏览阅读449次。yaml文件内容:LOGIN: url: "http://xxx:8080/login/" data: {"username":"jike2021","password":get_md5("12345qwert")} user: tester: 'jike' age: 18 bl: 'true' f: 1.2 l: [1,2,3,4,'a']读取配置文件代码:import yamlclass Handler_Yaml():_python 获取yaml数据库配置文件

wepy/mpvue/taro/uni-app,小程序开发框架哪家强?-程序员宅基地

文章浏览阅读644次。微信小程序如火如荼,各家小程序快速跟进,继App、H5之后,小程序平台已跃升为第三大流量平台,那现阶段快速开发小程序的更优方案是什么?选择原生开发,还是借助跨端框架?每个框架又有何差异?本文经授权转载,如下为原文,enjoy!之前 Taro 团队发布了一篇《小程序多端框架全面测评》,让开发者对业界主流的跨端框架,有了初步认识。感谢 Taro 团队的付出。不过横评这件事,要想得到更精确的结..._weui和uniapp相比

使用sudo apt-get update报错:E: 无法下载 http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/dists/xenial/main/b_sudo apt-get update无法下载-程序员宅基地

文章浏览阅读1.4w次,点赞17次,收藏84次。E: 无法下载 http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/dists/xenial/main/binary-amd64/Packages 404 Not Found [IP: 101.6.15.130 80]E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。原因分析:源的问题,更换源先备份源文件修改源文件将内容替换成保存即可,重新运行sudo apt-get update本教程使用的是ubuntu18.04,其他版本清参_sudo apt-get update无法下载

【通过URL获取目标服务器信息介绍】_怎么从url中获取到ip地址-程序员宅基地

文章浏览阅读3.5k次。客户端再向顶级域DNS服务器发起查询请求,顶级域DNS服务器再返回二级域DNS服务器的IP地址。URL中的域名需要先经过域名解析,将其转换为对应的IP地址。获取到目标服务器的IP地址后,需要进行端口扫描,以获取目标服务器开放的端口号。例如,根据URL获取目标服务器的IP地址和端口号后,可以将其添加到防火墙的白名单中,限制对该服务器的访问。通过获取目标服务器的IP地址和端口号,可以与目标服务器建立网络连接并进行相应的网络操作。最终,客户端与负责域名解析的DNS服务器进行通信,获取到目标服务器的IP地址。_怎么从url中获取到ip地址

推荐文章

热门文章

相关标签