历史上的今天
今天是:2024年10月19日(星期六)
2020年10月19日 | 浅谈STM32F10X芯片SysTick系统时钟定时器
2020-10-19 来源:eefocus
1、介绍
实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。
系统时钟及系统定时器时钟(详见手册)
2、寄存器描述
SysTick控制及状态寄存器STK_CTRL
SysTick重装载数值寄存器STK_LOAD
SysTick当前数值寄存器STK_VAL
SysTick校准数值寄存器STK_CALIB
与SysTick相关的固件库函数有以下几个:
配置SysTick系统时钟:SysTick_CLKSourceConfig();
设置SysTick重装值:SysTick_SetReload();
使能或除能SysTick定时器:SysTick_CounterCmd();
使能或除能SysTick定时器中断:SysTick_ITConfig();
获取SysTick时钟当前值:SysTick_GetCounter();
检测SysTick标志位是否设置:SysTICK_GetFlagStatus();
3、SysTick配置流程
首先配置RCC:选择系统时钟、配置总线时钟、使能外围设备时钟等;
配置NVIC:选择中断优先级组,设置SysTick中断优先级,使能SysTick中断通道;
编写SysTick中断处理函数;
配置SysTick时钟:
设置SysTick时钟源(不需要,默认选择HCLK的8分频作为SysTick系统定时器的时钟源):调用SysTick_CLKSourceConfig()函数;
设置SysTick时钟重装值:调用SysTick_SetReload();
使能SysTick时钟中断(根据具体应用需要):调用SysTick_ITConfig()函数;
使能SysTick时钟:调用SysTick_CounterCmd()函数;
然后还可以调用SysTick_GetCounter()函数获取SysTick系统时钟计数器的当前值;也可以调用SysTick_GetFlagStatus()函数检查指定的SysTick标志位是否设置(没有开启中断,通过软件查询方式检查系统定时器是否计数到0)。
SysTick系统定时器的中断标志位在系统时钟节拍控制与状态寄存器CTRL的COUNTFLAG位,该位由定时器计数到0置1,读取时清零。因此可以调用函数SysTick_GetFlagStatus(SysTick_FLAG_COUNT)来清除COUNTFLAG标志位。
经过测试:不调用SysTick_GetFlagStatus(SysTick_FLAG_COUNT)函数来清除标志位,在每次系统时钟节拍SysTick在计数为0时,也都能进入中断处理函数。但程序的严密性考虑,最好还是调用该函数。
4、SysTick系统定时器例子
例子1:
/* 主函数中配置,这里没有选择SysTick的时钟源,是因为c8芯片已经将该时钟固化成HCLK的8分频了 */
SysTick_SetReload(9000);
SysTick_ITConfig(ENABLE);
SysTick_CounterCmd(SysTick_Counter_Enable);
/*中断处理函数*/
void SysTick_Handler(void) /* 1ms中断一次 */
{
if(SET == SysTick_GetFlagStatus(SysTick_FLAG_COUNT)) /* 读标志位,同时清除标志位 */
{
SysCount++;
if(500 == SysCount)
{
SysCount = 0;
count++;
}
}
}
例子2:
/* 主函数配置 */
SysTick_SetReload(9000);
SysTick_ITConfig(ENABLE);
/* 延时函数,延时nms */
void Delay(u32 nTime)
{
//开启SysTick计数器
SysTick_CounterCmd(SysTick_Counter_Enable);
TimingDelay = nTime;
while(TimingDelay != 0); //死等待
//关闭系统滴答
SysTick_CounterCmd(SysTick_Counter_Disable);
//清除SysTick 计数器
SysTick_CounterCmd(SysTick_Counter_Clear);
}
/* 中断处理函数 */
void SysTick_Handler(void)
{ /* 没有清除标志位,在计数为0时,同样可以进入中断处理函数实现TimingDelay自减工作 */
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
史海拾趣
|
DSP2812+CPLD(EPM240)+AD+液晶+键盘+时钟+人机的板子....,已经调试了一个星期,老板意思慢了,你说要多久? 虽然这是以往机器的升级版,以往使用mega128做的,程序有80K,现在用DSP2812+CPLD做,板子有很大,24cm*24CM,老板还是天天催,我 ...… 查看全部问答> |
|
各位大侠帮帮忙啊! 我把启动盘插入后,显示器上显示:v1.6+++++++++++++++。几行加号以后就停在那里不动了。 我的目标机处理器是p3的,网卡类型是Intel 8255x ethernet interface. ...… 查看全部问答> |
|
verilog 的代码: module bi4b(q,dout,din,ctr1); parameter wide = 3; inout[wide:0] q; input ctr1; input[wide:0] din; output[wide:0] dout; wire[3:0] q,dout; assign dout = (!ctr1) ? q : 4\'bz; assign q = (ctr1) ? din : 4\'bz; ...… 查看全部问答> |
|
EthernetPacketPut这个函数要怎么用啊?它里面的参数都要怎么设置呢?我要发送一个1214大小的以太网包,可是fcs校验总是0000,不知道为什么?… 查看全部问答> |
|
在CCS环境中,有 _bic_SR_register(x)、 _bic_SR_register_on_exit(x)、_bis_SR_register(x) 、 _bis_SR_register_on_exit(x) 、 _get_SR_register()、 _get_SR_register_on_exit() ...… 查看全部问答> |




