没踩过的STM32 HAL库的那些坑_hal库i2c有bug吗-程序员宅基地

技术标签: 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

智能推荐

解决AndroidStudio控制台输出乱码_androidstudop 控制台中文乱码-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏3次。方法一:Help——>Edit Custom VM Options在最后一行换行加上:(不要漏掉符号,加好之后重启AndroidStudio)-Dfile.encoding=UTF-8注意事项:(提前在项目中选择show inexplorer,因为这个文件有可能引起AS启动不了,出现了删除掉测试第二种方式即可)方法二:如果不行的话请试试在项目gradle里加上:tasks.withType(JavaCompile) {options.encoding = "UTF-8"}.._androidstudop 控制台中文乱码

shell排序算法的C/C++实现_c++shell排序代码-程序员宅基地

文章浏览阅读2.7k次。主要是递归过程每次改变步长d,初始d为数组的长度的一半,每次减少一半。#include /* Name: Copyright: Author: @dujianjian Date: 28/10/12 20:29 Description: shell排序 */void shellsort(int a[],int left,int right){_c++shell排序代码

CSS01_class中添加多个类名-程序员宅基地

文章浏览阅读1.9k次。css语法的声明块css的注释快捷键为crtl+/;主要注释不可以嵌套使用。_class中添加多个类名

无人驾驶运动控制(二):模型预测控制_无人驾驶车辆模型预测控制-程序员宅基地

本文介绍了无人驾驶运动控制中的模型预测控制的基本概念、特点和数学公式,并推导了基于状态空间方程的控制量模型预测控制、控制增量模型预测控制。

CentOS6.5下安装Scrapy_python3.7.5在centos6.5下安装scrapy-程序员宅基地

文章浏览阅读1.5k次。http://www.cnblogs.com/xiaoruoen/archive/2013/02/27/2933854.htmlCentos下安装ScrapyScrapy是一个开源的机遇twisted框架的python的单机爬虫,该爬虫实际上包含大多数网页抓取的工具包,用于爬虫下载端以及抽取端。安装环境: centos6.5python2.7.3 _python3.7.5在centos6.5下安装scrapy

物联网技术,主要包括哪些核心技术_物联网关键技术-程序员宅基地

文章浏览阅读2.9w次,点赞7次,收藏47次。物联网的关键技术有识别和感知技术,网络与通信技术,数据挖掘与融合技术。1.识别和感知技术最常见的就是生活的的二维码了。通过二维码,我们可以和图片,网址,软件,整个世界联系起来。2.网络与通信技术包括短距离无线通信技术和远程通信技术。短距离无线通信技术包括NFC(手机给公交卡充值),蓝牙,WiFi,RFID(公交卡)等。远程通信技术包括互联网,2G/3G/4G移动通信网络,卫星通信网络等。..._物联网关键技术

随便推点

2021CVPR GAN论文学习_gan论文cvpr2021-程序员宅基地

文章浏览阅读695次。Encoding in Style: a StyleGAN Encoder for Image-to-Image Translationhttps://arxiv.org/pdf/2008.00951.pdfhttps://github.com/eladrich/pixel2style2pixel_gan论文cvpr2021

SDN核心技术OpenFlow_sdn openflow技术-程序员宅基地

文章浏览阅读1.7k次。SDN核心技术OpenFlow:OpenFlow是由斯坦福大学的Nick McKeown教授在2008年4月ACM Communications Review上发表的一篇论文OpenFlow: enabling innovation in campus networks首先详细论述了OpenFlow的原理。1 OpenFlow简介OpenFlow是由斯坦福大学的Nick McK_sdn openflow技术

leetcode 495.提莫攻击-程序员宅基地

文章浏览阅读101次。题目描述:在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。思路分析:可以一步一步计算他的中毒时间,这是简单的解法还可以计算他中毒了多少次,然后减去被覆盖的时间(比如第一秒中毒,持续五秒,但是第二秒又中毒了,那么就相当于第二次被覆盖了四秒)java代码实现:

Java学习随记4——集合-程序员宅基地

文章浏览阅读83次。Java学习随记4——集合与数组的区别:数组长度不能发生改变。ArrayList类散记:ArrayList<E>中,<E>表示的是该类是泛型,泛型只能是引用类型,不能是基本类型;对于ArrayList集合来说直接打印得到内容而非地址值,如果内容为空,则输出“[ ]”;常用方法:如果需要向ArrayList集合存储基本类型,必须使用相对应的包装类;...

HTML标签元素单词释义及知识点总结_html 标签 单词-程序员宅基地

文章浏览阅读1.3k次,点赞5次,收藏31次。HTML标签元素单词释义及知识点总结一.说明该内容为本人自学HTML所记笔记,如有不准确的地方欢迎各位品评指正,希望对需要的人有所帮助,谢谢。二.基本标签块级元素:div;p;dl;form;h1~h6;ol;ul行内元素:a;b;i;em;img;span(pre是块级元素但只能包含文本或行内元素)三.css样式和选择器选择器空格 后代选择器 .main..._html 标签 单词

规则引擎 Easy rule 使用总结-程序员宅基地

文章浏览阅读8k次,点赞9次,收藏16次。easy Rule就是一个轻量级的规则引擎,它可以直接注入spring bean类,可以查看github上对它的介绍:https://github.com/j-easy/easy-rules easy rules是一个简单而强大的java规则引擎,它有以下特性:轻量级框架 学习成本低 基于POJO 为定义业务引擎提供有用的抽象和简便的应用 从原始的规则组合成复杂的规则它主要包括几个主要的类或接口:Rule,RulesEngine,RuleListener,Facts还有..._easy rule