娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

最近在做一個東西時,發現一個現象。之前一直沒有發現過,或者發現也沒有仔細研究過,在此為大家分享。


在使用原子哥的延時函數時,發現主函數里面的延時函數失效了。沒有起任何作用。下面簡單分析一個整個過程。


先直接上代碼,很簡單的一個實例


int main(void)

{

 

delay_init();                              //延時函數初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級

uart_init(115200);              //串口初始化為115200

  LED_Init();      //LED端口初始化

UltrasonicWave_Configuration();      //IO口初始化

  TIM5_Cap_Init(0XFFFF,72-1);      //以1Mhz的頻率計數 

        TIM7_Int_Init(99,7199);              //10ms 超聲波定時

        while(1)

{

LED1=!LED1;        

delay_us(50);

  delay_ms(1000);

        delay_ms(1000);

delay_ms(1000);

 

}


}


主循環里面做一個電平翻轉,一個LED燈一亮一滅。


但是發現沒有執行延時函數,LED一直快閃。


經過調試發現,我在一個定時器中斷函數里面有個延時函數造成了主函數里面的延時失效。


void TIM7_IRQHandler(void)

{

if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中斷

{    

TIM_ClearITPendingBit(TIM7, TIM_IT_Update  );  //清除TIM7更新中斷標志  

time_count++;

                switch (time_count)

{

case 1:

GPIO_SetBits(TRIG_PORT,TRIG_PIN_1);   //送>10US的高電平

        delay_us(20);                           //延時20US

GPIO_ResetBits(TRIG_PORT,TRIG_PIN_1);

break;


case 2:

        GPIO_SetBits(TRIG_PORT,TRIG_PIN_2);   //送>10US的高電平

                          delay_us(20);                           //延時20US

                          GPIO_ResetBits(TRIG_PORT,TRIG_PIN_2);

break;


case 3:

GPIO_SetBits(TRIG_PORT,TRIG_PIN_3);   //送>10US的高電平

                                delay_us(20);                       //延時20US

                                GPIO_ResetBits(TRIG_PORT,TRIG_PIN_3);

break;


case 4:

GPIO_SetBits(TRIG_PORT,TRIG_PIN_4);   //送>10US的高電平

                                delay_us(20);                       //延時20US

                                GPIO_ResetBits(TRIG_PORT,TRIG_PIN_4);

break;

}

if(time_count==4)

time_count=0;

}     

}


因為實際需要操作4個超聲波模塊,所以我在一個定時中斷里面選擇了延時函數來進行操作。


后來經發現這也是造成主函數延時失效的原因


下面進行分析


//初始化延遲函數

//當使用OS的時候,此函數會初始化OS的時鐘節拍

//SYSTICK的時鐘固定為HCLK時鐘的1/8

//SYSCLK:系統時鐘

void delay_init()

{

#if SYSTEM_SUPPORT_OS  //如果需要支持OS.

u32 reload;

#endif

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鐘  HCLK/8

fac_us=SystemCoreClock/8000000; //為系統時鐘的1/8  

#if SYSTEM_SUPPORT_OS          //如果需要支持OS.

reload=SystemCoreClock/8000000; //每秒鐘的計數次數 單位為K    

reload*=1000000/delay_ostickspersec;         //根據delay_ostickspersec設定溢出時間

//reload為24位寄存器,最大值:16777216,在72M下,約合1.86s左右

fac_ms=1000/delay_ostickspersec; //代表OS可以延時的最少單位    

 

SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;    //開啟SYSTICK中斷

SysTick->LOAD=reload; //每1/delay_ostickspersec秒中斷一次

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;    //開啟SYSTICK    

 

#else

fac_ms=(u16)fac_us*1000; //非OS下,代表每個ms需要的systick時鐘數   

#endif

}


延時初始化函數,SysTick 的時鐘源自 HCLK 的 8 分頻,我所使用是外部晶振為 8M,然后倍頻到 72M,那么 SysTick 的時鐘即為 9Mhz,也就是 SysTick 的計數器 VAL 每減 1,就代表時間過了 1/9us。


原子哥提供的延時函數


void delay_us(u32 nus)

{

u32 temp;      

SysTick->LOAD=nus*fac_us; //時間加載      重新加載寄存器值從這個值開始進行倒數

SysTick->VAL=0x00;        //清空計數器       當前寄存器值清0

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數   

do

{

temp=SysTick->CTRL;

}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達   

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器

SysTick->VAL =0X00;      //清空計數器  

}

//延時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|=SysTick_CTRL_ENABLE_Msk ; //開始倒數  

do

{

temp=SysTick->CTRL;

}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達   

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器

SysTick->VAL =0X00;               //清空計數器       


通過查看SysTick控制及狀態寄存器 


上圖對應的寄存器名稱分別為:


CTRL  :控制和狀態寄存器


LOAD  :重新加載值寄存器


VAL :當前值寄存器


CALIB :校準寄存器


在主循環中,執行delay_ms(1000)函數,要延時的 ms 數換算成 SysTick 的時鐘數,然后寫入 LOAD 寄存器。然后清空當前寄存器 VAL 的內容,再開啟倒數功能。等到倒數結束。 此時進入中斷服務函數,執行delay_us(20)函數,又重新將延時的us數換算成SysTick 的時鐘數,然后寫入 LOAD 寄存器。然后清空當前寄存器 VAL 的內容,再開啟倒數。


當中斷執行完后,主函數繼續執行,但是此時LOAD寄存器里面的值已經被改變(被中斷函數里面的延時函數改變),不在是最初計算的那個值。


所以就會出現上面的情況。


所以,最后我直接寫了一個類似51里面的延時函數去解決這個問題,雖然我覺得很low


關鍵字:stm32  正點原子  delay  延時函數 引用地址:stm32 使用正點原子delay延時函數,主函數延時失效

上一篇:stm32 奇怪的位賦值問題 出錯了
下一篇:stm32f103 學習筆記 —— 05 使用SysTick實現硬件延時

推薦閱讀

? ? ? ? 12月24日下午,小米Play正式發布。小米聯合創始人、小米總裁林斌介紹,小米Play是小米全新手機品類,定位高品質入門手機。  該機售價1099元,有趣的是在小米Play發布會結束后,聯想手機官方微博發聲:是受我們的點撥嗎?來,Play一下,鏈接為聯想Z5s官網預約頁面。  該機是聯想本月推出的千元新機,起售價1399元。它采用6.3英寸微孔水...
據外媒報道,最新調查顯示,到 2025 年,中國近 5%的勞動力將被機器人取代,全文如下: 武漢大學質量發展戰略研究院一項最新調查結果顯示,未來 5 年,機械和機器人將取代中國近 5%的工人。調查發現,使用了機器人的企業占比從 2008 年的約 12%上升到 2017 年的 37%。僅從 2015 年到 2017 年,使用機器人的企業占比就從 8.1%上升到 13.4...
  12月24日,國家電投集團250kW/1.5MWh鐵-鉻液流電池光儲示范項目在張家口戰石溝光伏電站投入運行,這是集團公司打造的百千瓦級鐵鉻液流電池首座示范電站,在全國鐵鉻液流電池儲能項目應用中尚屬首例。   該項目所采用的鐵-鉻液流電池儲能技術在長時間能量存儲場景中具備突出優勢,并且可以有效適應高溫與嚴寒天氣帶來的不良影響,安全性能顯著。...
此前一批批Galaxy S21 FE的消息泄露而來,讓我們或多或少確定了設計、規格和發售時間框架。而今天的消息則來直接自零部件渠道,一組所謂Galaxy S21 FE的顯示屏和框架的正品更換套件泄露了這款吊了大家半年胃口的新機的更多細節:該部件的報價為185歐元。  不過需要注意的是,185歐元是一個總成的價格,還但有一個更便宜的119歐元的選擇,...

史海拾趣

問答坊 | AI 解惑

變頻器壓頻比的正確設定

摘 要: 結合變頻調速的基本控制方式,討論了電機參數及負載的機械特性與變頻器的基準電壓、基準頻率的關系,以及具體應用中的設定方法。 關鍵詞: 壓頻比、基準電壓、基準頻率。 一、前 言: 隨著變頻調速技術的發展,變頻器調速已成為交流調速的 ...…

查看全部問答∨

請教浙江中控是個怎樣的企業

有想法想去這里工作,但好像挺難進入的,浙江中控在業界是個怎么樣的企業呢,希望聽大家講講…

查看全部問答∨

32位ARM嵌入式處理器的調試技術

32位ARM嵌入式處理器的調試技術…

查看全部問答∨

ICC錯誤集錦 看懂ICC AVR的報錯

  新手用ICC編程的時候,經常會出現一些錯誤,現在將常見的錯誤報告整理如下。這里的一些錯誤是我為了展示而故意制造的,歡迎你提供你遇到的錯誤。排名不分先后: 一、正常編譯通過CODE: C:\icc\bin\imakew -f main.mak   icc ...…

查看全部問答∨

好書分享——2001國賽一等獎和sony杯作品

本帖最后由 paulhyde 于 2014-9-15 03:44 編輯 好書分享。2001國賽一等獎和sony杯作品  …

查看全部問答∨

誰來救救我啊 我的ARM開發板NFS掛不上

我用的是UBUNTU 9.10,已經在電腦上建立好了編譯環境,開發板上也按說明燒好了內核和BOOTLOADER了的,下面是串口終端的打印結果: U-Boot 1.2.0-utulinux_s3c2440_bootloader (Oct  7 2008 - 23:05:31) DRAM:  64 MB Flash: ...…

查看全部問答∨

芯片拉低總線電平的能力是由什么決定的?

RT,可以舉些例子么? 偶一直認為芯片想拉低一個釋放的總線電平時,就是內部一個三級管導通使總線接地,這樣最多有個0.幾V的導通飽和電壓吧,但為什么有時最低只能 拉到1、2V那么高?…

查看全部問答∨

模擬USB拔插的邏輯過程

目標:想要實現USB設備拔插的模擬。也就是說,物理上USB設備并沒有拔出再插入的動作,但是在邏輯上,USB設備掉了,然后又重新連接上了。現在這個功能基本能實現,但是不穩定,容易出現USB設備掉。 我自己寫了一個小的字符驅動(usbPortdisplay.c) ...…

查看全部問答∨

把c換成匯編程序,謝謝

把c換成匯編(asm)程序,謝謝!在附件中各位兄弟姐妹,在下沒學過C,但是呢,又急需這份程序,謝謝啊,挺急用的,能幫幫忙不?謝謝!    [ 本帖最后由 qwert99 于 2010-12-12 11:45 編輯 ]…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 尚志市| 呈贡县| 铁岭市| 江城| 曲松县| 靖远县| 玉屏| 桃江县| 巴林右旗| 定日县| 江阴市| 呼图壁县| 措美县| 维西| 娄烦县| 汝城县| 镇江市| 腾冲县| 临汾市| 黄山市| 壤塘县| 崇文区| 白城市| 禹州市| 肇庆市| 贵定县| 正宁县| 兰坪| 江达县| 天水市| 达孜县| 阆中市| 类乌齐县| 玉门市| 安泽县| 若羌县| 平罗县| 武隆县| 南漳县| 竹溪县| 阳谷县|