打印
[STM32F1]

在通用定时器 里面嵌套准确延时 systick

[复制链接]
3119|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
书的那页|  楼主 | 2015-8-31 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教下  我现在 用tim5 做了一个10ms  的定时器,然后 希望一个 GPIO  能够 在这个周期内保持 0.38ms的高电平  ,想用systick  做一个1us的 延时  然后 嵌套在 TIM5中  但是失败了 ,请问下 怎么  可以实现 比较精确的延时  ?谢谢     下面是我自己写的
void TIM5_IRQHandler
{
  if(TIM_GetITstatus(TIM5,TIM_IT_Update)!=RESET)
  {
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
     led=0;
     adc=adget();
     delay(380);
     led=1;
  }
}
沙发
书的那页|  楼主 | 2015-8-31 12:35 | 只看该作者
自己先顶一下 坐等大神

使用特权

评论回复
板凳
进击的ic| | 2015-8-31 13:40 | 只看该作者
定时器做的延时就是精准的延时啊,还有中断服务程序里应该不能触发中断,因为在第一次触发中断的时候寄存器会记录程序的返回地址,假设未返回就能触发新的中断,寄存器里的地址就会被重置,那么单片机就不知道最终的返回地址了。
楼主可以在10ms的中断里做一个标记位,然后在主函数里判断标记位来做准确的10ms周期,然后再在做us及延时

使用特权

评论回复
地板
书的那页|  楼主 | 2015-8-31 14:17 | 只看该作者
进击的ic 发表于 2015-8-31 13:40
定时器做的延时就是精准的延时啊,还有中断服务程序里应该不能触发中断,因为在第一次触发中断的时候寄存器 ...

嗯嗯  你的意见 很不错 我也发现 在主函数里面 使用 延时  函数 不会出错   但是没有想到使用标志位  

使用特权

评论回复
5
进击的ic| | 2015-8-31 16:05 | 只看该作者
书的那页 发表于 2015-8-31 14:17
嗯嗯  你的意见 很不错 我也发现 在主函数里面 使用 延时  函数 不会出错   但是没有想到使用标志位   ...

一般中断里都是放标记位的,中断服务程序越简短越好,比较复杂的代码中断服务函数太长会出问题

使用特权

评论回复
6
书的那页|  楼主 | 2015-9-2 22:11 | 只看该作者
进击的ic 发表于 2015-8-31 16:05
一般中断里都是放标记位的,中断服务程序越简短越好,比较复杂的代码中断服务函数太长会出问题 ...

好的  谢啦

使用特权

评论回复
7
bbapple| | 2015-9-3 18:18 | 只看该作者
精确延时一般都会选用定时器吧。。

使用特权

评论回复
8
书的那页|  楼主 | 2015-9-7 11:05 | 只看该作者
bbapple 发表于 2015-9-3 18:18
精确延时一般都会选用定时器吧。。

用 systick  也比较精确的  可以试一下

使用特权

评论回复
9
迪卡| | 2015-9-7 14:15 | 只看该作者
在主函数里面使用延时函数比较好

使用特权

评论回复
10
皈依| | 2015-9-7 15:22 | 只看该作者
做个精确的delay延时就可以啦
在main里面先高电平 delay 0.38ms 低电平 delay 9.62ms 循环

使用特权

评论回复
11
豆腐块| | 2015-9-8 21:24 | 只看该作者
定时器做的延时是比较精准的

使用特权

评论回复
12
尤彼卡| | 2015-9-8 21:35 | 只看该作者
中断服务程序越简短越好,延时都放在外面

使用特权

评论回复
13
bbapple| | 2015-9-13 09:54 | 只看该作者
书的那页 发表于 2015-9-7 11:05
用 systick  也比较精确的  可以试一下

恩 这个用的比较少。。

使用特权

评论回复
14
冰河w| | 2015-9-14 20:28 | 只看该作者
一般中断服务程序越简短越好

使用特权

评论回复
15
lefeng| | 2015-9-14 22:14 | 只看该作者
中断服务程序里应该不能触发中断的

使用特权

评论回复
16
sky.sun.zz| | 2015-9-15 07:56 | 只看该作者
systick与TIM是不同步的,无法在TIM5中断中操作正确时序的systick。

使用特权

评论回复
17
bbapple| | 2015-9-22 20:57 | 只看该作者
书的那页 发表于 2015-9-7 11:05
用 systick  也比较精确的  可以试一下

是的,这个也挺好的。。:):)

使用特权

评论回复
18
风清扬mxz| | 2015-9-22 23:13 | 只看该作者
lefeng 发表于 2015-9-14 22:14
中断服务程序里应该不能触发中断的

中断服务函数里面是可以触发中断的,比如抢占优先级高的中断可以打断抢占优先级低的中断,所以我觉得是可以的,,,欢迎讨论

使用特权

评论回复
19
lefeng| | 2015-9-23 21:11 | 只看该作者
抢占优先级高的中断可以打断抢占优先级低的中断

哦,对的,STM32是可以抢中断的

使用特权

评论回复
20
cowboy2014| | 2015-9-23 21:29 | 只看该作者
定时器做的延时就是精准的延时啊,还有中断服务程序里应该不能触发中断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

73

帖子

0

粉丝