运行环境

  • Windows10
  • STM32CubeMX Version 5.4.0
  • Keil5(MDK5) Version 5.28.0.0
  • 硬件开发板 F103RB-NUCLEO

简介

本例程主要讲解如何使用STM32在不用定时器的情况下使用微秒延时函数.


STM32CubeMx基本配置

基础配置过程请参考 STM32CubeMx开发之路—配置第一个项目


使用printf功能

重定向printf的过程请参考 STM32CubeMx开发之路—3发送USART数据和printf重定向

CubeMX配置

查看时钟树

  • CubeMX不需要什么特别的配置, 只需要查看一下时钟树就行了, 而且在代码中也有专门的接口调用, 这儿大家了解一下, 由下图可知, 系统的时钟为72M HZ.

代码修改

  • 本节的微秒延时主要是通过不断获取系统时间来实现的
  • main.c文件中添加如下函数代码
/*** @bieaf 微秒延时函数* @detail 注意:由于指令执行需要时间, 实际的延时精度约为1微秒** @param unsigned int Delay 延时的微秒*/
void delay_us(unsigned int Delay)
{uint32_t tickstart = SysTick->VAL;                            ///<获取当前tickuint32_t tickNum = 0;uint32_t tickMax = SysTick->LOAD + 1;uint32_t delay_usvalue = (tickMax / 1000) * Delay;            ///<计算一共需要延时的tickwhile(1){uint32_t cur_tick = SysTick->VAL;if (cur_tick > tickstart)                                 ///<进行了一次重载{tickNum = tickstart + (tickMax - cur_tick);}else                                                      ///<未进行过重载{tickNum = tickstart - cur_tick;}if (tickNum > delay_usvalue)                              ///<达到延时的tick数{return;}}
}

  • 在主函数main()中添加如下测试函数
while (1)
{static unsigned int start_time = 0;static unsigned int end_time = 0;/* USER CODE END WHILE *//* USER CODE BEGIN 3 */start_time = SysTick->VAL;    ///<延时前获取tickdelay_us(10);                 ///<延时end_time = SysTick->VAL;      ///<延时后获取tickprintf("delay time tick is %d\r\n", start_time - end_time); ///打印输出HAL_Delay(1000);
}
/* USER CODE END 3 */

  • 结果分析, 如下图所示:
  • 我们延时的时间为10us, 会发现tick相差的是756,是不是我们的延时函数错了呢?
  • 进一步分析, 系统时钟是72M HZ的, 也就是说1s系统时钟走72M次, 也就是说1us走72次
  • 10us的时间应该走72 * 10 = 720次,而我们测试的结果为756次, 多了36次约为0.5us
  • 这些时间是哪儿多出来的呢?
  • 如果你使用过汇编, 你可能就知道, 进出函数的跳转指令, 取指令, 读指令, …等各种指令需要时间的,多出来的时间就是那些时间造成的误差.
  • 有没有办法消除这些误差?
  • 办法是有的, 不过这和系统相关, 可以经过多次测试, 在延时函数里面减去多的这些时间误差, 这儿不详细说明, 一般对于要用的微秒延时的像软件IIC这样的功能, 这些误差是没有影响的,大可放心使用.

源代码获取

源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 )


STM32CubeMx开发之路—使用SysTick实现微妙延时函数delay_us()相关推荐

  1. STM32CubeMx开发之路—在线升级OTA

    文章目录 运行环境 简介 基础知识(1/4) STM32中的程序在哪儿? 进行分区 总体流程图 BootLoader程序 流程图分析 程序编写和分析 App程序 流程图分析 程序编写和分析 Ymode ...

  2. 嵌入式开发(7)系统定时器(SysTick)之延时函数运用

    目录 一.系统定时器 1. 简介 2.工作原理 3.频率的概念 二.库函数SysTick定时器操作 系统定时器配置 三.寄存器SysTick定时器操作 1.系统定时器的用途 2.寄存器 3.官方示例 ...

  3. 【STM32F103】嘀嗒定时器(Systick)_延时函数

    STM32嘀嗒定时器--延时函数 一 系统Systick定时器 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值.只要不把它 ...

  4. STM32CubeMx开发之路—LTDC驱动STM32F429I-Discover上的显示屏

    附件 源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 ) 运行环境 Windows10 STM32CubeMX Version 5.4.0 Keil5(MDK5) Version 5.28.0 ...

  5. STM32CubeMx开发之路—在线升级OTA—(进阶)

    运行环境 Windows10 STM32CubeMX Version 5.4.0 Keil5(MDK5) Version 5.28.0.0 硬件开发板 F103RB-NUCLEO 简介 之前的教程很多 ...

  6. 从头开始写STM32F103C8T6驱动库(四)——编写延时函数,详解Systick

    系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...

  7. STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中,对于直流电机来说,编码器至关重要,它不仅可以使我们对电极进行精确的速度闭环,位置闭环,还可以通过时间积分,根据运动学关系,获得速度.位置等信息 STM32的定时器有编码器模式,大大的 ...

  8. 【HAL库】STM32CubeMX开发----delay延时实验----NOP空指令

    STM32CubeMX 下载和安装 详细教程 [HAL库]STM32CubeMX开发----STM32F103/F207/F407----目录 前言 HAL库有自带的 ms级 延时函数: HAL_De ...

  9. 从零开始的 React 组件开发之路 (一):表格篇

    React 下的表格狂想曲 0. 前言 欢迎大家阅读「从零开始的 React 组件开发之路」系列第一篇,表格篇.本系列的特色是从 需求分析.API 设计和代码设计 三个递进的过程中,由简到繁地开发一个 ...

最新文章

  1. keras简单介绍与使用
  2. 视频导切台控制说明:RGBLink MiniPro初步测试
  3. Java程序员必看!2021Java大厂面试知识分享
  4. 搭建Nginx+Tomcat 负载均衡集群
  5. Zjnu Stadium HDU - 304 加权并查集
  6. 九张 Gif 图回顾 Web 设计的 25 年历史
  7. 超长正整数加法 c语言,两个超长正整数的加法
  8. 【leetcode】【动态规划】最长回文子序列
  9. 转:jdk动态代理实现
  10. 大型网站技术架构(五)--网站高可用架构
  11. java茌首字母_汉字获取拼音首字母(1)
  12. android vivo oppo 真机调试 apk、安装失败,系统老是报“解析包时出现问题”
  13. 前端必会的anime动画库
  14. PostgreSQL的学习心得和知识总结(一百一十七)|语法级自上而下完美实现MySQL数据库的 label:loop 的实现方案
  15. 学习【Cesium】第六篇,Cesium地图点云与地形的加载(学不会揍我)
  16. 破除匪夷所思bugs,从修正编译警告开始
  17. oracle 账号共享
  18. [Django] 单元测试小记
  19. xgboost 怎么读_当初零基础入学的小学生,现在怎么样了?妈妈:每天辅导到十点...
  20. c语言第七八次作业,二级C语言第七八次讲义.doc

热门文章

  1. python保存数据框_将pandas数据框的“Out[]表保存为figu
  2. 思科、华为、瞻博juniper、中兴、阿尔卡特中高端网络设备查看端口收发光功率-命令汇总
  3. MACD指标的数学意义解析
  4. GDPR is coming!
  5. Sox(Sound eXchange)一款强大的音频处理工具格式转化、切割音频、合并音频等
  6. Java并发编程-无锁CAS与Unsafe类及其并发包Atomic
  7. SUSE12安装SAP HANA 2.0内存数据库
  8. 人人都会设计模式:07-建造者模式--Builder
  9. 云扩科技与百胜数睿签署战略合作协议,加速超自动化平台落地零售行业
  10. Vmware安装Ubuntu Kylin麒麟系统图文