stm32具有systick定时器,该外设属于内核外设,时钟一般选择系统时钟的8分频。使能后,计数寄存器递减到0后,会自动重装值。
需要注意的是滴答定时器的计数器是24位的,最大值为2^24(16,777,216)。
(1)72MHz利用滴答定时器实现us级延时:
72MHz/8=9Mhz
//最大值:1864135us
void delay_us(u32 i)
{
u32 temp;
SysTick->LOAD=9*i; //设置重装数值
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零时无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
(2)168MHz利用滴答定时器实现us级延时:
168MHz/2=21MHz
//最大值:798915us
void delay_us(u32 i)
{
u32 temp;
SysTick->LOAD=21*i; //设置重装数值, 72MHZ时
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
(3)72MHz利用滴答定时器实现ms级延时:
//最大值:1864ms
void delay_ms(u32 i)
{
u32 temp;
SysTick->LOAD=9000*i; //设置重装数值, 72MHZ时
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
(4)168MHz利用滴答定时器实现ms级延时:
最大:798ms
void delay_ms(u32 i)
{
u32 temp;
SysTick->LOAD=21000*i; //设置重装数值, 72MHZ时
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
stm32具有systick定时器,该外设属于内核外设,时钟一般选择系统时钟的8分频。使能后,计数寄存器递减到0后,会自动重装值。
需要注意的是滴答定时器的计数器是24位的,最大值为2^24(16,777,216)。
(1)72MHz利用滴答定时器实现us级延时:
72MHz/8=9Mhz
//最大值:1864135us
void delay_us(u32 i)
{
u32 temp;
SysTick->LOAD=9*i; //设置重装数值
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零时无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
(2)168MHz利用滴答定时器实现us级延时:
168MHz/2=21MHz
//最大值:798915us
void delay_us(u32 i)
{
u32 temp;
SysTick->LOAD=21*i; //设置重装数值, 72MHZ时
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
(3)72MHz利用滴答定时器实现ms级延时:
//最大值:1864ms
void delay_ms(u32 i)
{
u32 temp;
SysTick->LOAD=9000*i; //设置重装数值, 72MHZ时
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
(4)168MHz利用滴答定时器实现ms级延时:
最大:798ms
void delay_ms(u32 i)
{
u32 temp;
SysTick->LOAD=21000*i; //设置重装数值, 72MHZ时
SysTick->VAL=0; //清零计数器
SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
举报