OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8502|回复: 3

STM32配置TIM2定时器作为中断,在中断中扫描按键,中断只能执行有限次

[复制链接]

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-8-12
在线时间
0 小时
发表于 2014-11-4 11:37:07 | 显示全部楼层 |阅读模式
5金钱
TIM2定时器配置函数:

[mw_shl_code=c,true]void TIM2_Interrupt_config(void) { TIM2_Config(); TIM2_NVIC(); } void TIM2_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; printf("\r\nTIM2_CONFIG_IN!\n"); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 7199; TIM_TimeBaseStructure.TIM_Prescaler = 9; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); // TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE); // TIM_ARRPreloadConfig(TIM2, DISABLE); TIM_Cmd(TIM2, ENABLE); printf("\r\nTIM2_CONFIG_OK!\n"); } void TIM2_NVIC(void) { NVIC_InitTypeDef NVIC_InitStructure; printf("\r\nTIM2_NVIC_IN!\n"); NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=15; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); printf("\r\nTIM2_NVIC_OK!\n"); }[/mw_shl_code]
主函数:
[mw_shl_code=c,true]int main(void) { USART1_Config(); printf("\r\nProgram started!\n"); Key_GPIO_Config(); TIM3_PWM_Init(); TIM2_Interrupt_config(); }[/mw_shl_code]
中断函数:
[mw_shl_code=c,true]void TIM2_IRQHandler(void) { // printf("\r\ninside the interrupt!\r\n"); if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { printf("in the if"); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) == KEY_ON) { printf("\r\ninside the scan\r\n"); if(servoz_pulse<=Left_Max) {servoz_pulse=servoz_pulse;} else { servoz_pulse=servoz_pulse - One_Step; Tim3_Pwm_Reconfig(servoz_pulse); printf("\r\nservoz_pulse = %d\r\n",servoz_pulse); } } else if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2) == KEY_ON) { if(servoz_pulse>=Right_Max) {servoz_pulse=servoz_pulse;} else { servoz_pulse=servoz_pulse + One_Step; Tim3_Pwm_Reconfig(servoz_pulse); printf("\r\nservoz_pulse = %d\r\n",servoz_pulse); } } } }[/mw_shl_code]
执行后,用串口输出运行情况,如下:


从in the if 的次数来看,总共进了5次中断,然后函数就空转了,最后会进入hardfault的死循环。
请问有什么问题?

最佳答案

查看完整内容[请看2#楼]

中断里面执行的东西太多了。  导致 执行时间> 中断本身的时间 。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-11-4 11:37:08 | 显示全部楼层
中断里面执行的东西太多了。 

导致 执行时间> 中断本身的时间 。
回复

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-8-12
在线时间
0 小时
 楼主| 发表于 2014-11-4 11:37:08 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
问题解决了,谢谢你。
回复

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-8-12
在线时间
0 小时
 楼主| 发表于 2014-11-4 11:37:08 | 显示全部楼层
里面还有一个基础的问题,就是main函数执行到后面没有给while(1)函数让它继续运行,它结束了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表