STM32——滴答定时器设置1us问题

在DMA实验中
使用滴答定时器设置1us中断计时
串口输出计时信息

采用72Mhz无问题

SysTick_Config(SystemCoreClock / 1000000);

采用9Mhz 问题为串口没有发送成功

	SysTick_Config(9); 
  	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

解释:
使用systick_config()函数来实现计数,这个函数在下面代码中的SysTick_CTRL_TICKINT_Msk 开启了中断。如果你的系统时钟频率低于36MHz,最好不要让Systick 1us 中断一次,不然,系统的大部分时间都在执行中断程序。

### 实现 STM32F407 滴答定时器延时功能 对于 STM32F407 的滴答定时器 (SysTick Timer),可以利用其特性来创建精确的延迟函数。以下是具体实现方法: #### 使用 SysTick 定时器初始化 为了设置 SysTick 计数频率,通常会配置它以每毫秒中断一次的方式工作。 ```c #include "stm32f4xx.h" // 初始化 SysTick 用于产生周期性的中断 void systick_init(void){ if (SysTick_Config(SystemCoreClock / 1000)){ // 配置为每 ms 中断一次 while (1); // 如果配置失败,则进入死循环 } } ``` 上述代码通过 `SystemCoreClock` 获取当前系统核心时钟速度,并将其除以 1000 来获得每毫秒触发一次的时间间隔[^3]。 #### 创建延时函数 基于已经设定好的 SysTick 中断机制,下面定义两个简单的阻塞型延时函数——`delay_ms()` 和 `delay_us()`. ```c volatile uint32_t ticks; // 更新全局变量 'ticks' 的值 void SysTick_Handler(void){ ticks++; } // 延迟指定数量的毫秒 void delay_ms(uint32_t nms){ uint32_t cur_tick = ticks; while((ticks - cur_tick) < nms); } // 微秒级延迟(假设 SystemCoreClock 是固定的) void delay_us(uint32_t us){ __IO uint32_t temp; do { asm volatile ("nop"); temp = us * (SystemCoreClock / 1000000UL) >> 16; }while(temp-- != 0); } ``` 这段程序展示了如何使用硬件计数器配合软件逻辑完成精准时间控制的功能. #### 主要注意事项 - 当调用这些延时函数期间,其他任务会被挂起直到所需等待的时间结束; - 对于更复杂的实时操作系统环境下的应用开发,建议采用 RTOS 提供的标准 API 函数来进行调度管理而不是直接操作裸机上的 Systick.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值