历史上的今天
今天是:2025年01月31日(星期五)
2019年01月31日 | stm32使用systick精确延时
2019-01-31 来源:eefocus
利用系统滴答定时器来实现精确延时,需要以下五步:
1、设置滴答定时器的时钟,通过设置其控制寄存器,选择外部时钟,即为系统时钟的八分之一,若系统时钟为72M,则滴答定时器时钟为9M。即定时一秒需要9M个时钟周期。
2、设置滴答定时器的重装载寄存器的数值,即需要延时的时钟周期数。如:若需要延时20微秒,则重装载值为20*9.若要延时20毫秒,则设置重装载值为20*9000.
3、清空滴答定时器当前值寄存器的值,使之为零,以便使能计数时能够从设定值开始倒数计时。
4、设置滴答定时器的控制寄存器,开始倒计数。
5、查询滴答定时器的状态位,定时时间到,关闭定时器,清空定时器当前值。
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//控制寄存器,选择外部时钟即系统时钟的八分之一(HCLK/8;72M/8=9M)
fac_us=SYSCLK/8; //定义全局变量,即延时一微秒所需的的时钟周期数(72/8=9,单位为微妙)
fac_ms=(u16)fac_us*1000; //一毫秒所需的时钟周期数(9000)
}
void Delay_us(u32 nus)
{
u32 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; //清空计数器
}
或者
void Delay_us(u32 Nus)
{
SysTick->LOAD=Nus*9; //时间加载 72M主频
SysTick->CTRL|=0x01; //开始倒数
while(!(SysTick->CTRL&(1<<16))); //等待时间到达
SysTick->CTRL=0X00000000; //关闭计数器
SysTick->VAL=0X00000000; //清空计数器
}
下一篇:arm异常处理流程
史海拾趣
|
随着半导体制造商向65纳米技术转移并展望更小节点,严峻的测试挑战也开始浮出水面。现在,工艺开发工程师们必须放弃由硅、二氧化硅、多晶硅和铝材料构成的良性世界,而将自己置于由硅锗(SiGe)、绝缘体上硅(SOI)、亚硝酸铪(HfNO2)、金属栅、低 ...… 查看全部问答> |
|
只需简单填写资料,即可下载,是电子书,测试测量的同志们不要错过了。 https://www.eeworld.com.cn/keithley/down.php?downid=34&id=0… 查看全部问答> |
|
我从网上下载了一个testusb的程序 http://www.vckbase.com/code/winsys/driver/testusb.rar 用来枚举usb设备的一个测试程序,需要DDK配合编译 我用vs2005+ddk 就是编译不过 网上解决的错误的办法我都试过了: 不要跟我说我没加库 我加了hid.li ...… 查看全部问答> |
|
kingston 2G 优盘 插上时是安装成功可以使用了,但过一会就是unknown driver 然后就没反应了,在我的电脑里也没有显示,在任务栏也没有显示,这种情况算什么,请高手帮忙… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 CPU与外部设备、存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O接口,而后者则被称为存储器接口。存储器通常在CPU的同步控制下工作,接口电路比较简单;而I/O设备品种繁多, ...… 查看全部问答> |




