stm32f103c8t6在72M主频下DELAY_MS函数怎么写
时间: 2024-09-03 19:00:25 浏览: 51
ECU_103_C8T6.zip_103 c8t6_C8T6_STM32F103C8T6 CAN_ecu_stm32f103c8
STM32F103C8T6是ST公司生产的一款基于ARM Cortex-M3内核的中高端微控制器。它具备多种频率的时钟源,包括内部高速时钟(HSI)和外部高速时钟(HSE),并且可以通过锁相环(PLL)来实现更高的主频。在72MHz的主频下,要实现毫秒级的延时,通常会采用硬件定时器或者使用DWT(Data Watchpoint and Trace)单元来实现精确的延时函数。
但是,如果你没有使用任何操作系统,或者想要实现一个简单的软件延时函数,可以使用STM32F103C8T6的SysTick定时器(系统滴答定时器)。SysTick是一个从主时钟(HCLK)分频后的24位递减计数器,可以在不使用DWT的情况下提供一个简单的延时实现。
以下是一个基于SysTick定时器的`DELAY_MS`函数的简单示例:
```c
#include "stm32f10x.h"
void SysTick_Handler(void)
{
// 此函数在SysTick定时器溢出时由硬件自动调用
}
void DELAY_MS(uint32_t ms)
{
// 假设SysTick定时器已经配置好并且每隔1ms溢出一次
ms += (SysTick->LOAD - 1); // 加载初始值,因为SysTick是递减的,所以是LOAD值减1
SysTick->LOAD = ms; // 设置延时时间
SysTick->VAL = 0x00; // 清空当前值
SysTick->CTRL |= 0x01; // 使能SysTick定时器,并选择使用HCLK作为时钟源
while((SysTick->CTRL & 0x10000) == 0); // 等待SysTick定时器的CURRENT位变为1,表示计数完成
SysTick->CTRL &= ~0x01; // 禁用SysTick定时器
}
int main(void)
{
// 初始化代码...
while(1)
{
DELAY_MS(1000); // 延时1000ms
// 其他操作...
}
}
```
在上面的代码中,我们假设SysTick定时器已经被正确配置,每隔1ms产生一次溢出中断。在`DELAY_MS`函数中,我们首先设置SysTick定时器的计数值,然后使能定时器,并等待定时器溢出(通过等待CURRENT位变为1)。溢出后,定时器自动停止。
需要注意的是,这种方法并不推荐用于精确的时序控制,因为它依赖于SysTick定时器的中断处理,而中断响应时间会有一定的不确定性。此外,如果中断服务例程(ISR)被其他任务阻塞,实际的延时可能会更长。
阅读全文