【嵌入式开发】从标准库到HAL库的学习(二)——HAL_Delay()详解——滴答定时器的使用

滴答定时器(时钟)

用途

各种算法需要的采样时间、外设模块需要的延时时间、测试所需的延时时间等,都可以使用SysTick
该功能不一定用作定时器,一种常规用法是直接读取SysTick->LOAD(定时器重装载值)、SysTick->VAL(定时器当前值)和SysTick->CTRL(第16位为定时器溢出标志,读一次清空)

系统结构树
//自上而下,逐级调用,配置系统时钟溢出时间
void main()
//用于配置各种系统参数
HAL_StatusTypeDef HAL_Init(void);
//弱函数,未重定向,该函数唯一参数用于分配滴答定时器优先级
//但内部有全局变量SystemCoreClock和uwTickFreq控制定时器溢出
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);
//如果SystemCoreClock不除以一个数的话,滴答定时器正好1s溢出一次
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));

以下为SystemCoreClock赋值的过程
使滴答定时器正好1s把SystemCoreClock计完,然后溢出

//自上而下,逐级调用,配置系统时钟溢出时间
void main();
void SystemClock_Config(void)HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos];
使用

使用起来实际上没有那么复杂,在cubeMX配置好the Cortex System Timer后
HAL_Delay()函数会调用滴答定时器的溢出情况(中断)来计时
上述提到的变量uwTickFreq(值来自宏HAL_TICK_FREQ_1KHZ==1),即让SysTick每1ms溢出一次
换句话说,HAL_Delay()函数的时基单元为1ms
我们也可以直接调用SysTick->LOAD和SysTick->VAL,来计算各种时间(如某一个函数的被调用频率)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值