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--;
}
}
上一篇:STM32F10x芯片RTC实时时钟
下一篇:STM32 Nucleo Shield显示板卡,简化超低功耗设备GUI设计
推荐阅读
史海拾趣
为了加速国际化进程,金宇半导体于2020年制定了详细的国际化战略。公司首先在欧洲设立了研发中心,以吸引更多国际顶尖人才加入。随后,金宇半导体又通过一系列并购整合动作,收购了多家在特定领域具有领先技术的海外企业。这些并购不仅增强了金宇半导体的技术实力和市场影响力,还为其在全球范围内的业务拓展提供了有力支持。通过国际化战略的实施,金宇半导体正逐步成为一家具有全球竞争力的半导体企业。
Crowd Supply Inc.深知社区是其发展的核心动力。因此,公司不仅在产品开发上积极吸纳社区意见,还在市场推广、技术支持等方面与社区紧密合作。通过举办线上线下的技术交流活动、设立社区奖励机制等方式,公司成功吸引并留住了一批忠实的社区成员。这些成员不仅为公司带来了稳定的用户基础,还通过口碑传播扩大了公司的品牌影响力。
在发展过程中,Carling Technologies还通过收购其他企业来增强自身实力。例如,公司收购了Maretron品牌,将其纳入旗下,并充分利用其在船舶监控和控制解决方案方面的优势,为前沿产品和解决方案的持续开发提供支持。这种收购与品牌整合的策略不仅丰富了公司的产品线,也扩大了其在特定市场的影响力。
面对行业技术的快速迭代,Austek Microsystems始终保持敏锐的洞察力。公司不断投入研发资金,引进先进的生产设备和技术人才,进行技术升级和产品迭代。通过不断地优化产品性能、提升生产效率,Austek Microsystems逐渐在市场中树立起了技术领先的形象。
FlexiPanel自成立以来,便深知技术创新对于企业发展的重要性。公司投入大量资源于RF模块的研发,特别是在蓝牙和ZigBee/IEEE802.15.4等无线通信技术领域取得了显著成果。通过不断优化模块性能、提升集成度,FlexiPanel成功推出了多款具有行业领先地位的产品,吸引了众多OEM厂商的关注。这些创新产品不仅满足了市场对于高性能、低功耗、易集成的RF模块需求,还帮助FlexiPanel在竞争激烈的电子市场中脱颖而出,实现了市场份额的快速增长。
Gem Asia Enterprise最初是一家专注于电子元件生产的小型制造商。面对激烈的市场竞争,公司决定加大研发投入,专注于开发新型半导体材料。经过数年努力,Gem Asia成功研发出一种高效能、低功耗的半导体材料,并成功应用于智能手机和可穿戴设备中。这一创新不仅显著提升了产品的市场竞争力,还吸引了多家国际知名电子品牌的合作,使Gem Asia迅速在电子行业中崭露头角。
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 IBM在微电子方面的创新以及公司在单芯片系统设计方面的基础性工作已经改变了整个半导体世界。IBM的创造性成果包括高K值——增强了晶体管的功能同时使其超越了当今的局限,另外还包括双 ...… 查看全部问答∨ |
|
非常简单的实例主程序 #define HWREG(x) (*((volatile unsigned long *)(x))) #define SYSCTL_BASE 0x400FE000 #define RCGC2 (SYSCTL_BASE + 0x108) #define GPIOA_BASE 0x4000 ...… 查看全部问答∨ |
大家在用的WINCE60对SD卡支持的容量最大是多少?我的怎么只能支持2GB的SD卡?怎么改大? 大家在用的WINCE60对SD卡支持的容量最大是多少?我的怎么只能支持2GB的SD卡?怎么改大?… 查看全部问答∨ |
已经把boot.bin烧写到block 0 把EBOOT.nb0烧写到block 2 上 连接好dnw2410 ,打开电源,dnw2410上没有回显的信息。 我怀疑是数据线问题,可是数据线是新的,但把下串口数据线dnw2410上依然显示连接上的信息 怎么能判断串口数据线是否连接到arm9 ...… 查看全部问答∨ |
|
AT89C51为8051系列中比较通用的1个芯片,如果用C语言编写程序,子函数可以被调用最大多少层,为什么? 不知道怎么考虑 从RAM空间,堆栈深度考虑吗? C语言调用函数时,入栈的除了ACC,DPTR,通用寄存器还有什么,子函数被调用时单片机是如何动作的… 查看全部问答∨ |