使用systick写一个ms级的延时函数
时间: 2023-11-28 22:47:08 浏览: 59
好的,以下是使用Systick编写的延时函数,可以实现以毫秒为单位的延时:
```c
void delay_ms(uint32_t ms) {
uint32_t start_time = HAL_GetTick();
while (HAL_GetTick() - start_time < ms);
}
```
在这个函数中,我们使用了 `HAL_GetTick()` 函数获取当前的系统时钟计数器。该函数返回的值是自系统启动以来的毫秒数。我们将其存储在 `start_time` 变量中,然后在一个循环中检查当前时间是否超过了 `start_time + ms`,如果没超过,就继续循环等待,直到延时完成。
注意,这个函数在使用之前需要确保Systick定时器已经被初始化,并且中断为开启状态。
相关问题
使用systick写一个ms级的延时函数并延时点灯
好的,以下是使用systick写一个ms级的延时函数并延时点灯的示例代码:
```c
#include "stm32f10x.h"
volatile uint32_t msTicks; // 定义一个全局变量作为毫秒计数器
void SysTick_Handler(void)
{
msTicks++; // 每次SysTick中断发生时,毫秒计数器加 1
}
void Delay_ms(uint32_t ms)
{
uint32_t startTicks = msTicks; // 记录当前的毫秒计数器值
while ((msTicks - startTicks) < ms); // 等待毫秒计数器增加到指定的毫秒数
}
int main(void)
{
// 初始化 SysTick 计数器,设置定时周期为 1ms
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock / 1000);
// 初始化 LED 端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 点亮 LED
Delay_ms(500); // 延时 500ms
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 熄灭 LED
Delay_ms(500); // 延时 500ms
}
}
```
在这个示例代码中,我们定义了一个全局变量 `msTicks` 作为毫秒计数器,并在 `SysTick_Handler` 函数中每次 SysTick 中断发生时将其加 1。然后,我们实现了一个 `Delay_ms` 函数,用于让程序等待一定的毫秒数。这个函数首先记录当前的毫秒计数器值,然后不断检查毫秒计数器是否增加到指定的毫秒数,直到达到目标值为止。最后,我们在主函数中使用这个 `Delay_ms` 函数来延时点灯,每隔 500ms 点亮和熄灭 LED。
使用systick库函数写一个ms级的延时函数
以下是使用systick库函数编写的ms级延时函数:
```c
#include "stm32f4xx.h"
void SysTick_Handler(void) {
// 空函数,不需要做任何事情
}
void delay_ms(uint32_t ms) {
// 配置SysTick定时器
SysTick->LOAD = (uint32_t)(ms * (SystemCoreClock / 1000));
SysTick->VAL = 0x00;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待定时器计数完成
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk); // 关闭定时器
}
```
使用方法:
```c
int main(void) {
// 初始化SysTick定时器
SysTick_Config(SystemCoreClock / 1000);
// 延时1秒
delay_ms(1000);
// 无限循环
while(1) {
}
}
```
注意:在使用此延时函数前,需要先初始化SysTick定时器。在本例中,我使用了`SysTick_Config`函数来初始化SysTick定时器,并将SysTick定时器的时钟源配置为系统时钟,每隔1ms触发一次中断。由于SysTick定时器的计数值是由CPU时钟除以预分频值得到的,因此在不同的MCU上可能需要根据实际情况调整代码中的`SystemCoreClock`值。
阅读全文