STM32F1与STM32CubeIDE快速入门DWT精确延时
STM32F1与STM32CubeIDE快速入门-DWT精确延时
DWT(Data Watchpoint and Trigger)精确延时
文章目录
1、DWT介绍
在 Cortex-M3 中,有一个外设叫做 DWT(Data Watchpoint and Trigger),用于系统调试和跟踪,同时也具备延时功能。

DWT之所以能实现延时功能,是因为它有一个32位的计数器CYCCNT,它是一个向上计数的计数器。 溢出时会自动复位并重新开始向上计数。 它的频率是内核的主频率。 简单来说,如果内核时钟跳动,则CYCCNT计数器将增加 1。因此DWT可以代替定时器外设来实现延时功能和测量代码运行时间的功能,但是DWT 不能替代定时器的其他功能。
DWT 计数器的精度与系统的主频有关。比如,STM32F103的主频是72MHz,其精度为1 / 72MHz = 14纳秒,这足以满足大部分延时功能的要求。 同理,程序的运行时间为微秒级,远远满足衡量代码运行时间的要求。
2、DWT配置
DWT实现延时的功能,需要使用到三个寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。具体配置并使用DWT的步骤如下:
- 先使能DWT外设,由内核调试寄存器DEMCR的位24控制,设置为1使能
- 启用CYCCNT寄存器之前,先将其设置为零。
- 启用CYCCNT寄存器,它由DWT的CYCCNTENA 控制,也就是DWT控制寄存器的位0控制,设置为1使能
STM32CubeIDE创建工程、系统配置、调试配置,在这里不再做介绍,请参考:
- STM32F1与STM32CubeIDE快速入门-开发环境搭建
- STM32F1与STM32CubeIDE快速入门-GPIO概述与点亮LED
- STM32F1与STM32CubeIDE快速入门-USART/UART串口通信
具体实现如下:
2.1 基本定义
1 | /\* |
2.2 DWT延时初始化
1 | uint8\_t dwt\_init(void) { |
2.3 DWT延时实现
1 | void dwt\_delay\_us(volatile uint16\_t us) { |
2.4 简单使用
1 | /\* Private includes ----------------------------------------------------------\*/ |
3、STM32F1与STM32CubeIDE系列文章
3.1 STM32F1与STM32CubeIDE快速入门
- 3.1.5 STM32F1与STM32CubeIDE快速入门-中断、NVIC与EXTI概述 |
- 3.1.6 STM32F1与STM32CubeIDE快速入门-外部中断配置与功能实现
- 3.1.7 STM32F1与STM32CubeIDE快速入门-USART/UART串口通信
- 3.1.8 STM32F1与STM32CubeIDE快速入门-定时器(Timer)概述
- 3.1.9 STM32F1与STM32CubeIDE快速入门-定时器定时模式
- 3.1.10 STM32F1与STM32CubeIDE快速入门-定时器计数模式
- 3.1.11 STM32F1与STM32CubeIDE快速入门-定时器PWM模式
- 3.1.12 STM32F1与STM32CubeIDE快速入门-定时器编码(Encoder)模式
- 3.1.13 STM32F1与STM32CubeIDE快速入门-定时器输入捕获模式(Input Capture Mode)实现频率计数
- 3.1.14 STM32F1与STM32CubeIDE快速入门-DMA概述
- 3.1.15 STM32F1与STM32CubeIDE快速入门-USART通过DMA进行数据接收与发送
- 3.1.16 STM32F1与STM32CubeIDE快速入门-ADC概述
- 3.1.17 STM32F1与STM32CubeIDE快速入门-ADC轮询方式实现PWM调光器
- 3.1.18 STM32F1与STM32CubeIDE快速入门-ADC中断方式实现PWM调光器
- 3.1.19 STM32F1与STM32CubeIDE快速入门-ADC通过DMA方式与PWM实现调光器
- 3.1.20 STM32F1与STM32CubeIDE快速入门-DAC概述
- 3.1.21 STM32F1与STM32CubeIDE快速入门-SPI概述
- 3.1.22 STM32F1与STM32CubeIDE快速入门-M25P16串行闪存驱动
- 3.1.23 STM32F1与STM32CubeIDE快速入门-I2C概述
- 3.1.24 STM32F1与STM32CubeIDE快速入门-I2C驱动LCD1602显示屏(基于PCF8574)
- 3.1.25 STM32F1与STM32CubeIDE快速入门-独立看门狗(IWDG)
- 3.1.26 STM32F1与STM32CubeIDE快速入门-OLED-SSD1306-I2C驱动
- 3.1.27 STM32F1与STM32CubeIDE快速入门-USB虚拟串口(CDC)
- 3.1.28 STM32F1与STM32CubeIDE快速入门-SD卡驱动-SDIO+FatFs
- 3.1.29 STM32F1与STM32CubeIDE快速入门-USB+SDIO+FatFs实现U盘
3.2 STM32F1与STM32CubeIDE编程实例
- 3.2.1 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2配置(基于FreeRTOS)
- 3.2.2 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2-线程管理
- 3.2.3 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS v2-延时
- 3.2.4 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2-定时器管理
- 3.2.5 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2-互斥(Mutex)管理
- 3.2.6 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2-信号量(Semaphore)
- 3.2.7 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2-消息队列
- 3.2.8 STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS V2-事件标志(Event Flags)
文章来源: https://iotsmart.blog.csdn.net/article/details/124801263
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 秋意寒!
评论