1.cubemx设置
参考文章
时钟设置
将HCLK设置为最大频率72MHz
NVIC设置
Time base: System tick timer 优先级默认为15,可以自己修改,没有其他中断的时候也可以不修改
2.使用函数
电平翻转
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
3.代码
第二篇文章有写微妙级别的延时函数,这次再写个毫秒级别的延时函数。
微秒级延时函数
void delay_us(int32_t nus)
{
int32_t temp;
// 假设系统时钟为72MHz,SysTick计时器每1/72微秒递减一次
SysTick->LOAD = 72 * nus - 1; // 设置LOAD的值为需要的微秒数乘以72,然后减去1
SysTick->VAL = 0x00; // 清空计数器
SysTick->CTRL = 0x01; // 使能SysTick,采用内核时钟源
do
{
temp = SysTick->CTRL; // 读取当前控制寄存器的值
}
while((temp & 0x01) && (!(temp & (1 << 16)))); // 等待计时器标志位,直到计时结束
SysTick->CTRL = 0x00; // 关闭计数器
SysTick->VAL = 0x00; // 清空计数器
}
毫秒级延时函数
void delay_ms(int32_t nms)
{
int32_t temp;
// 假设系统时钟为72MHz,每毫秒的时钟周期数为72000
// SysTick计时器每1/72MHz递减一次,即每14.2222ns递减一次
// 因此,每毫秒需要72000个时钟周期
SysTick->LOAD = (uint32_t)(72000 * nms - 1);
SysTick->VAL = 0x00; // 清空计数器
SysTick->CTRL = 0x01; // 使能SysTick,采用内核时钟源
do
{
temp = SysTick->CTRL;
}
while((temp & 0x01) && (!(temp & (1 << 16)))); // 等待时间到达
SysTick->CTRL = 0x00; // 关闭计数器
SysTick->VAL = 0x00; // 清空计数器
}
main里面的判断
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_GPIO_PIN);
HAL_GPIO_TogglePin(LED5_GPIO_Port,LED5_GPIO_PIN);
delay_ms(500);
/* USER CODE BEGIN 3 */
}
4.效果展示
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="f0jB9qRv-1712558189684" src="https://live.csdn.net/v/embed/377080"></iframe>视频
5.代码解释
delay_ms
和 delay_us
里面有寄存器操作,搬运手册上对这几个寄存器的解读。
SysTick Control and Status Register (SysTick->CTRL)
这个寄存器用于控制SysTick定时器的启动和停止,并提供一个状态位来指示定时器是否到达零。它的主要字段包括:
- ENABLE: 位0,用于启用或禁用SysTick计时器。设置为1时启用计时器,设置为0时禁用。
- TICKINT: 位1,控制SysTick达到零时是否触发中断。设置为1时,达到零值会触发中断。
- CLKSOURCE: 位2,选择SysTick的时钟源。设置为1时,使用系统时钟;设置为0时,使用外部参考时钟。
- COUNTFLAG: 位16,这是一个读取清除标志,当计数器从非零递减到零时设置。读取此寄存器会清除该位。
SysTick Reload Value Register (SysTick->LOAD)
这个寄存器用于设置SysTick定时器的倒计时起始值。当计时器启用并从LOAD寄存器的值递减到0时,如果启用了中断(TICKINT为1),则会产生一个中断。
- RELOAD: 位[23:0],用于设置计时器的重新加载值。这个值决定了计时器倒计时的长度。
SysTick Current Value Register (SysTick->VAL)
此寄存器包含当前计时器的倒计时值。写任何值到此寄存器会清除计时器值并清除COUNTFLAG位。
- CURRENT: 位[23:0],显示当前计数值。写入此寄存器会清零计数器和COUNTFLAG位。
这些寄存器联合使用,可以实现精确的时间延迟功能。例如,在配置SysTick->LOAD寄存器以设置所需的延迟时间,然后启动计时器通过设置SysTick->CTRL的ENABLE位。SysTick->VAL可以用于在延时期间随时读取当前计时器值,或者用于清零计时器。通过检查SysTick->CTRL的COUNTFLAG位,可以确定计时器是否已经倒计时到0,从而完成了延时操作。
标签:temp,CTRL,SysTick,Systick,计时器,寄存器,GPIO,ARM From: https://blog.csdn.net/aabbcce_/article/details/137507399