OpenEdv-开源电子网

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

外部中断和systick延时(非中断)冲突问题

[复制链接]

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2020-6-6 11:24:27 | 显示全部楼层 |阅读模式
20金钱
外部中断就是原子哥的按键外部中断,配置无误。主要是两种延时的区别,第一种延时会导致外部中断卡死在中断服务程序的延时当中,仿真也没法跳出,第二种原子哥的延时就没有问题,但是从逻辑上看这两个语句区别不大啊。
有问题的延时:
void DELAY_Nms(u16 nms)

{
//9外是外部时钟频率,如果选择内部时钟就是72M/8
u32 state = 0;
SysTick->LOAD = 9000*nms;//设置自动装载值为9000(1ms)
    SysTick->VAL = 0;//设置当前初值为0
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开启(使能)计数:使能SysTick定时器
do
  state = SysTick->CTRL;
while(!(state & (1<<16)));
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭(失能)计数
SysTick->VAL = 0;//再设置当前初值为0,重置VAL
}
第二种:
void delay_ms(u16 nms)
{         
u32 temp;     
SysTick->LOAD=(u32)nms*fac_ms;    //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00;       //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数  
do
{
  temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));  //等待时间到达   
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00;            //清空计数器        
}
就是两个while的跳出条件不一样。

最佳答案

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

就是条件不一样导致的。 只有一个systick, 如果中断和正常代码都调用了delay, 就会卡死正常代码。 因为在中断里面已经等待延时到了, 回到正常代码, 永远也无法等到systick延时结束, 因为已经结束了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-6 11:24:28 | 显示全部楼层
就是条件不一样导致的。   只有一个systick, 如果中断和正常代码都调用了delay, 就会卡死正常代码。 因为在中断里面已经等待延时到了, 回到正常代码, 永远也无法等到systick延时结束, 因为已经结束了。
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
 楼主| 发表于 2020-6-8 14:04:14 | 显示全部楼层
正点原子 发表于 2020-6-6 11:24
就是条件不一样导致的。   只有一个systick, 如果中断和正常代码都调用了delay, 就会卡死正常代码。 因为 ...

哦哦哦,明白了,中断把systick->CRTL的使能位改变了是吧,最后有条清零语句
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 16:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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