关于stm32中断处理函数的解读

关于stm32中断处理函数的解读,第1张

楼上的回答纯粹胡闹,
extern "C",听我解释。
我们的C语言有个进化版,叫C++,这个想必楼主知道,Keil MDK是支持C++编程的,也就是说,你可以用C语言或者C++写你的程序,都可以。
但是,有一个问题,就是头文件的问题,C语言写的头文件C++是不认识的,需要转换一下,这个转换的方法就是加上extern "C"
#ifdef __cplusplus
extern "C" {

这句话意思是,如果你定义了“__cplusplus”这个宏,说明你的意图是想在C++文件中调用这个头文件,我前头说了,C语言的头文件C++是不认识的,怎么办呢,就加上
extern "C" {。。。。。}
告诉C++文件,大括号里面的东西是用C语言写的,然后C++文件就认识了,就能调用这个头文件里的东西了,
extern "C" {

的存在,使得C语言和C++能更好的结合的一块。
以上是个人的实践心得,回答完毕!

在启动文件中,可以找到
startup_stm32f10x_hds
你看看你用的那个
中断
什么中断

用的什么类型的stm32
在启动文件中很容易找到

void EXTI4_IRQHandler(void)//外部中断4
{
if(EXTI_GetITStatus(EXTI_Line4)!= RESET){//发生了中断
EXTI_ClearITPendingBit(EXTI_Line4);//清除中断标志位
if(Ledflag == 0){
Ledflag = 1;//LED标志取反
GPIOC->ODR |= 0X00000080;//GPIOC7输出高电平
}
else{
Ledflag = 0; //LED标志取反
GPIOC->ODR &= 0XFFFFFF7F;//GPIOC7输出低电平
}
}
}
两个中断的处理函数不一定分别在两个子函数中写。如果两个中断没共用一个中断号,就是分开写,如果共用了中断号,就只写一个。

SysTick是arm处理器中一个24位的系统计时器,向下递减,主要用于系统节拍数的计算,stm32使用的也是arm的处理器
它的中断函数叫
void SysTick_Handler(void)

本次课程中,与中断相关的中断服务函数写在stm32f4xx_itc这个库文件中。中断服务函数我们统一写在stm32f4xx_itc这个库文件中。关于中断服务函数的函数名必须跟启动文件里面预先设置的一样。

先设置定时器TIM2的运行参数,然后启动定时器TIM2开始计时。
TIM2_IRQHandler的名字是固定的,不能改,中断处理代码必须写在这个函数下。中断发生时,硬件库自动调用这个中断函数。

实验室项目需要使用STM32开发,Hal库的资料相对较少,关于UART中断与之前使用飞思卡尔芯片的中断不同。
首先在CubeMX中配置好UART中断;重点是:需要在主循环之前手动开启接收中断:

只有手动开启之后才能进入中断。
此外,HAL库中,无论何种类型的UART中断,都会进入:

在此函数中判断具体是何种中断,再调用相应的中断服务函数,接收中断是:

而此函数会调用:

最需要注意的一点是:
在回调函数最后需要再次开启中断!!否则只能执行一次!!

个人理解 这里将中断服务设置为等待模式 等待接收字符。
在Keil中进行断点调试 发现接受字符后会首先进入

HAL_UART_IRQHandler
函数,而不是直接进入 UART_Receive_IT 函数进行处理
相当于UART中断服务程序有一个统一入口
HAL_UART_Receive_IT(&huart1, (uint8_t )aRxBuffer, 1) 语句相当于打开这个入口,经测试如果去掉这句的话,再发送字符是不会进入HAL_UART_IRQHandler语句的。

刚开始接触STM32与HAL库函数,理解肯定不是很到位。
参考自:
>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13215078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存