從一個厲害的國外工程師看來的delay寫法,使用while loop會使用幾個指令去計算,可能會需要多少時間。

while(variable--);

這行代碼執行一次預估會消耗MCU 4 clock cycles 的時間。可以透過Disassembly觀察出來。

但是在計算delay之前我們還必須知道,MCU執行一條指令需要花費多少時間。

所以我們透過GetClocksFreq去知道System clock大概需要花多少時間。

但是我們用的STM32F407,System clock = 168MHz,所以說我們需要168 Tick才能創造1us的Delay。

然而我們知道while loop會消耗掉4tick,假設我們要Delay 1us就必須做 168 Tick / 4 = 42 次的 while loop。

 void Delay_Init(void)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks); /* get system clock */
/* while loop takes 4 cycles */
/* for 1 us delay, we need to divide with 4M */
multipliter = RCC_Clocks.HCLK_Frequency / ;
}

其中第7行目的是為了取一個1us Delay的基礎倍數。可以理解成 System clock / (1MHz * 4 Tick)

multipliter = RCC_Clocks.HCLK_Frequency / ;

有了這些基礎知識,在去編程Us/Ms Delay就會相對容易而且不消耗MCU的外設資源

 void DelayUs(uint32_t micros)
{
/* multiply micro with multipliter */
micros = multipliter * micros - ;
/* 4 cycles for one loop */
while(micros--);
} void DelayMs(uint32_t mills)
{
/* multiply mills with multipliter */
mills = multipliter * mills * - ;
/* 4 cycles for one loop */
while(mills--);
}

最新文章

  1. [Java面试十二]数据库概念相关
  2. HTTP请求常见状态码
  3. C#使用DataSet Datatable更新数据库的三种实现方法
  4. BZOJ2610 : [Poi2003]Monkeys
  5. 笔记:ASP.NET MVC安全
  6. WPF GroupBox样式
  7. Spring MVC 学习笔记(整理)
  8. 提交(post)xml文件给指定url的2种方法
  9. jQuery选择器的优点
  10. linux下tomcat作为daemon进程运行
  11. 开发wordpress主题
  12. js介绍
  13. asp.net --> 初识WCF
  14. highchart 十字准星 crosshairs
  15. appium安装完成后运行和执行python脚本的错误合集
  16. CH#17C 舞动的夜晚
  17. [one day one question] webpack 打包报错 Cannot assign to read only property 'exports' of object '#<Object>'
  18. 配置MySQL接受远程登录连接
  19. 转:狄利克雷过程(dirichlet process )的五种理解
  20. hdu 4893Wow! Such Sequence!

热门文章

  1. wince驱动开发入门
  2. HtmlHelper扩展
  3. Base -快捷键|通配符|特殊符号|输出(正确与错误的保存)
  4. Windows下Memcached的安装配置方法
  5. Nginx+Tomcat集群+session共享
  6. Ubuntu 复制 拷贝和自适应屏幕
  7. jQuery基础教程-第8章-002Adding jQuery object methods
  8. CSS--抽屉(dig.chouti.com)页面
  9. SpringMVC——<mvc:annotation-driven/>
  10. 无限级分类及生成json数据