历史上的今天
今天是:2024年10月15日(星期二)
2018年10月15日 | STM32的延时程序,us级延时
2018-10-15 来源:eefocus
据前人说,做嵌入式系统最忌讳的就是程序等延时和浪费timer,所以平时写程序很努力的在避免毫秒级的延时,而且一般的rtos是需要个时基的,所以尽量做到只用systick来完成系统时基,毫秒,微妙的延时。
但做18B20等的通信还是需要一些us级别的延时的,网上看了比较多的延时实现方法,均不是很实用,比如正点原子用systick单纯的做毫秒或微妙延时,虽不用中断,但把一个systick就浪费了。实在找不到现成的,就只能自己写个了。首先是用systick来维护一个每次中断都自增的全局变量,作为ms延时和系统其他时间的时基。其次,借助systick的寄存器写了如下一个us级的延时程序
void Delay_us(uint32_t delay_time)
{
uint32_t delay_curr;
int32_t x=0;
delay_start = SysTick->VAL;
delay_time *= US_RATIO;
x = delay_start - delay_time;
if (x < 0)
{
delay_goal = x + SystemCoreClock/SYSTICK_FREQUENCY;
do{delay_curr = SysTick->VAL;
}while(WAIT_DELAY_U1);
}
else
{
delay_goal = x;
do{delay_curr = SysTick->VAL;
}while(WAIT_DELAY_U2);
}
}
SystemCoreClock 72000000
SYSTICK_FREQUENCY 1000
US_RATIO 72
WAIT_DELAY_U2 ((delay_curr > delay_goal) && (delay_curr < delay_start))
WAIT_DELAY_U1 ((delay_curr > delay_goal) || (delay_curr < delay_start))
考虑到自己的用途,us延时的理论范围是1-999us,由于有中断,实际用最好不大于900us,示波器测试还是比较理想的。
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 品味是由一连串的想法、做法、看法、观念串联而成,并不是用金钱堆砌就可以获得,布鲁蓝光网今天采访的就是一个明证;空间没有太多的豪华装饰,可是却让你感受到很高雅的品味。 人生未必 ...… 查看全部问答> |
|
VxWorks命令行中执行命令“devs”之后的“host:”是怎么出来的。 VxWorks中命令devs之后的host:是怎么出来的。 -> devs drv name 0 /null 1 /tyCo/0 1 /tyCo/1 5 host: 6 ...… 查看全部问答> |
|
如果采用ARM9平台,移植linux操作系统,用xvid编码实现,不知道帧率如何? 如果用FPGA,采用sopc实现,没找到已有的MPEG ip核,可能工作量很大 想听一下大家的意见,谢谢… 查看全部问答> |
|
求高手指点如何安装Windows Embedded CE 6.0破解版? 1、我已经安装好VS2005 http://download.microsoft.com/download/b/a/6/ba691c56-8833-446c-82fe-cf94b588a622/chs_vs_2005_VSTS_180_Trial.img Visual Studio 2005注册升级 可升级正式版key:KYTYH-TQKW6-VWPBQ-DKC8F-HWC4J 找到SETUP文件 ...… 查看全部问答> |
|
先说问题: MC34063+功率MOS管组成的大功率电路里,总电路的功率跟MC34063的耗散功率到底是个什么关系,总电路的功率是主要摊在MOS管上,还是怎么回事? 查了百度半天也没看到说明 ...… 查看全部问答> |




