Systick系统定时器
介绍:systick定时器上属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24位向下计数的计数器,计数器每一次计数的时间是1/SYSTICK,一般我们设置SYSTICK为72M。当重载数值寄存器的值递减到0时,系统定时器产生一次中断,以此循环。
使用范围:1.一般用于操作系统,用于产生时基,维持操作系统的心跳。
使用的寄存器:CTRL,LOAD,VAL,CALIB;
例程1:利用systick产生1s的时基。
步骤:
1.设置重载寄存器的值
2.清除当前数值寄存器的值
3.配置控制于状态寄存器
systick配置库函数:
_STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//不可能的重装载值,超出范围
if((ticks - 1UL)>SysTick_LOAD_RELOAD_Msk){
return (1UL);
}
//设置重装载寄存器
SysTick->LOAD = (uint32_t)(tiicks - 1UL);
//设置中断优先级
NVIC_SetPriority(SysTick_IRQn,(1UL< SysTick->VAL = OUL; //设置系统定时时钟源为AHBCLK=72M //使能系统定时器中断 //使能定时器 SysTick->CTRL = SysTIck_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; return (OUL); } 用固件库编程的时候我们只需要调用库函数SysTick_Config()即可,形参ticks用来设置重装载寄存器的值,最大不能超过重装载寄存器的值2^24,当重载寄存器的值递减到0的时候产生中断,然后重载寄存器的值又重新装载往下计数,以此循环。 设置中断优先级: void NVIC_SetPriority(IRQn_Type IRQn,uin32_t priority) { if((int32_t) IRQ<0){ SCB->SHP[(((uint32_t)(int32_t))IRQn)&0XFUL)-4UL] = (uint8_t)((priority<<(8-_NVIC_PRIO_BITS)) &(uint32_t)0xffUL); } } 使用:NVIC_SetPriority(Systick_IRQn,(1UL<<_NVIC_PRIO_BITS)-1UL); 配置系统定时器的时钟(AHBCLK)为72M: SysTick初始化函数: void SysTick__Init(void) { /*systickFrequency / 1000 1ms中断一次*/ /*systickFrequency / 100000 10us中断一次*/ /*systickFrequency / 1000000 1us中断一次*/ if(SysTick_Config(SystemCoreClock / 100000)){ while(1); } } 这个函数决定了多长时间产生一次中断。 使能定时器和定时器中断: 函数Delay_us()中我们等待TimingDelay为0,当它为零时表示延时时间到了。所以systick每进一次中断即10us时间 SysTick中断服务函数: void TimingDelay_Decrement(void) { if(TimingDelay !=0x00) { TimingDelay--; } } void SysTick_Handler(void) { TimingDelay_Decrement(); } TimingDelay的值等于延时函数中传进去的nTime的值,比如nTime=100000,则延时时间等于100000*10us = 1s。 EXTI外部中断/事件控制器 EXTI(external interrupt/event controller) 一外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 EXTI的功能框图: EXTI可以分为两部分功能,一个产生中断,一个产生事件,这两个功能在硬件上就有所不同。 **中断与事件的区别:产生中断的线路的目的上把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级别的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级别的。 红色线路上EXTI产生中断的线路,绿色线路上EXTI产生事件的线路。 EXTI初始化结构体详解 typedef struct{ uint32_t EXTI_Line; //中断/事件线 EXTIMode_TypeDef EXTI_Mode;//EXTI模式 EXTITrigger_TypeDef EXTI_Trigger;//触发类型 FunctionalState EXTI_LineCmd;//EXTI使能 }EXTI_InitTypeDef; 1.EXTI_Line:EXTI中断/事件选择,参考上表。 2.EXTI_MODE:EXTI模式选择,可以选择是产生中断还是事件。 3.EXTI_Trigger:EXTI边沿触发事件,可以选择上升沿触发还是下降沿触发或者是边沿触发。 4.EXTI_LineCmd:控制是否使能EXTI线,可选使能EXTI线(ENABLE)或禁用(DISABLE).
上一篇:【开篇】&【STM32】点亮LED
下一篇:STM32-(ADC,DMA,重映射)
推荐阅读最新更新时间:2024-11-18 13:13
设计资源 培训 开发板 精华推荐
- 直播已结束|如何通过【TI MSPM0 固件示例】及【常用电机驱动器方案和拓扑】,在10分钟内旋转电机
- 下载《基于巨磁(GMR)的Allegro IC》白皮书,赢50元京东卡
- Mentor线上研讨会丨FPGA仿真验证平台ModelSim应用进阶
- 【EEWORLD大学堂】玩转LaunchPad及TI MSP430G2XX系列超值单片机!!!
- 是德科技有奖直播:湾区圆桌派-穿越频谱壁垒:毫米波技术的创新之路
- 再续点评Vishay视频 抢楼拿奖进行到底
- 调查:全新 TI E2E中文社区等你体验,等你抽奖!还可邀请好友助你一臂之力!
- 有奖直播:是德科技高速芯片设计新技术研讨会
- ST传感器闯天下之驱动移植大赛+骨振动传感器评测,分高者胜
- 快来访问泰克高速串行通信专题 配置您的专属解决方案 赢好礼!