HAL库延时、SYCCNT与SYSTICK

探讨了在HAL库驱动中使用DWT替代SysTick进行精确延时的问题,特别是在涉及I2C、SPI等外设驱动时。文章介绍了DWT的CYCCNT寄存器作为向上计数器的工作原理,以及如何基于此实现HAL_InitTick()、HAL_GetTick()和HAL_Delay()函数的重写,以提供精确且不占用额外资源的延时解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HAL库驱动中,由于某些外设的驱动需要使用超时判断(比如I2C、SPI、SDIO等),需要精确延时(精度为1ms),使用的是SysTick,但是在操作系统里面,我们需要使用
SysTick来提供系统时基,那么就冲突了,怎么办?答案是利用DWT重新编写HAL库的相关延时和超时函数HAL_InitTick()、HAL_GetTick()和HAL_Delay(),这三个函数
在HAL库中都是弱定义函数(函数开头带__weak关键字)。

在Cortex-M内核里面有一个外设叫DWT(Data  Watchpoint  and  Trace), 该外设有一个32位的寄存器叫CYCCNT,它是一个向上的计数器, 记录的是内核时钟运行的个数,最
长能记录的时间为: 10.74s = 2的32次方/400000000  (CYCNNT从0开始计数到溢出,最长的延时时间与内核的频率有关,假设内核频率为400M,内核时钟跳一次的时间大概为
1/400M=2.5ns) ,当CYCCNT溢出之后,会清0重新开始向上计数。这种延时方案不仅精确,而且还不占用单片机的外设资源,非常方便。所以HAL库里面刚刚讲到的需要重写的
三个函数我们都基于CYCCNT的方案来实现----》摘录自RTT。

HAL库编译很慢,只有对于大内存的F7/H7才用HAL库

转载于:https://www.cnblogs.com/jieruishu/p/10304617.html

### STM32 HALSysTick系统滴答定时器的配置使用 #### 初始化过程 在STM32 HAL中,`HAL_Init()` 函数被用来初始化硬件抽象层。此函数内部会调用 `HAL_InitTick()` 方法来设置系统的滴答定时器[^3]。具体来说,`HAL_InitTick()` 调用了底层的 `SysTick_Config()` 来完成实际的配置工作。 默认情况下,在重置之后使用的时钟源为HSI(高速内部振荡器),并且通过定义宏 `TICK_INT_PRIORITY` 设置中断优先级,默认值为最低优先级15U。 #### 配置步骤详解 为了实现精确的时间管理功能,通常需要调整以下几个方面: - **时间间隔设定** 可以通过修改传递给 `HAL_InitTick()` 的参数或者直接操作 `SysTick->LOAD` 寄存器来自定义所需的延时周期。例如如果希望获得更短或更长的计数单位,则需重新计算加载到该寄存器中的数值以便匹配目标频率[^1]。 - **回调机制注册** 如果想要响应每次触发事件可以利用 HAL 提供的相关 API 注册自己的处理逻辑。比如当发生超时时执行某些特定的任务序列等行为模式可以通过自定义 handler 实现。 #### 示例代码展示 下面给出一段简单的例子演示如何基于 HAL 创建并启动一个每秒一次的循环打印消息程序: ```c #include "stm32f4xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while(1){ // 延迟一秒 HAL_Delay(1000); printf("One second passed.\n"); } } // 自定义 SysTick 中断服务例程 (可选) void HAL_IncTick(){ __IO uint32_t temp; /* Increment the global tick */ if ((temp = uwTickFreq) != 0UL){ uwTick += temp; }else{ uwTick++; } } ``` 上述代码片段展示了基本框架结构以及如何结合标准外设驱动一起工作的场景下运用 Systick 功能模块的方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值