SysTick->LOAD=reload;//每 1/delay_ostickspersec 秒中断一次 SysTick->CTRL|=1<<0;//开启 SYSTICK #else fac_ms=(u16)fac_us*1000;//非 OS 下,代表每个 ms 需要的 systick 时钟数 #endif } SysTick 是 MDK 定义了的一个结构体(在 core_m4.h 里面),里面包含CTRL、LOAD、VAL、 CALIB等4个寄...
14~17行:此时定时器变从0到t开始计数,使用“__HAL_TIM_GET_COUNTER()”获取当前CNT计数器的值,当CNT计数器的值等于t时,时间经历了0到t个1us,实现了延时t us; 18行:停止定时器,无需自动重新装填ARR值; 28~36行:因为实现原理的限制,“us_timer_delay()”最多能延时65535us,即65ms多点,如果想要秒级的...
时钟源选择 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us = SYSCLK/8; //配置延时1us需要计数的次数, 由于时钟源为HCLK/8=9MHz, 所以SYSCLK应该选择72 fac_ms = (u16)fac_us*1000; //配置延时1ms需要计数的次数 } /*** *函数名 : delay_us * 函数功能 : us延时, *输 入 :...
函数Delay_us()中我们等待 TimingDelay 为 0,当 TimingDelay 为 0 的时候表示延时时 间到。变量 TimingDelay 在中断函数中递减,即 SysTick 每进一次中断即 10us 的时间 TimingDelay 递减一次。 1 int main(void) 2 { 3 /* LED 端口初始化 */ 4 LED_GPIO_Config(); 5 6 /* 配置 SysTick 为 10us ...
delay_us() 代码语言:javascript 代码运行次数:0 运行 AI代码解释 voiddelay_us(u32 nus)// nus 不要大于798915,因为LOAD寄存器是24位的{u32 temp;SysTick->LOAD=nus*fac_us;// 需要延时的时间SysTick->VAL=0x00;//清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;// 开始倒数do{temp=SysTick->...
void delay_us(u32 nus){ u32 temp;SysTick -> LOAD = nus * fac_us; //设置重装载值 Sy...
SysTick_CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk; return(0UL); } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 用固件库编程的时候我们只需要调用库函数 SysTick_Config()即可,形参 ticks 用来设置重装载寄存器的值,最大不能超过重装载寄存器的值...
5.void SysTickDelay(uint32_t us)功能:提供微秒级别的延时功能。注意,这个函数是一个简单的延时函数,可能不够精确,最好使用硬件定时器来实现更精确的延时。五、延时代码实现:1. sys_tick_utils.c #include "stdint.h"#include "sys_tick_utils.h"#include "system_stm32f10x.h"// 每 us 跳动次数u8...
#define Value_us 21#define Value_ms 21000 void delay_init(void){ SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟 SysTick->CTRL &= ~(1 << 0); //关闭计数器}void delay_us(u32 num){ SysTick->LOAD = num * Value_us; SysTick->VAL = 0; SysTick->CTRL |= (...
而内核中的滴答定时器SysTick自然就成了不二之选,也就是常用的delay_ms/delay_us函数 ...