找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6924|回复: 0
收起左侧

基于STM32的us级延时C语言程序

[复制链接]
ID:90014 发表于 2015-9-13 18:00 | 显示全部楼层 |阅读模式
据前人说,做嵌入式系统最忌讳的就是程序等延时和浪费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,示波器测试还是比较理想的。


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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