已解決:大家使用原子哥的延時函式delay_ms、delay_us會出現進入延時函數出不來的情況!!!
阿新 • • 發佈:2019-02-13
首說明先原子哥的延時函式沒有問題。原子哥的延時函式有的是用在STM32F103中的,要看自己的開發板是那個型別。這裡給出STM32F103和STM32F030的延時函式。
(1)用在STM32F030中:
#include "stm32f0xx.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// //本程式只供學習使用,未經作者許可,不得用於其它任何用途 //Mini STM32開發板 //使用SysTick的普通計數模式對延遲進行管理 //包括delay_us,delay_ms //正點原子@ALIENTEK //技術論壇:www.openedv.com //修改日期:2010/5/27 //版本:V1.2 //版權所有,盜版必究。 //Copyright(C) 正點原子 2009-2019 //All rights reserved //******************************************************************************** //V1.2修改說明 //修正了中斷中調用出現死迴圈的錯誤 //防止延時不準確,採用do while結構! ////////////////////////////////////////////////////////////////////////////////// static u8 fac_us=0;//us延時倍乘數 static u16 fac_ms=0;//ms延時倍乘數 //初始化延遲函式 //SYSTICK的時鐘固定為HCLK時鐘的1/8 //SYSCLK:系統時鐘 void delay_init(u8 SYSCLK) { SysTick->CTRL&=0xfffffffb;//bit2清空,選擇外部時鐘 HCLK/8 fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } //延時nms //注意nms的範圍 //SysTick->LOAD為24位暫存器,所以,最大延時為: //nms<=0xffffff*8*1000/SYSCLK //SYSCLK單位為Hz,nms單位為ms //對72M條件下,nms<=1864 void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms;//時間載入(SysTick->LOAD為24bit) SysTick->VAL =0x00; //清空計數器 SysTick->CTRL=0x01 ; //開始倒數 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待時間到達 SysTick->CTRL=0x00; //關閉計數器 SysTick->VAL =0X00; //清空計數器 } //延時nus //nus為要延時的us數. void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //時間載入 SysTick->VAL=0x00; //清空計數器 SysTick->CTRL=0x01 ; //開始倒數 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待時間到達 SysTick->CTRL=0x00; //關閉計數器 SysTick->VAL =0X00; //清空計數器 }
(2)用在STM32F103中: