OpenEdv-开源电子网

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

自己用的Systick延时函数

[复制链接]

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2014-11-7 09:57:58 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]void delay_ms(u16 nms) { u32 temp; if( SysTick->CTRL==0x00 ) { SysTick->LOAD=(u32)nms*fac_ms; SysTick->VAL =0x00; SysTick->CTRL=0x01; do { temp=SysTick->CTRL; } while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL=0x00; SysTick->VAL =0X00 } else { temp = SysTick->VAL; SysTick->CTRL=0x00; SysTick->VAL =0X00; delay_ms(nms); if(nms*fac_ms<temp) { SysTick->LOAD = temp - nms*fac_ms; SysTick->CTRL = 0x01; } } }[/mw_shl_code]
这个是参照原子哥写的,当初用这个是因为主函数中有延时的时候,发生中断进入中断函数以后再执行延时,退出中断后Systick定时器关闭,导致主函数延时提前结束所想出来的办法,这个函数主要就是进来先判断Systick是否在工作,如果在工作就先记录Systick的当前的计数值,然后关闭计数器,递归调用延时,等延时结束判断一下原来剩余的延时时间跟中断时执行的延时时间,如果少于中断的就关闭计数器,如果没有就继续延时,退出函数 ,返回主进程。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-7 15:30:35 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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