在HAL库中用定时器实现自定义延时函数delay_us()

发布时间:2024-03-18  

STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有微秒级延时delay_us(),本文就在HAL库中用定时器实现这个delay_us()。

如下图,找到HAL_Delay()函数定义的地方,发现这个函数有__weak标识,是一个弱化函数,可以被重写。

3d7cb228-2f57-11ed-ba43-dac502259ad0.png

由于HAL库许多地方都使用了HAL_Delay()函数,为了避免惹麻烦建议不重写,可以用定时器自己写一个延时函数。

开发软件用的STM32CubeIDE,此Cube软件的使用方法可以参考这篇文章:STM32外部中断实例。

项目设置,勾选后每个外设的源文件.c、头文件.h分别成双出现。

3d9ce480-2f57-11ed-ba43-dac502259ad0.png

我用的是ISP编程,选择的是Serial Wire。

3db61ea0-2f57-11ed-ba43-dac502259ad0.png

配置外部高速时钟。

3dcaba90-2f57-11ed-ba43-dac502259ad0.png

为了观察效果,开一个LED,它在PC0管脚,低电平点亮。

3ddfd0e2-2f57-11ed-ba43-dac502259ad0.png

3df15600-2f57-11ed-ba43-dac502259ad0.png

本实例用到了TIM7,它挂在APB1上,时钟为72MHz。

3e05c11c-2f57-11ed-ba43-dac502259ad0.png

激活TIM7,设置如下:

预分频PSC为71,分频后TIM7时钟为72/(71+1)=1MHz

计数模式为向上

计数周期为1,就是说定时器一个周期后就溢出了,而定时器一个周期的时间是定时器时钟频率的倒数,1/1M,也就是1us。

3e20df74-2f57-11ed-ba43-dac502259ad0.png

生成代码。

3e382fa8-2f57-11ed-ba43-dac502259ad0.png

在tim.c的用户代码区添加如下代码。

3e4a4242-2f57-11ed-ba43-dac502259ad0.png

在tim.h的user code处添加如下引用代码,其中HAL_Delay_us()是微秒级延时函数,HAL_Delay_ms()是毫秒级延时函数。

3e64afb0-2f57-11ed-ba43-dac502259ad0.png

main.c中添加如下代码,测试效果。

3e741900-2f57-11ed-ba43-dac502259ad0.png

上面代码连续用了13个延时函数,是为了凑够1秒方便观察。另外延时函数的参数是uint16_t,无符号短整型,数值范围为0~65535,数值超限会报错,如下图。

3e8d02ee-2f57-11ed-ba43-dac502259ad0.png

编译代码。

3ead946e-2f57-11ed-ba43-dac502259ad0.png

下载到开发板可以看到LED每秒亮一次,STM32CubeIDE软件生成hex文件的方式,请移步此文:STM32单片机中Hex、Bin文件的区别与应用。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    //定义单片机的一些特殊功能寄存器sbit led=P2^0; //定义指定LED灯的管脚 void delay(unsigned int i) //延时函数。unsigned......
    ;//第一个灯亮 delay();//调用延时函数 P3=0xfd;//第二个灯亮 delay();//调用延时函数 P3=0xfb;//第三个灯亮 delay();//调用延时函数 P3......
    LED闪烁(2024-08-16)
    代码 #include 'reg52.h' typedef unsigned int u16; sbit ledD1=P2^0; //P20      void delay(u16 i) //延时函数......
    led流水灯(2024-08-16)
    ledD7=P2^6; sbit ledD8=P2^7;//P27 void delay(u16 i) //延时函数 {     while(i--)     {         //什么......
    8051单片机的寄存器定义头文件 void delay(unsigned int i);  // 声明延时函数 char LED; // 定义一个字符变量LED,用于存储LED灯的状态 void main......
    机寄存器定义的头文件 /************************************************** 函数功能:延时函数延时一段时间 ***************************************************/ void delay(void......
    DELAYA ;然后继续执行下一个延时 AJMP MAIN ;这里又是一个跳转指令,跳回到main标号中,就相当于是不断的重复执行这里面的代码了 DELAY: MOV R7,#255 ;这是延时函数......
    /******************************************************************************* * 函 数 名         : delay * 函数功能    : 延时函数,i=1时,大约延时10us......
    ; } #ifndef __KEY_H__ #define __KEY_H__ unsigned char Key(); #endif 3.2 延时函数 void Delay(unsigned int......
    延时函数delay的一点疑问;延时函数delay的一点疑问 void main() {                while(1......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>