基于STM32F105利用滴答定时器写一个延时函数
时间: 2023-07-18 16:43:46 浏览: 102
好的,关于您的问题,我可以提供以下的延时函数代码示例,基于STM32F105芯片的滴答定时器:
```c
#include "stm32f10x.h"
void delay_ms(uint32_t ms)
{
uint32_t i;
SysTick->LOAD = 9000; //设置重载值,一个时钟周期是9ns,所以9*9000=81000ns=81us,即1ms=81us*12
SysTick->CTRL = 0x01; //使能计数器
for(i = 0; i < ms; i++)
{
while((SysTick->CTRL & 0x10000) == 0); //等待计数器计数到0
}
SysTick->CTRL = 0x00; //关闭计数器
SysTick->VAL = 0x00; //清空计数器值
}
```
该函数可以实现毫秒级别的延时,调用方法如下:
```c
delay_ms(1000); //延时1秒
```
其中,SysTick是STM32F105芯片内置的一个定时器,可以用来实现延时功能。以上代码中,我们设置了SysTick的重载值为9000,即让计数器每计数到9000就表示过去了81us,那么计数ms个81us就可以实现ms毫秒的延时。在for循环中,我们使用了一个while循环来等待计数器计数到0,即等待延时结束。最后,我们关闭了计数器并清空了其值,以便下一次使用。
相关问题
STM32F072C8T6 基于滴答定时器的微秒级延时函数代码
以下是基于滴答定时器的微秒级延时函数代码:
```c
#include "stm32f0xx.h"
static __IO uint32_t uwTimingDelay;
void Delay_Init(void) {
if (SysTick_Config(SystemCoreClock / 1000000)) {
while (1);
}
}
void Delay_Us(uint32_t us) {
uwTimingDelay = us;
while(uwTimingDelay != 0);
}
void SysTick_Handler(void) {
if (uwTimingDelay != 0) {
uwTimingDelay--;
}
}
```
使用方法:
1. 在 main 函数中调用 Delay_Init() 函数进行初始化。
2. 在需要延时的地方调用 Delay_Us(us) 函数,其中 us 为需要延时的微秒数。
需要注意的是,这个延时函数是基于 SysTick 定时器实现的,因此需要先开启 SysTick 定时器。同时,SysTick 定时器的时钟频率要与 CPU 的时钟频率相同,这里是 1MHz。如果你的 CPU 时钟频率不同,需要修改 SysTick_Config() 函数中的参数。
stm32 滴答定时器做一个非阻塞式的延时函数
好的,针对您的问题,我可以为您提供以下代码实现:
```c
#include "stm32f10x.h"
volatile uint32_t ticks; //定义全局变量,用于计时
void SysTick_Handler(void)
{
ticks++; //每1ms递增1
}
void delay_ms(uint32_t ms)
{
uint32_t start = ticks; //记录开始时间
while((ticks - start) < ms); //当时间未达到所需延时时间时,一直循环
}
int main()
{
SystemInit(); //系统初始化
SysTick_Config(SystemCoreClock / 1000); //配置滴答定时器,每1ms中断一次
while(1)
{
//调用延时函数,延时1000ms
delay_ms(1000);
//执行其他操作
//...
}
}
```
以上代码中,我们使用了STM32的滴答定时器作为计时器来实现延时函数。在SysTick_Handler中,我们将ticks变量递增1,表示经过了1ms。在delay_ms函数中,我们记录下开始时间start,然后通过不断检查ticks-start是否达到所需延时时间ms来判断是否结束延时,如果时间未达到,则一直循环等待。
需要注意的是,以上代码是非阻塞式的延时函数,因此在调用delay_ms函数时,可以同时执行其他操作。
阅读全文