完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
10个回答
|
|
小白不懂帮顶
|
|
|
|
是不是要找这个
/* delay.c file 功能: 提供精确的延时API 有微秒级 和毫秒级延时 ------------------------------------ */ #include "z_delay_um.h" static uint8_t fac_us=0;//us延时倍乘数 static uint16_t fac_ms=0;//ms延时倍乘数 //初始化延迟函数 //SYSTICK的时钟固定为HCLK时钟的1/8 //SYSCLK:系统时钟 /**************************实现函数******************************************** *函数原型: void delay_init(u8 SYSCLK) *功 能: 初始化延迟系统,使延时程序进入可用状态 *******************************************************************************/ void delay_init(uint8_t SYSCLK) { SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8 fac_us=SYSCLK/8; fac_ms=(uint16_t)fac_us*1000; } //延时nms //注意nms的范围 //SysTick->LOAD为24位寄存器,所以,最大延时为: //nms<=0xffffff*8*1000/SYSCLK //SYSCLK单位为Hz,nms单位为ms /**************************实现函数******************************************** *函数原型: void delay_ms(u16 nms) *功 能: 毫秒级延时 延时nms nms<=1864 *******************************************************************************/ void delay_ms(uint16_t nms) { uint32_t temp; SysTick->LOAD=(uint32_t)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //延时nus //nus为要延时的us数. /**************************实现函数******************************************** *函数原型: void delay_us(u32 nus) *功 能: 微秒级延时 延时nus nms<=1864 *******************************************************************************/ void delay_us(uint32_t nus) { uint32_t temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //------------------End of File---------------------------- |
|
|
|
下面这个函数可以将要延时1ms的时间根据SYSTICK的时钟换算成相应的TICKS值装载到load中,这样SYSTICK每次中断就是1ms,除此之外为了达到精确的延时还要将SYSTICK的中断优先级设置为最高,否则可能不准确。
|
|
|
|
精确度这个总是会有个极限的。
|
|
|
|
这个和定时器延时差不多吧。
|
|
|
|
|
|
|
|
应该是 软定时,这样用是可以的
|
|
|
|
谢谢分享
|
|
|
|
软件定时,中断里相应可以精确些,但是中断频次过高影响其他代码执行
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1441 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1373 浏览 3 评论
3018 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1519 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1949 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 18:09 , Processed in 0.949593 second(s), Total 92, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号