RCC时钟设置和SYSTICK的疑问

在调试STM32 RCC时钟设置与SYSTICK时,发现时钟初始化函数SetupClock(void)影响了SYSTICK的精确延时。原本应每秒翻转一次的PB8电平变得不规律。经过研究,问题解决方法是仅保留外设时钟开启,避免修改HSE、PLLCLK和PLL设置。这可能是因为新版库已在启动文件中默认配置了时钟,无需重复配置。

最近在调试RCC时钟设置和SYSTICK的疑问,首先通过SYSTICK设置10ms一次的中断,使用这样的方式设置延时函数,这样是可以做到很精确的延时的,我的主函数代码如下:


这样运行结果是想要的,每一秒PB8电平翻转一次,OK.


但是当我想加入其它的时钟初始化时,比如系统里的各种时钟模块的初始化, 各种时钟模块的时钟开启后, 就影响了上面那个精确延时的运行, 使得上面的程序不是一秒一次点评翻转,而是很杂乱的感觉,

我所在主程序里添加的就是一个时钟初始化的函数,如下:


就是这个打圆点的函数, 这个函数的定义如下:



想不明白这是为什么,难道是void SetupClock(void)  这个函数里面的HSE,PLLCLK,PLL,还是其他的外设时钟的开启,影响到了SYSTICK的时钟?

后来把void SetupClock(void) 里面的语句都去掉,只留下了void RCC_DeInit(void),结果延时间隔变成了之前的八倍左右(估算的)。

望高手点拨~


此问题已经解决。

具体解决方法参见文档:“STM32_在KEIL_MDK环境下使用V3.4库.pdf”

<think>首先,用户的问题是关于ARMCortex-M系列中的SysTick定时器的时钟时钟频率配置方法。用户明确询问了“systick时钟源配置方法”。我需要在回答中遵循系统级指令:-行内数学表达式用$...$格式。-独立公式用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾添加引用标识,例如[^1]。用户提供了几个引用:-[^1]:SysTick定时器简介。-[^2]:ARMCortex-M架构介绍。-[^3]:ARMCortex-M3系列。-[^4]:SysTick时钟配置原理。这些引用是站内的,我需要自然地融入回答中。用户说“上述引用仅供参考”,但我应该基于这些内容来构建回答。回顾用户的问题:用户想了解SysTick时钟时钟频率配置方法。从引用中提取关键信息:-从[^1]:SysTick是一个24位的下计数定时器,可配置为周期性中断。-从[^4]:时钟配置原理。例如,系统时钟频率为24MHz时,设置LOAD寄存器为23,999以每1ms中断一次。SysTick时钟源通常是系统时钟或外部时钟。在ARMCortex-M中,SysTick可以配置为使用处理器时钟或外部参考时钟。配置方法:-SysTick有两个主要寄存器:CTRL(控制寄存器)、LOAD(重载寄存器)、VAL(当前值寄存器)。-在CTRL寄存器中,有CLKSOURCE位来选择时钟源:0表示外部时钟(如果可用),1表示处理器时钟。-时钟频率取决于选择的时钟源。如果选择处理器时钟,频率就是系统时钟频率。配置步骤:1.设置时钟源:通过CTRL寄存器的CLKSOURCE位。2.设置重载值:LOAD寄存器定义计数周期。例如,如果系统时钟是HCLK,频率为F,那么要每T秒中断一次,LOAD值应为F*T-1。3.启用中断定时器。用户指定了“ARMCortex-M”,所以我会基于此。在回答中,我需要:-结构清晰:逐步解释。-使用中文。-添加数学表达式:例如,计算LOAD值。-生成相关问题。-添加引用标识。大纲回答:1.**介绍SysTick**:简要说明SysTick是什么及其作用,引用[^1]。2.**时钟源配置**:解释如何配置时钟源,包括CTRL寄存器的位设置。3.**时钟频率配置**:解释如何设置LOAD值来定义频率。4.**示例**:给出一个配置示例,如[^4]中的例子。5.**代码或伪代码**:如果可能,提供配置寄存器的C代码示例。6.**相关问题**:在末尾生成相关问题。确保真实可靠:基于ARM文档提供的引用。最终回答结构:-开头解释。-分步骤配置方法。-数学表达式用于计算。-结尾相关问题。</think>### SysTick定时器的时钟时钟频率配置方法 SysTick定时器是ARM Cortex-M处理器中的一个内置系统定时器,用于生成周期性中断,适用于任务调度、时间延迟等功能[^1]。配置其时钟时钟频率涉及对SysTick寄存器的设置,主要包括时钟源选择(通过CTRL寄存器)重载值计算(通过LOAD寄存器)。下面我将逐步解释配置方法,确保内容真实可靠,基于ARM Cortex-M架构文档实际应用。 #### 1. **时钟源配置** SysTick时钟源可以通过SysTick控制状态寄存器(SysTick CTRL)的CLKSOURCE位来设置。这是一个1位字段,具体配置如下: - **CLKSOURCE = 0**:使用外部参考时钟(通常为AHB总线时钟除以8)。这适用于低功耗模式或特定外设需求。 - **CLKSOURCE = 1**:使用处理器时钟(通常为AHB总线时钟或系统时钟HCLK)。这是最常见的配置,提供最高精度。 配置步骤: - 访问SysTick CTRL寄存器(地址通常为0xE000E010)。 - 设置CLKSOURCE位:例如,在C代码中,使用位操作设置。 - 启用定时器:同时设置ENABLE位TICKINT位(如果需中断)。 示例代码(以C语言为例,适用于STM32等Cortex-M设备): ```c #include "stm32f10x.h" // 根据具体设备包含头文件 void SysTick_ConfigSource(void) { // 设置时钟源为处理器时钟(CLKSOURCE = 1) SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 可选:启用中断定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk; } ``` 此配置依赖于处理器时钟频率,通常在系统初始化时完成[^4]。 #### 2. **时钟频率配置** 时钟频率取决于选择的时钟LOAD寄存器的值。SysTick是一个24位下计数定时器,从LOAD值递减到0,然后触发中断并重载。频率计算公式为: $$ f_{\text{SysTick}} = \frac{f_{\text{clock}}}{(\text{LOAD} + 1)} $$ 其中: - $f_{\text{clock}}$ 是时钟源频率(单位Hz)。 - $\text{LOAD}$ 是SysTick LOAD寄存器的值(范围0到16,777,215)。 - 中断周期 $T = \frac{1}{f_{\text{SysTick}}} = \frac{\text{LOAD} + 1}{f_{\text{clock}}}$(单位秒)。 配置步骤: 1. 确定所需中断周期 $T$(例如,1ms)。 2. 获取时钟源频率 $f_{\text{clock}}$(例如,系统时钟频率)。 3. 计算LOAD值: $$ \text{LOAD} = (f_{\text{clock}} \times T) - 1 $$ 注意:LOAD值必须小于 $2^{24} - 1$(即16,777,215)。 4. 设置LOAD寄存器。 示例:假设系统时钟频率 $f_{\text{clock}} = 24\, \text{MHz}$(24,000,000 Hz),需要每1ms中断一次($T = 0.001\, \text{s}$)。 - 计算: $$ \text{LOAD} = (24,000,000 \times 0.001) - 1 = 24,000 - 1 = 23,999 $$ - 在代码中配置: ```c void SysTick_ConfigFrequency(uint32_t clock_freq, uint32_t period_ms) { // 计算LOAD值:LOAD = (f_clock * T) - 1,T = period_ms / 1000 uint32_t load_value = (clock_freq * period_ms) / 1000 - 1; SysTick->LOAD = load_value; // 设置重载值 // 确保VAL寄存器清零 SysTick->VAL = 0; } ``` 在实际应用中,如引用所述,当系统时钟为24MHz时,设置LOAD为23,999可实现每1ms中断[^4]。 #### 3. **注意事项** - **时钟源频率获取**:$f_{\text{clock}}$ 通常来自系统时钟配置(如HCLK),可通过RCC寄存器(在STM32中)或设备手册查询。 - **精度范围**:由于LOAD是24位整数,最大中断周期受限(例如,24MHz时钟时最大约0.7秒)。超出时需使用软件计数。 - **启动SysTick**:配置后,启用CTRL寄存器的ENABLE位启动定时器。 - **跨平台兼容**:所有ARM Cortex-M设备(如Cortex-M3/M4)使用相同机制,但具体寄存器地址可能因厂商(如STMicroelectronics)而异。建议参考设备数据手册[^3]。 SysTick配置是嵌入式开发的基础步骤,结合时钟源选择可优化功耗性能[^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值