日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32怎样实现延时?

發布時間:2024/3/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32怎样实现延时? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

答案是操作Systick系統嘀嗒定時器。這個定時器比較特殊,它屬于Cortex-M3處理器內核外設,故并非STM32所特有,而是所有以CM3為內核的MCU都具有的一種定時器。CM3提供了4個寄存器來控制Systick的行為,其中的校準數值寄存器不常用,一般只用到以下3個。

在core_cm3.h中對Systick寄存器的定義如下。SysTick_BASE表示SysTick控制及狀態寄存器的起始地址,SysTick_Type結構體的成員即為按地址順序排列的4個寄存器,SysTick就是把從SysTick_BASE開始的連續16個字節的區域定義為嘀嗒時鐘。



可以通過操作SysTick寄存器以實現系統延時,這里給出一種實現us級、ms級和s級延時的實現方法。以us級延時為例,首先設置了重裝載數值寄存器大小,這個值決定了每經過多長時間SysTick的當前倒計數值減為0,它取決于時鐘源的時鐘頻率。例如時鐘頻率為AHB72MHz的話,想實現1us定時,則LOAD寄存器設置為72,表示每經歷72個系統嘀嗒數SysTick完成一次倒計數過程,也就是經歷72*(1/72000000)s即1us。設置VAL寄存器為0,可清除CTRL寄存器的位COUNTFLAG。設置CTRL寄存器為5的意思是,將SysTick時鐘源設為內核時鐘即頻率為72MHz,設置位TICKINT為0即倒數到0時不發生異常請求,因為這里沒有使用SysTick中斷,設置位ENABLE為1使能定時器。到這里定時器配置就做完了,定時器開始倒計數。接著對于每一個微秒,在定時器倒計數過程期間,不斷查詢寄存器CTRL的位COUNTFLAG的值,如果該位變為1則表明一次倒計數過程完畢即經歷的1us,此時for循環跳到下一個微秒繼續重復此操作,最終實現延時目標微秒數。循環完成后操作CTRL寄存器關閉定時器。ms級延時的實現過程也一樣。

#define DELAY_1US_TICK_NUM (72) #define DELAY_1MS_TICK_NUM (72000) void delay_us(u32 nus) {u32 i;SysTick->LOAD = DELAY_1US_TICK_NUM;SysTick->VAL = 0;SysTick->CTRL = 5;for(i = 0;i < nus;i++) {while(!((SysTick->CTRL)&(1<<16))) {}}SysTick->CTRL = 0; } void delay_ms(u32 nms) {u32 i;SysTick->LOAD = DELAY_1MS_TICK_NUM;SysTick->VAL = 0;SysTick->CTRL = 5;for(i = 0;i < nms;i++) {while(!((SysTick->CTRL)&(1<<16))) {}}SysTick->CTRL = 0; } void delay_s(u32 ns) {delay_ms(ns*1000); }

總結

以上是生活随笔為你收集整理的STM32怎样实现延时?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。