找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2043|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

關(guān)于STM32單片機(jī)自己寫(xiě)delay函數(shù)的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
大佬們,雖然說(shuō)STM32單片機(jī)自帶一個(gè)嘀嗒定時(shí)器可以實(shí)現(xiàn)延遲,但是我現(xiàn)在想在KEIL里寫(xiě)了一個(gè)1s的delay延遲函數(shù),然后我想通過(guò)debug界面測(cè)試這個(gè)函數(shù)的執(zhí)行時(shí)間,調(diào)整delay函數(shù)里的循環(huán)變量次數(shù)使其接近1s,延遲函數(shù)代碼(如圖1),但是現(xiàn)在問(wèn)題是當(dāng)我用Debug-Use Simulator調(diào)試時(shí)(如圖2),程序便進(jìn)入到systemInit()系統(tǒng)初始化函數(shù)里(如圖3),這里是等待時(shí)鐘源穩(wěn)定,后面我將其屏蔽掉(我不知道這么做對(duì)不對(duì)),程序是可以執(zhí)行,但是軟件測(cè)出來(lái)是1s,而燒錄到板子上觀(guān)看LED閃爍,時(shí)間根本不是1s,閃爍頻率極快,這是為什么呢?
第二個(gè)問(wèn)題是,后面我放棄了使用Debug-Use Simulator調(diào)試,而是使用(如圖4)DAP仿真器進(jìn)行調(diào)試,在trace界面設(shè)置72Mhz(如圖5),因?yàn)镕103系列主頻是72Mhz,但是出現(xiàn)一個(gè)奇怪的現(xiàn)象,delay函數(shù)debug后我測(cè)出1次循環(huán)是1ms,所以我將循環(huán)變量i分別設(shè)置為1次、10次、100次、1000次、10000次,理論上應(yīng)該是1ms、10ms、100ms、1s、10s延時(shí),但是在100次以下時(shí)結(jié)果正確,當(dāng)1000次及以上時(shí)實(shí)際結(jié)果只能達(dá)到0.7s和7s多(如圖6-15),這個(gè)又是什么原因?qū)е碌?是我軟件哪里設(shè)置錯(cuò)誤了嗎?希望各位大佬批評(píng)指正!

圖片14.png (352.57 KB, 下載次數(shù): 37)

圖片14.png

圖片12.png (349.18 KB, 下載次數(shù): 38)

圖片12.png

圖片13.png (353.16 KB, 下載次數(shù): 45)

圖片13.png

圖1.png (32.72 KB, 下載次數(shù): 41)

圖1.png

圖2.png (104.67 KB, 下載次數(shù): 45)

圖2.png

圖3.png (214.25 KB, 下載次數(shù): 43)

圖3.png

圖4.png (106.6 KB, 下載次數(shù): 51)

圖4.png

圖5.png (92.95 KB, 下載次數(shù): 36)

圖5.png

圖片6.png (338.84 KB, 下載次數(shù): 43)

圖片6.png

圖片7.png (353.11 KB, 下載次數(shù): 44)

圖片7.png

圖片8.png (344.74 KB, 下載次數(shù): 49)

圖片8.png

圖片9.png (346.49 KB, 下載次數(shù): 36)

圖片9.png

圖片10.png (339.89 KB, 下載次數(shù): 51)

圖片10.png

圖片11.png (350.1 KB, 下載次數(shù): 47)

圖片11.png

圖片15.png (352.9 KB, 下載次數(shù): 38)

圖片15.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:94031 發(fā)表于 2022-5-12 18:27 | 只看該作者
仿真會(huì)影響延時(shí),調(diào)試可以用讓輸出腳翻轉(zhuǎn),邏輯分析儀測(cè)試。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1026028 發(fā)表于 2022-5-12 18:30 | 只看該作者
還是用滴答定時(shí)器靠譜
回復(fù)

使用道具 舉報(bào)

地板
ID:966089 發(fā)表于 2022-5-12 19:33 | 只看該作者
xuyaqi 發(fā)表于 2022-5-12 18:27
仿真會(huì)影響延時(shí),調(diào)試可以用讓輸出腳翻轉(zhuǎn),邏輯分析儀測(cè)試。

感謝您的回復(fù),我還想問(wèn)下,如果仿真會(huì)影響延時(shí),那是KEIL軟件的問(wèn)題還是DAP仿真器通信的問(wèn)題?以及如果這樣說(shuō),那豈不是說(shuō)用Keil軟件debug查看執(zhí)行時(shí)間這一方法根本行不通?或者說(shuō)我想要得到粗略1s的延遲,除了用定時(shí)器外,就沒(méi)有其他方法嗎?因?yàn)槲覠o(wú)法知道我的dealy函數(shù)執(zhí)行時(shí)間是多少!
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2022-5-12 19:53 | 只看該作者
明明有穩(wěn)定精確的延時(shí),為什么要自己寫(xiě)呢?
哪怕是8051,1秒鐘延時(shí)也是不會(huì)用軟件延時(shí)的
有時(shí)間折騰這個(gè),還不如玩幾個(gè)DIY小東西
回復(fù)

使用道具 舉報(bào)

6#
ID:883242 發(fā)表于 2022-5-12 20:16 | 只看該作者
stm32的ms級(jí)延遲用systick。
回復(fù)

使用道具 舉報(bào)

7#
ID:966089 發(fā)表于 2022-5-12 21:28 | 只看該作者
Y_G_G 發(fā)表于 2022-5-12 19:53
明明有穩(wěn)定精確的延時(shí),為什么要自己寫(xiě)呢?
哪怕是8051,1秒鐘延時(shí)也是不會(huì)用軟件延時(shí)的
有時(shí)間折騰這個(gè),還 ...

感謝您的回復(fù),我不是執(zhí)著于1s的軟件延時(shí),我只是在想如果軟件debug查看執(zhí)行時(shí)間這一方法不準(zhǔn)確,那么寫(xiě)IC的開(kāi)發(fā)時(shí)序圖(比如DS18B20的單總線(xiàn)時(shí)序、TFLCD等)的需要延時(shí)時(shí),如何確定我的時(shí)序正確呢?當(dāng)然在32內(nèi)部有嘀嗒定時(shí)器可準(zhǔn)確延遲,那么其他MCU呢,其他MCU可沒(méi)有嘀嗒定時(shí)器。
回復(fù)

使用道具 舉報(bào)

8#
ID:401564 發(fā)表于 2022-5-12 22:00 | 只看該作者
菜菜的周某人 發(fā)表于 2022-5-12 21:28
感謝您的回復(fù),我不是執(zhí)著于1s的軟件延時(shí),我只是在想如果軟件debug查看執(zhí)行時(shí)間這一方法不準(zhǔn)確,那么寫(xiě)I ...

目前為止,我還沒(méi)有用過(guò)沒(méi)有定時(shí)器的單片機(jī)
對(duì)于一個(gè)單片機(jī)程序,延時(shí)時(shí)間達(dá)1秒的,肯定是不能用軟件延時(shí)的,難道你要讓程序什么都不做,就在那干等1秒嗎?
像18b20p 這種需要那么長(zhǎng)時(shí)間的時(shí)序,肯定是要通標(biāo)志位或者全局變量來(lái)處理時(shí)序的嘛
如果非得執(zhí)著于軟件延時(shí)1秒,那仿真肯定不行,就像說(shuō)的一樣,STM32有仿真,那別的單片機(jī)不一定能仿真
那肯定是示波器了
先隨便寫(xiě)一個(gè)延時(shí)函數(shù),大概是1mS左右,然后用示波器看一下這1mS的真正延時(shí),不斷的調(diào)整,直到最接近1mS然后把這個(gè)延時(shí)循環(huán)放到另一個(gè)循環(huán)中,參數(shù)調(diào)用就行了

假設(shè),我已經(jīng)調(diào)節(jié)好了一個(gè)1mS延時(shí),它是這樣的
i = 32;
j = 40;
do
{
        while (--j);
}         while (--i);

那就把這循環(huán)放到另一個(gè)循環(huán)中,做成一個(gè)函數(shù)就可以了,
這樣的函數(shù)調(diào)用參數(shù)會(huì)用到一定的時(shí)間,整個(gè)延時(shí)的時(shí)間可能會(huì)有誤差,再通過(guò)微調(diào)就差不多了

void Delay_ms(unsigned int a)               
{
        unsigned char i, j;
        for(a;a>0;a--)
            {
                i = 32;
                j = 40;
                do
                {
                        while (--j);
                }         while (--i);
          }
}

回復(fù)

使用道具 舉報(bào)

9#
ID:966089 發(fā)表于 2022-5-12 22:03 | 只看該作者
Y_G_G 發(fā)表于 2022-5-12 22:00
目前為止,我還沒(méi)有用過(guò)沒(méi)有定時(shí)器的單片機(jī)
對(duì)于一個(gè)單片機(jī)程序,延時(shí)時(shí)間達(dá)1秒的,肯定是不能用軟件延時(shí)的 ...

感謝您的回復(fù)!
回復(fù)

使用道具 舉報(bào)

10#
ID:883242 發(fā)表于 2022-5-12 22:46 | 只看該作者
delay_1ms()里面
u16 j,k要加volatile屬性。
回復(fù)

使用道具 舉報(bào)

11#
ID:752974 發(fā)表于 2022-5-13 16:08 | 只看該作者
軟件延時(shí)受程序執(zhí)行情況及中斷的影響,是不準(zhǔn)的。
回復(fù)

使用道具 舉報(bào)

12#
ID:123289 發(fā)表于 2022-5-14 16:59 | 只看該作者
1、程序最終會(huì)被編譯成運(yùn)行代碼,也是匯編程序。
2、在非流水取指的系統(tǒng)中(如51系統(tǒng)),每條指令運(yùn)行的時(shí)間是固定的,是可以事先計(jì)算出運(yùn)行的總時(shí)間的。所以仿真器算出來(lái)比較準(zhǔn)。
3、32系統(tǒng)是指令流水結(jié)構(gòu),當(dāng)你執(zhí)行當(dāng)前指令時(shí),下條指令就已被取出了,這樣速度快。但前提是必須知道下條指令放在哪里。所以遇到跳轉(zhuǎn)指令就不好流水了。也就是說(shuō),同樣的批令,如果流水執(zhí)行就快,不流水就慢,如果仿真器無(wú)法識(shí)別下條指令是不是流水執(zhí)行,自然就算不準(zhǔn)了。
4、1ms的子程序,調(diào)用1000次,不會(huì)是1S。因?yàn)槊看握{(diào)用要判斷是否結(jié)束了,會(huì)多運(yùn)行:調(diào)用指令1000次、判斷指令1000次。而這些指令也是要占用時(shí)間的。
回復(fù)

使用道具 舉報(bào)

13#
ID:966089 發(fā)表于 2022-5-16 17:12 | 只看該作者
yzwzfyz 發(fā)表于 2022-5-14 16:59
1、程序最終會(huì)被編譯成運(yùn)行代碼,也是匯編程序。
2、在非流水取指的系統(tǒng)中(如51系統(tǒng)),每條指令運(yùn)行的時(shí) ...

感謝您的回復(fù)!
回復(fù)

使用道具 舉報(bào)

14#
ID:966089 發(fā)表于 2022-5-16 17:12 | 只看該作者
munuc_w 發(fā)表于 2022-5-13 16:08
軟件延時(shí)受程序執(zhí)行情況及中斷的影響,是不準(zhǔn)的。

感謝您的回復(fù)!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表