你在中断处理函数中调用延时函数。是可以的。关键这个延时函数不可以使用到别的中断。stm32在中断处理中只能同时处理一个中断。如果该中断不处理完。即使有别的高级别中断产生也不会执行处理函数。你说你在你的延时函数中使用了systemtick,在你EXTI0_1_IRQHandler执行的时候,systemtick的中断处理不能执行。你的系统计时也不会增加,就导致你的延时函数永远等不到结束。如果你一定要延时的话,可以使用空循环。
在Projects-Properities的设置下,选择Run/Debug Settings,选择New-Ac6 STM32 Debugging
此时会弹出定义新开发板的对话框,选择你的调试工具和接口以及开发板的名字。点击确定之后会自动生成一个调试配置文件。然后会弹出一个新的对话框。
在弹出的对话框中,在Debugger选项卡中,选择Use Local Script,然后选择刚刚弹出的对话框生成的cfg文件,选择确定(这一步通常不用做,已经默认配置好了)。
然后选择Run-Debug as-Ac6 STM32 C/C++
Application,就可以正常启动调试了。这个软件调试的一个不足之处在于没有类似于Keil的Live
Watch功能,也就是说变量的值必须要等你手动将程序暂停或设置断点之后才能看到,而不能实时更新,虽然官方说这项功能他们在开发中了。
1,Systick的时钟源你选择的是外部时钟的8分之一,所以需要除以8,得到Systick的时钟频率,例如外部时钟是8M,经过倍频后变为72M,那么Systick的频率就是9M,对应的计数器计9个数就是1us,所以fac_us=72/8=9.
2,如果不是8的倍数,8分频取得的频率是近似值,所以不准确,故推荐使用外部晶振大小为8MHz的晶振。
3,不占用,如果你用作延时函数,你得确定是否时间到了,所以是while的循环,你说的while(1)是什么意思?
直接调用库函数systick_config(uint32_t
ticks)这一句就可以,比如调用函数:
systick_config(1000);后,系统每隔1000个系统时钟脉冲就进入系统滴答定时器中断:
void
systick_handler(void)
{
}
然后就在中断函数里边写你想做的事情吧。
本文标签:stm32cube滴答定时器