在"嵌入式学习006_Systick使用(一)"中,详细介绍了Systick中寄存器的使用方法,用到了很多函数,实际上到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS.h中定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。
在CMSIS中提供的函数是 SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。
其中这个函数定义在Core_cm3.h中 ,源代码如下所示:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0); }
从上面的函数中可以看出,这个函数把Systick的初值,中断优先级,使能中断,开启定时器都完成了。大大简化了程序。
其中ticks 代表的是初值。例如系统时钟是72Mhz 那么要产生1ms的时基,那么我们可以这样去写。
SysTick_Config(SystemCoreClock/1000); 当然也可以写成:SysTick_Config(72000);
了解了这些,我们可以用它来做一个简单的延时函数delay_ms(u16 time);
代码如下:
void delay_ms(u16 time)
{
nTime=time ; /nTime 是个全局变量 可设 extern u16 nTime;/
while(nTime);
}
在中断函数中直接 加入nTime--;
在主函数 初始化过程中 加入 SysTick_Config(72000);
上一篇:STM32学习006_Systick使用(一)
下一篇:STM32学习008_ARM产品浅析
推荐阅读最新更新时间:2024-03-16 15:41
设计资源 培训 开发板 精华推荐
- 泰克 4200A-SCS 带您走进半导体材料测试世界 下载赢好礼!
- 有奖下载 |《设计无线通信系统时需考虑的天线因素》
- 【EEWORLD第四十三届】2012年10月社区明星人物揭晓!
- 学《TIVA C Launchpad入门课程》 晒成绩 赢大礼!
- 有奖直播|基于Source-down技术的全新英飞凌MOSFET,有效提升功率密度,肉眼可见
- 下载《基于巨磁(GMR)的Allegro IC》白皮书,赢50元京东卡
- Follow me第2期来袭,与得捷电子一起解锁开源硬件 Adafruit ESP32-S3 TFT Feather!
- MPS e-store清空购物车2020
- 下载有礼:看“智””造“热”侦探 FLIR ETS320 红外热像仪如何纠错!