stm32关于系统滴答定时器(systick) 10
stm32的systick根据手册叙述,时钟源可以选择外部时钟(HCLK的8分频)或者内核时钟(FCLK),选择外部时钟时候延时没有问题,但是systick如果选择内核时...
stm32的systick根据手册叙述,时钟源可以选择外部时钟(HCLK的8分频)或者内核时钟(FCLK),选择外部时钟时候延时没有问题,但是systick如果选择内核时钟(FCLK),请问delay_init初始化函数应如何设置,我改为如下
void delay_init(u8 SYSCLK)
{
SysTick->CTRL|=(1<<2);// CTRL位2置1,选择内核时钟(72MHZ)
fac_us=SYSCLK; // fac_us为延时1us对应的设定值
fac_ms=(u16)fac_us*1000;
}
为何主函数在经过delay_init(72);初始化后调用delay_us(1000);的时候,软件仿真的实际延时和设定值(1ms)相差很多?是否哪里写错?
调用函数如下
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_init(u8 SYSCLK)
{
SysTick->CTRL|=(1<<2);// CTRL位2置1,选择内核时钟(72MHZ)
fac_us=SYSCLK; // fac_us为延时1us对应的设定值
fac_ms=(u16)fac_us*1000;
}
为何主函数在经过delay_init(72);初始化后调用delay_us(1000);的时候,软件仿真的实际延时和设定值(1ms)相差很多?是否哪里写错?
调用函数如下
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;
} 展开
1个回答
2018-04-24 · 知道合伙人互联网行家
关注
展开全部
你在中断处理函数中调用延时函数。是可以的。关键这个延时函数不可以使用到别的中断。stm32在中断处理中只能同时处理一个中断。如果该中断不处理完。即使有别的高级别中断产生也不会执行处理函数。你说你在你的延时函数中使用了systemtick,在你EXTI0_1_IRQHandler执行的时候,systemtick的中断处理不能执行。你的系统计时也不会增加,就导致你的延时函数永远等不到结束。如果你一定要延时的话,可以使用空循环。
追问
我的主函数只是个简单的led灯定时闪烁程序,没有用到按键中断。关键是时钟源选择外部时钟的时候可以精确定时,选择内核时钟的时候时间不对。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询