找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2121|回复: 4
收起左侧

基于STM32F103系列,使用系统时钟SysTick进行Delay延时设计,腾出用TIM写延时函数...

[复制链接]
ID:923903 发表于 2021-11-28 00:43 | 显示全部楼层 |阅读模式
本代码使用系统时钟SysTick进行设计,腾出用TIM写延时函数占用的时钟。


Delay.c
  1. void Delay_Init(void)
  2. {
  3.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                  //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  5. }

  6. //微秒延时
  7. void Delay_us(u16 n)
  8. {
  9.         u32 temp;
  10.         SysTick->LOAD = n * 9;                                          //时间加载
  11.         SysTick->VAL = 0x00;                                          //清空计数器
  12.         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
  13.         do
  14.         {
  15.                 temp = SysTick->CTRL;
  16.         } while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
  17.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                //关闭计数器
  18.         SysTick->VAL = 0X00;                                                        //清空计数器
  19. }

  20. //毫秒延时
  21. void Delay_ms(u16 n)
  22. {
  23.         u32 temp;
  24.         SysTick->LOAD = (u32)n * 9000;                          //时间加载
  25.         SysTick->VAL = 0x00;                                          //清空计数器
  26.         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
  27.         do
  28.         {
  29.                 temp = SysTick->CTRL;
  30.         } while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
  31.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                //关闭计数器
  32.         SysTick->VAL = 0X00;                                                        //清空计数器
  33. }

  34. //秒延时
  35. void Delay_s(u16 n)
  36. {
  37.         for (u16 x = 0; x < n; x++)
  38.         {
  39.                 u32 temp;
  40.                 SysTick->LOAD = 9000000;                                  //时间加载
  41.                 SysTick->VAL = 0x00;                                          //清空计数器
  42.                 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
  43.                 do
  44.                 {
  45.                         temp = SysTick->CTRL;
  46.                 } while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
  47.                 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                //关闭计数器
  48.                 SysTick->VAL = 0X00;                                                        //清空计数器
  49.         }
  50. }
复制代码

Delay.h
  1. #ifndef __DELAY_H
  2. #define __DELAY_H                           

  3. extern void Delay_Init(void);

  4. extern void Delay_ms(u16 n);
  5. extern void Delay_us(u16 n);
  6. extern void Delay_s(u16 n);

  7. #endif
复制代码



评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:476415 发表于 2021-11-28 21:47 来自手机 | 显示全部楼层
请问精度如何啊?最低到uS?
回复

使用道具 举报

ID:950533 发表于 2021-12-2 13:25 | 显示全部楼层
while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达   不懂
回复

使用道具 举报

ID:923903 发表于 2021-12-5 20:04 | 显示全部楼层
isyido 发表于 2021-11-28 21:47
请问精度如何啊?最低到uS?

SysTick已经是stm32自身精度最高的系统定时器了
回复

使用道具 举报

ID:923903 发表于 2021-12-5 20:17 | 显示全部楼层
ryrty 发表于 2021-12-2 13:25
while ((temp & 0x01) && !(temp & (1

当计数时间还没到,也就是计数值temp不为0时,temp与上0000 0000 0000 0001一定为1(与门全1出1),就让temp“与上”1000 0000 0000 0000,感叹号“!”取反,与门有0出0、全1出1,也就是有1的存在,那就会留在while循环里继续等待;
当计数时间到了,也就是计数值temp为0时,temp“与上”0000 0000 0000 0001一定为0(与门有0出0),也就是跳出while循环,延时结束,继续执行下一步的程序;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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