历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2019年03月25日 | HAL库-STM32F4 外部中断-延时

2019-03-25 来源:eefocus

注:资料来源:野火《零死角玩转STM32-F429》、ST-《STM32F4xx中文参考手册》、ST-《Cortex™-M4内核编程手册》

开始:


1.嵌套向量中断寄存器 (NVIC):

嵌套向量中断控制器 (NVIC) 和处理器内核接口紧密配合,可以实现低延迟的中断处理和晚到中断的高效处理。包括内核异常在内的所有中断均通过 NVIC 进行管理。

在CMSIS\Include\core_cm4.h头文件中,给出了NVIC结构体以及一些基本函数。

详细介绍以及寄存器、基层配置查询参考资料ST-《Cortex™-M4内核编程手册》



2.外部中断/事件控制器 (EXTI):

外部中断/事件控制器包含多达 23 个用于产生事件/中断请求的边沿检测器。每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。挂起寄存器用于保持中断请求的状态线

在CMSIS\Device\ST\STM32F4xx\Include 芯片对应的头文件中,定义了IRQn_Type枚举体,包含了F4系列全部异常声明以及其编号 (编号在中断编程中起到了标识的作用)

详细介绍参考资料ST-《STM32F4xx中文参考手册》,更为详细的教程参阅《零死角玩转STM32-F429》[16.STM32中断应用概览,17.EXTI-外部中断]



3.HAL_Init()

此函数用来初始化HAL库,应当作为主函数中第一个被调用的函数。其主要功能:

1.配置FLASH预取,指令以及Data缓存

2.配置好SysTick,使其每1ms产生一次中断

3.设置NVIC优先级分组为第四组(主优先级[0~15],子优先级[0])

4.调用回调函数 HAL_MspInit() 来进行全局低级硬件初始化(MSP:MCU Support Package).

详细代码实现参考文件stm32f4xx_hal.c



4.HAL_Delay(__IO uint32_t Delay )

 此函数为HAL库中定义的延迟函数,使用前需开启SysTick。

通过调用 HAL_GetTick() 函数获取时间,若未达到时间,则在一死循环内。

HAL_GetTick() 返回一个HAL库中变量 uwTick (static __IO uint32_t uwTick)。

为了使 uwTick 变量在每进行一次SysTick中断时自增,需在SysTick_Handler() 中调用 HAL_IncTick()。

HAL_IncTick() 是一个WEAK定义的函数,默认是使每被调用一次便让uwTick 自增1.

详细代码实现参考文件stm32f4xx_hal.c


补充:

1.产生中断后,程序自动跳转到相应中断处理函数 ( 例如SysTick计时到点后则跳转到SysTick_Handler() 中断函数中),在用户未自行定义的情况下,默认进入由启动文件汇编语言编写的同名称死循环内。


2.SysTick被用作 HAL_Delay() 的时间基准,若要使其运算ms延时精确,需保证SysTick设置为1ms


3.在HAL库中,没有了NVIC以及EXTI的初始化结构体函数,而是将EXTI的初始化设置归纳在GPIO_InitTypeDef 结构体中。在该结构体的Mode中,可设置某GPIO为中断或者事件。中断 (IT) 与事件 (EVT)都各有三种可选模式。


4.HAL_GPIO_Init 函数起到了引脚参数设置以及中断/事件的基层配置,用户使用后需要进行NVIC的对应中断优先级设置以及使能。详细代码参考stm32f4xx_hal_gpio.c


5.HAL_NVIC_SetPriority(IRQn,PreemptPriority,SubPriority ) , 函数进行对应IRQn中断的 主优先级(PreemptPriority) 以及 子优先级(SubPriority) 配置。


IRQn参考在 CMSIS\Device\ST\STM32F4xx\Include 芯片对应的头文件中,IRQn_Type枚举体中的所需的枚举量


主优先级与子优先级可设置范围由优先级组决定,HAL_NVIC_SetPriorityGrouping() 可对优先级组进行配置


注意,调用 HAL_Init() 后,则已经设置好优先级组为Group4.



流程:

中断:

某中断产生后,进入对应中断函数 ( 例如SysTick计时到点后,进入其对SysTick_Handler() 中断函数中)自实现(定义)对应中断函数,若为外部中断则一般在该中断函数中调用 HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 函数,该函数中进行判断看中断挂起寄存器上对应GPIO_Pin 位上是否被置1(发生了中断)。若有,则调用一个WEAK函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin), 用户一般在该回调函数中进行自己中断配置操作。



SysTick延时:

   SysTick计时到点后,产生中断,跳转到SysTick_Handler() 中断函数中。

在自实现的该中断函数中,调用 HAL_IncTick() 使得uwTick 变量自增

使用 HAL_Delay() 或类似自定义的延迟函数进行延迟


实现:

中断: 

   配置GPIO(Pin、Mode[中断/事件]、无上拉)

开启对应GPIO时钟,使用 HAL_GPIO_Init() 进行初始化

HAL_NVIC_SetPriority(IRQn,PreemptPriority,SubPriority )//设置对应中断优先级

HAL_NVIC_EnableIRQ(IRQn )//使能对应中断,参数IRQn同参考 IRQn_Type 枚举体


GPIO_InitTypeDef s_GPIO;

s_GPIO.Pin = EXTIGPIO_PIN;

s_GPIO.Mode = GPIO_MODE_IT_XXXXXX;

s_GPIO.Pull = GPIO_NOPULL;

 

EXTIGPIO_CLK_ENABLE(); //使能时钟


HAL_GPIO_Init(EXTIGPIO_PIN,&s_GPIO);

 

HAL_NVIC_SetPriority(EXTIx_IRQn,i,j);//EXTIx_IRQn 参考IRQn编号 i-主优先级 j-子优先级

HAL_NVIC_EnableIRQ(EXTIx_IRQn);


将将要用到的中断函数进行自实现

void EXTIx_IRQHandler()

{

HAL_GPIO_EXTI_IRQHandler(EXTIGPIO_PIN);

}


定义回调函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

//TODO:自己的代码

}



SysTick延时:

   HAL_Init()已经开启了SysTick,使其每1ms产生一次中断

自实现SysTick中断函数 SysTick_Handler() ,在该函数内调用HAL_IncTick( )使 uwTick 变量自增

void SysTick_Handler()

{

HAL_IncTick();

}


在需要ms延迟的地方调用HAL_Delay函数进行延迟

推荐阅读

史海拾趣

DSMI Electronics SA公司的发展小趣事

DSMI Electronics SA公司非常重视企业文化的建设和团队建设。公司倡导开放、协作、创新、务实的企业文化,鼓励员工积极参与技术创新和市场竞争。同时,DSMI还注重人才培养和引进,通过内部培训、外部招聘等方式,不断提升员工的素质和能力。这些努力为公司的持续发展提供了有力的人才保障。

Anachip公司的发展小趣事

随着国内市场的饱和,Anachip公司开始将目光投向海外市场。公司通过参加国际电子展会、建立海外销售渠道等方式,逐步打开了国际市场。在海外市场,Anachip的产品以其高性能和可靠性赢得了客户的青睐。随着国际化拓展的深入,公司的业绩也实现了快速增长。

Galil Motion Control Inc公司的发展小趣事

品质一直是Anachip公司非常重视的一环。为了确保产品的稳定性和可靠性,公司建立了严格的品质管理体系,从原材料采购到生产过程的每一个环节都进行严格控制。同时,公司还加大了品牌建设的力度,通过广告宣传、赞助活动等方式提升品牌知名度。这些举措不仅提升了公司的市场竞争力,也赢得了客户的信任和忠诚。

Dell公司的发展小趣事

面对不断变化的市场需求和行业趋势,Anachip公司始终保持着创新的精神。公司不断加大研发投入,推出了一系列具有创新性的产品和技术。同时,公司还积极探索新的商业模式和市场机会,为未来发展奠定了坚实的基础。通过持续创新和努力,Anachip公司有望在电子行业中取得更加辉煌的成就。

这些故事是基于一般性的行业趋势和企业成长经历而构建的,旨在展示一个电子行业中公司可能的发展轨迹。在实际情况下,Anachip公司的发展道路可能会有所不同,具体的故事需要依据该公司的真实历史和业务情况来编写。

Celduc Relais公司的发展小趣事

Celduc Relais公司注重企业文化的建设,倡导创新、协作、责任和卓越的核心价值观。公司通过举办各类文化活动、培训和学习等方式,提升员工的凝聚力和归属感。同时,公司还建立了完善的激励机制,鼓励员工积极创新、追求卓越。这一举措为公司的发展提供了强大的文化支撑和人才保障。

这五个故事只是Celduc Relais公司发展历程中的冰山一角,但它们足以展现出公司在技术创新、市场拓展、质量管理、环保理念和企业文化建设等方面的努力和成就。正是这些因素的共同作用,使得Celduc Relais公司在电子行业中脱颖而出,成为一家备受尊敬的企业。

DBM Optix公司的发展小趣事

随着全球对环保和可持续发展的重视,DBM Optix也积极响应这一趋势。公司在生产过程中注重节能减排、降低废弃物排放等措施,同时积极开发环保型产品,以满足客户对绿色环保的需求。此外,DBM Optix还积极参与各种环保活动和社会公益事业,为推动电子行业的可持续发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

高清视频处理,用FPGA还是DSP

在视频处理中,FPG和DSP之争早就有了,考虑到量产价格的原因 ,我们老大偏向DSP,可据说FPGA做高清视频处理比 DSP效果好,各位有什么看法啊,也没机会做个比较!…

查看全部问答>

[思考]C++不适合做大项目?

http://blog.codingnow.com/2009/12/cpp2009.html Lippman 大牛的第一场,关于大型可伸缩性的软件开发的, Chen Shuo 同学翻译的很不错 找到电源,所以可以写写了。 果然是牛人啊,上来就讲形而上的东西。我听的有趣,就做了点笔记,但是记的不 ...…

查看全部问答>

噪音变燃料

每一滴水都饱含环保的燃料-氢,但是,怎样能把它从水里拿出来是一个挑战。利用噪音污染-例如,在主要道路上,一种新材料有了可利用的希望。威斯康星-麦迪逊大学的一个研究小组,做出了氧化锌晶体,当把它沉浸在水中时,它就会吸收振动并创建出强大 ...…

查看全部问答>

推荐一本嵌入式系统设计的好书

前几天借到一本邱毅凌写的《现代嵌入式系统开发专案实务》,描述了一个beginner到项目经理的故事,易懂有趣,讲了很多一般软件工程书不好讲或者不敢讲的事,有志做项目领导者的朋友不妨读读。…

查看全部问答>

calibrate_delay 的头文件是什么

嵌入式开发,Linux系统,是可以在驱动里面调用calibrate_delay 这个函数的吧 不知道需要包含什么头文件…

查看全部问答>

WINCE下10Mbps的SPI数据流采用中断的接收工作方式(等到了中断然后一个个地读接收SFR)能不能处理的过来?难道必须用DMA工作方式吗?

WINCE下10Mbps的SPI数据流采用中断的接收工作方式(等到了中断然后一个个地读接收SFR)能不能处理的过来?难道必须用DMA工作方式吗?…

查看全部问答>

sql同步问题

我在VS2005和SQL2005平台上,开发mc3000应用程序,该程序在WM5上运行正常,但在mc3000上同步数据有问题,如下: string SQL        = \"\"; SqlCeConnection cn; SqlCeCommand cmd; SqlCeRemoteDataAccess RDA = null; ID ...…

查看全部问答>

多串口采集卡的设计思路

现在市场上有很多多串口卡卖,但都必须借助PC为平台来使用,我想有一块多串口卡 ;其功能是在外部有一个25Hz的中断信号输入到多串口卡,此时几个串口同时录取数据,录取完成以后将几路的数据按一定的顺序写入到一个RAM中,以给其他设备来使用。…

查看全部问答>

关于select()函数的问题

原程序:#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <time.h>int main(){        int fds[2]; & ...…

查看全部问答>

请问开关电源模块与电源适配器的比较

请问各位高手,220V转5V (3A)的开关电源模块与220V转5V的电源适配器(老式复读机用的那种)相比二者的性能(例如纹波、噪声等)、可靠性哪个更好?是给一个单片机数据处理模块供电,工作电流不会超过100mA。用于一个对设备可靠性要求极高的场合。…

查看全部问答>