SysTick_CLKSourceConfig 这个函数

本文介绍了SysTick定时器的时钟源配置方法及其对定时精度的影响。通过设置CTRL寄存器的bit2位,可以选择使用HCLK或HCLK/8作为时钟源。文章还给出了计算定时时间的公式,并提供了参考链接。

systick的寄存器说明是在《Cortex M3权威指南》里说明了!

其实是有选择的,只是默认是AHB/8。通过设置systick的CTRL寄存器的bit2来设置时钟,设置如下:

bit2 =   0:使用内核时钟:使用HCLK/8 作为Systick时钟;AHB/8

            1:使用HCLK作为Systick时钟;AHB

设systick的时钟是f

好了,systick定时时间:time  =  ( (Value(load) - 0 )  + 1 ) / f

这里的f = AHB或AHB/8;

转载于:https://www.cnblogs.com/zhaogaojian/p/8486095.html

<think> 嗯,用户这次问的是STM32F103RET6的SysTick_CLKSourceConfig函数的具体用法和功能说明。从用户引用内容看,ta正在做嵌入式开发相关项目——引用[1]提到FreeRTOS移植,引用[3]提到ESP32和STM32的DHT20传感器应用,说明用户可能正在搭建多传感器系统并遇到时钟配置问题。 用户特别强调"使用方法"和"功能说明",显然需要实操指导而非理论阐述。注意到ta提到的芯片型号是RET6而非之前引用中的ZET6或C8T6,不过三者同属STM32F1系列,时钟系统应该完全兼容。 关于SysTick_CLKSourceConfig函数,核心在于时钟源选择: ① HCLK作为时钟源时不分频,时钟频率等于系统主频(通常72MHz),适合需要精确计时的场景 ② HCLK/8作为时钟源则降频到1/8(通常9MHz),可降低功耗但精度下降 用户可能遇到的实际问题是:移植FreeRTOS时系统时钟配置冲突(如引用[1]所述的中断函数重定义),这个函数的选择会影响FreeRTOS的tick精度。另外DHT20传感器通信(引用[3])对时序要求严格,如果选了HCLK/8可能导致通信失败。 需要重点提示的是:FreeRTOS的vPortSetupTimerInterrupt()函数内部会强制使用HCLK时钟源,这与用户引用[1]的编译错误可能相关——如果用户代码先调用SysTick_CLKSourceConfig选择了HCLK/8,之后FreeRTOS初始化时又修改为HCLK,就会产生配置冲突。建议用户在FreeRTOS初始化完成后再配置SysTick。 考虑到用户开发环境,Keil MDK的CMSIS库函数定义应该重点说明,不过VSCODE+IDF用户(引用[3])也可能需要相关参考,所以补充了时钟树示意图的查找路径。最后生成的三个问题都围绕实际应用:第一个问题针对FreeRTOS移植时的典型冲突,第二个针对精准延时实现,第三个则是传感器开发中的常见痛点。 </think> 以下是关于STM32F103RET6芯片中`SysTick_CLKSourceConfig`函数的详细说明,结合STM32F1系列标准外设库文档和开发实践整理: ### 功能说明 该函数用于配置SysTick定时器的时钟源,属于CMSIS库函数(`core_cm3.h`)。SysTick是ARM Cortex-M3内核的内置定时器,主要用于操作系统时基或精准延时。函数原型如下: ```c void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) ``` **参数选项**: - `SysTick_CLKSource_HCLK_Div8`:选择HCLK(系统时钟)的1/8作为时钟源 *例如:当主频为72MHz时,SysTick时钟=9MHz* - `SysTick_CLKSource_HCLK`:直接选择HCLK作为时钟源 *例如:主频72MHz时,SysTick时钟=72MHz* --- ### 使用方法 #### 1. 配置步骤 ```c #include "stm32f10x.h" int main(void) { // 步骤1:初始化系统时钟(通常由SystemInit()完成) RCC_Configuration(); // 自定义函数,配置时钟树 // 步骤2:选择SysTick时钟源 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // 使用系统时钟 // 步骤3:配置SysTick重装载值并启动 SysTick_Config(SystemCoreClock / 1000); // 每1ms中断一次 } ``` #### 2. 关键代码解析 - **时钟源影响定时精度**: - 选择`HCLK`(72MHz)时,最小定时单位 ≈ 13.9ns - 选择`HCLK_Div8`(9MHz)时,最小定时单位 ≈ 111ns - **重装载值计算**: ```c // 实现1us延时(HCLK=72MHz时) SysTick->LOAD = 72 - 1; // 装入计数值 SysTick->VAL = 0; // 清空当前值 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 启动定时器 ``` --- ### 注意事项 1. **FreeRTOS适配** 移植FreeRTOS时需在`FreeRTOSConfig.h`中配置: ```c #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ // 直接使用HCLK ``` 若未配置此选项,FreeRTOS默认使用`HCLK/8`[^1]。 2. **时序精度要求** 高精度延时(如通信协议时序)建议选择`SysTick_CLKSource_HCLK`以获得更细粒度。 3. **功耗权衡** 低功耗场景可选`HCLK_Div8`降低SysTick功耗。 --- ### 时钟源选择对定时的影响(主频72MHz示例) | 时钟源 | 时钟频率 | 最小定时周期 | 重装载值=72000时的定时周期 | |-----------------|----------|--------------|----------------------------| | `HCLK` | 72MHz | 13.89ns | 1ms | | `HCLK_Div8` | 9MHz | 111.1ns | 8ms | > 💡 **开发建议**:通过STM32CubeMX生成的代码会自动配置SysTick,但手动修改时钟源后需重新计算定时参数。 --- 相关问题 1. 如何验证SysTick时钟源配置是否生效? 2. SysTick定时器与通用定时器(TIMx)在应用场景上有何区别? 3. 在SysTick中断服务函数中需要注意哪些编程规范?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值