完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在学习stm32 定时器中断时,发现我写的程序进入不了中断服务程序,而且我也没找到定时器服务程序的注册入口,上网查了一下,大家都使用的都是下面这个函数:void TIM3_IRQHandler(void),那为什么其他人的中断程序可以执行,而我的却执行不了呢。
经过请教得知,我的工程中没有包含该一个叫做startup_stm32f10x_hd.s的文件,而我所谓的中断服务程序的注册入口就是包含在这里。startup_stm32f10x_hd.s是用汇编语言编写的STM32处理器的初始化程序,它规定了系统的堆栈大小等系统信息,也包含了一个向量表,这个向量表中对所有的中断入口函数都进行了分配,如TIM3的中断入口是: ………………………………………… DCD TIM3_IRQHandler ; TIM3 DCD TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error …………………………………………… TIM2_IRQHandler B TIM2_IRQHandler PUBWEAK TIM3_IRQHandler SECTION .text:CODE:REORDER(1) TIM3_IRQHandler B TIM3_IRQHandler PUBWEAK TIM4_IRQHandler SECTION .text:CODE:REORDER(1) TIM4_IRQHandler B TIM4_IRQHandler 只有包含了startup_stm32f10x_hd.s文件,系统才可以知道我们所需要的中断处理函数是哪一个,进而可以进行调用。 如果你想使用其他的函数名作为中断处理函数,需要在以上几处同时改变函数名才可以,当然为了改函数名而改函数名是没有必要的。 由于我之前搭建工程的时候不认真缺了这个文件,导致中断调不通,走了弯路。 我的TIM3中断的相关代码如下: void Do_Timer_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_DeInit(TIM3); TIM_Cmd(TIM3, DISABLE); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //选择中断线0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能 NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //将结构体赋初值 TIM_TimeBaseStructure.TIM_Period = 2000*5 - 1; //计数为9999 时产生中断 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; //分配为36000 则时钟变为72MHz / 36000 = 2KHz 结合前面的10000次产生中断得到 5s产生一次中断 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //该元素表示多少次溢出后会产生一次中断,这个中断与每次溢出的中断不冲突 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //中断使能 TIM_Cmd(TIM3,ENABLE); // 计数器使能 } extern int Timer_flag; void TIM3_IRQHandler() { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//检查是不是TIM3中断 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIM3中断待处理位 if(Timer_flag != 1) { Timer_flag = 1; } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1885 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1663 浏览 1 评论
1149 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
763 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1964浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
790浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
616浏览 3评论
631浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
593浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 04:59 , Processed in 0.542568 second(s), Total 41, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号