在測試stm32 systick延時函式時,用的keil軟體**測試時間中發現延時500ms以內基本準確,當大於這個數值延時總是保持在500ms,出現問題,本著發現問題解決問題的思想,做如下實驗。
實驗**
static uint8_t fac_us=0;//us延時倍乘數
static uint16_t fac_ms=0;//ms延時倍乘數
//初始化延時倍乘數
void delay_init()
//nus延時函式
void delay_us(uint32_t nus)
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
systick->ctrl&=~systick_ctrl_enable_msk; //關閉計數器
systick->val =0x00; //清空計數器}//
//<=1864
void delay_ms(uint16_t nms)
while(temp&0x01&&!(temp&(1<<16)));
systick->ctrl&=~systick_ctrl_enable_msk;
systick->val =0x00;
} 測試前設定
option->target->72mhz option->debug->trace-> enable core clock = 72mhz
keil軟體測試時間
delay_init(); //time =
delay_us(100); //time = 0.00113824
delay_us(100);//time = 0.00124268
delay_us(100);//time = 0.00134714
delay_ms(100);//time = 0.00145176
delay_ms(100);//time =0.10145617
delay_ms(100);//time = 0.20146068
delay_ms(1000);//time = 0.71950460
總結:500ms以內計時基本準確,1s計時出錯
手動秒錶測試
delay_init(); //time =
delay_ms(500);//time = 1.08
delay_ms(500);//time = 2.10
delay_ms(500);//time = 3.32
delay_ms(1000);//time = 4.65
delay_ms(1000);//time = 6.19
delay_ms(1000);//time = 7.75
delay_ms(1500);//time = 9.74
delay_ms(1500);//time = 11.76
delay_ms(1500);//time = 13.77
總結:本人手速為0.5s左右,除去手速,個延時基本對應,也就是延時程式沒有問題,那麼問題來了,keil軟體有問題???(但是keil這個大的公司應該不會出現這種簡單的問題,估計是軟體本身**沒有設定對,繼續**~)
關於STM32F103精確延時
為了相容freertos,所以將延時函式統一規範,後續使用方便移植。此延時針對無晶振,示例為系統倍頻64mhz,型號 stm32f103c8t6。新建system資料夾,新增兩個檔案,delay.c和delay.h 以下為delay.c內容 其中系統已倍頻為64m include stm32f10x...
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
STM32F103啟動檔案
目錄 一 概述 二 彙編指令 2.1 equ 2.2 area 2.3 space 2.4 preserve8 2.5 thumb 2.6 export 2.7 dcd 2.8 proc 2.9 ldr 2.10 blx 2.11 bx 2.12 temport 2.13 b 2.14 if,els...