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

歷史上的今天

今天是:2025年06月14日(星期六)

2019年06月14日 | STM32-仿真調(diào)試時的SystemInit陷阱

發(fā)布者:sjp5035022 來源: eefocus關(guān)鍵字:STM32  仿真調(diào)試  SystemInit陷阱 手機看文章 掃描二維碼
隨時隨地手機看文章

我在開始STM32的仿真調(diào)試時,遇到一個問題,就是調(diào)試時程序一直停在SystemInit()中的等待晶振中,怎么也出不來。


SystemInit()前面部分的代碼,都能走過,就是在執(zhí)行到最后一個函數(shù)時出問題了。

最后一個函數(shù)是:SetSysClock(); 

執(zhí)行到下面這個循環(huán)之后,出不來了:

  /* Wait till HSE is ready and if Time out is reached exit */

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;

    StartUpCounter++;  

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


這里,我就有疑問了:

1,我希望的是直接進main函數(shù),那么,這個SystemInit()函數(shù)是從哪里來的?

2,為什么會進入死循環(huán)?


我全工程搜索“SystemInit”,發(fā)現(xiàn)在startup_stm32f0xx.s中有這樣的代碼:

        IMPORT  __main

        IMPORT  SystemInit  

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP

看來,系統(tǒng)是先執(zhí)行SystemInit,然后才執(zhí)行main的啊。


接下來是第二個問題,為什么進入死循環(huán)?

看看注釋:/* Wait till HSE is ready and if Time out is reached exit */

等待HSE準(zhǔn)備就緒且超時時間到達。超時時間且不去管它,這個HSE是什么?


HSE(High Speed External Clock signal),高速外部時鐘信號,是接外部時鐘源的。

相應(yīng)的還有HSI(High Speed Internal Clock signal),高速內(nèi)部時鐘信號,是stm32芯片自帶的。


看到這個概念,我就明白問題所在了:是我用的板子,沒有接外部晶振啊!

所以,等待HSE準(zhǔn)備就緒,這是永遠不能達成的條件啊。

所以,這里需要修改一下,不再等待HSE了,其實是不使用HSE了,而是修改為使用HSI。


當(dāng)我準(zhǔn)備修改文件的時候,發(fā)現(xiàn)了一個問題,我居然修改不了這個文件!

敲了字母,它不出現(xiàn)在代碼中!?

上網(wǎng)一查,原來是system_stm32f0xx.c這個文件是只讀的。

好吧,從windows的文件夾中找到文件,查看屬性,

見下圖:


去掉“只讀”即可。



不依賴于HSE,使用HSI,我修改后的代碼如下:


/**

  * @brief  Configures the System clock frequency, AHB/APBx prescalers and Flash

  *         settings.

  * @note   This function should be called only once the RCC clock configuration

  *         is reset to the default reset state (done in SystemInit() function).

  * @param  None

  * @retval None

  */

static void SetSysClock(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  

  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/

//  /* Enable HSE */    

//  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

// 

//  /* Wait till HSE is ready and if Time out is reached exit */

//  do

//  {

//    HSEStatus = RCC->CR & RCC_CR_HSERDY;

//    StartUpCounter++;  

//  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


    

//    RCC_HSEConfig(RCC_HSE_OFF);//外部晶振關(guān)閉!

    RCC->CR |= ((uint32_t)RCC_CR_HSION);//使用內(nèi)部晶振

    

    

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)

  {

    HSEStatus = (uint32_t)0x01;

  }

  else

  {

    HSEStatus = (uint32_t)0x00;

  }  


  if (HSEStatus == (uint32_t)0x01)

  {

    /* Enable Prefetch Buffer and set Flash Latency */

    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

 

    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

    /* PCLK = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;


    /* PLL configuration = HSE * 6 = 48 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);

            

    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;


    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }


    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    


    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)

    {

    }

  }

  else

  { /* If HSE fails to start-up, the application will have wrong clock 

         configuration. User can add here some code to deal with this error */

        

          //設(shè)置系統(tǒng)時鐘8MHz

                RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

                while(0x00 != RCC_GetSYSCLKSource());//等待設(shè)置成功       8--PLL  4--HSE   0--

HSI


                RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK 8MHz

                RCC_PCLKConfig(RCC_HCLK_Div1);//PLCK 8MHz

        

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG,ENABLE);

                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_GPIOB,ENABLE);    

        

                RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);//ADC1時鐘頻率 2MHz

  }  

    

}


這樣修改之后,再進入在線調(diào)試,果然走過了SystemInit(),然后進入了main()。

這樣,就解決了在線調(diào)試總是進不來main()的問題了。


不過,我還是有個疑問:為什么,這樣的代碼,在調(diào)試時有問題,而在全速運行的時候就沒有問題呢?


再次仔細查看這段代碼:

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;

    StartUpCounter++;  

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

其實并不是一個死循環(huán),跳出的條件有兩個:HSE準(zhǔn)備好了,或者超時。

由于我的板子沒有接外接晶振,第一個條件是不能達到的,那么,第二個條件其實是可以達到的啊,為什么我會以為是個死循環(huán)呢?


讓我們來看看 HSE_STARTUP_TIMEOUT 是個什么值吧:


查看定義,是這樣的:

#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x0500) /*!< Time out for HSE start up */


其實,不是死循環(huán),只是循環(huán)次數(shù)值太大(1280=0x500),單步調(diào)試,不能點擊走這么多的循環(huán)次數(shù)(另外,在這里,想進行斷點執(zhí)行跳過循環(huán)也不管用,不清楚是什么原因,是因為還沒有到執(zhí)行到main()嗎?若有知道原因的高手,請指點,謝謝!)。


這樣,我就考慮到了有幾個辦法解決這個問題了:


1,改小HSE_STARTUP_TIMEOUT,例如:1        

    評估:危險!我們盡量不要去修改廠家提供的宏。萬一以后需要用HSE呢?另外還要考慮這個值是否有其它地方的調(diào)用。

2,調(diào)試時,修改StartUpCounter變量值,為4ff,則很快達到0x500,跳出循環(huán)。

    評估:可行,但是比較麻煩,每次運行都需要修改一次。

    若不想修改任何代碼,這倒也是一個選擇。

3,像前文說的那樣,修改SystemInit,默認選擇HSI。

    評估:可行。不過,代碼修改量比較大。或許我們還有更好的選擇?

4,修改startup_stm32f0xx.s,不執(zhí)行SystemInit了

如下修改:

        IMPORT  __main

;        IMPORT  SystemInit  

;                 LDR     R0, =SystemInit

;                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP

    實測,可行。修改時注意,這個文件也是只讀的,需要去掉只讀屬性后才能修改代碼。

    改動量較小。不過風(fēng)險可不小,因為我還不能準(zhǔn)確評估去掉 SystemInit 那部分代碼的影響。

    可行的原因分析:系統(tǒng)復(fù)位后,HSI振蕩器默認被選為系統(tǒng)時鐘。

5,去掉SystemIit() 中對 SetSysClock() 的調(diào)用;

    實測,可行。

    改動最較小,只是把那句調(diào)用代碼注釋掉即可。且通過分析SetSysClock()函數(shù),可以知道,若沒有啟用HSE,則相當(dāng)于沒有執(zhí)行任何有效操作。可以說,對于使用HSI的情況,邏輯上沒有任何差別。

    

最終,我采用了第5種修改方法,調(diào)試運行,一切正常。


關(guān)鍵字:STM32  仿真調(diào)試  SystemInit陷阱 引用地址:STM32-仿真調(diào)試時的SystemInit陷阱

上一篇:STM32-使用定時器做延時函數(shù)時遇到的坑
下一篇:STM32-基于匯編來分析延時

推薦閱讀

盡管尚未確立主流治療模式的地位,但虛擬現(xiàn)實技術(shù)已經(jīng)從有趣的概念變?yōu)閿?shù)字醫(yī)療領(lǐng)域的熱門話題。隨著研究人員對這項沉浸式技術(shù)的深入研究,人們越來越清楚,這種生活中的娛樂新技術(shù)可以解決醫(yī)療行業(yè)一些長期以來難以解決的問題。目前,三星、appliedVR、Rendever和One Caring等科技公司已經(jīng)開發(fā)用于健康護理的VR產(chǎn)品,而VR也已經(jīng)被越來越多的醫(yī)療機構(gòu)認可...
江蘇捷捷微電子股份有限公司(簡稱“捷捷微電”)新上的電力電子器件生產(chǎn)線項目正在如火如荼建設(shè)中,1號、2號主廠房已進入機電施工階段。據(jù)介紹,該項目于2018年11月正式開工建設(shè)。項目一期投資5.5億元,新建電力電子芯片生產(chǎn)線1條,年產(chǎn)6英寸芯片60萬片;封裝生產(chǎn)線5條,年產(chǎn)自封電力電子器件30億只,達產(chǎn)后將形成年產(chǎn)值6.21億元的規(guī)模,從而全面提升公司...
1.時鐘結(jié)構(gòu)圖圖1 片內(nèi)時鐘結(jié)構(gòu)圖2.時鐘分配有三種方式可為5744提供時鐘源,分別為外部有源晶振、外部無源晶振和內(nèi)部16MHz RC晶振。其中16MHz內(nèi)部RC晶振一般作為PLL或外部晶振失效情況下的備用時鐘,系統(tǒng)復(fù)位后5744默認選擇16MHz內(nèi)部RC晶振作為時鐘源。5744內(nèi)含有PLL0和PLL1兩個PLL,PLL0輸出為PLL0_PHI、PLL0_PHI1,PLL1輸出為PLL1_PHI,其中PLL0_PHI1還...
從蒸汽到內(nèi)燃機,再到電動機,幾百年的歷史進程中,世界驅(qū)動力的升級讓城市運轉(zhuǎn)的節(jié)奏更快更強,而汽車可以說是城市動力的親歷者和見證者。不過,正如曾經(jīng)每一次變革都會受到來自技術(shù)或能源上的阻力一樣,汽車在即將告別化石能源全力擁抱新能源技術(shù),駛向未來駕駛的過程中也面臨著不小的挑戰(zhàn)。“一代正極材料,一代動力電池”,從錳酸鋰到磷酸鐵鋰,再到三...

史海拾趣

問答坊 | AI 解惑

低功率繼電器控制電路

在電池供電電路或恒流供電電路中,使繼電器工作的突發(fā)電流電涌可導(dǎo)致電源電壓下降。這是由于內(nèi)部電阻或電流限制影響的結(jié)果。圖1所示的電路可克服此問題,此電路在各種條件下從電源吸入恒定1mA電流。 圖1所示電路控制三個Teledyne RF自鎖繼電器7221 ...…

查看全部問答∨

求用89S52作的電子體溫計的源程序。

本人在“電子制作”08第一期上看到標(biāo)題為“基于89S52單片機的電子體溫計。”但上面沒有給任何程序。 那位大俠有??可否發(fā)上來? 溫度傳感器是:DS18B20.還有個122*64點陣的液晶顯示。。 Help~~~~…

查看全部問答∨

誰知道如何用AutoCAD制作元件的PCB封裝?

有資料或者可以總結(jié)一點經(jīng)驗的請告知…

查看全部問答∨

永磁同步電機直接轉(zhuǎn)矩控制系統(tǒng)研究與仿真

直流電機控制一種算法研究。作者:高大剛 等…

查看全部問答∨

wince 開機logo

大家好!     最近想在wince啟動時顯示logo界面,不知道怎么操作,望大家指點具體操作辦法,多謝了!!!…

查看全部問答∨

cygwin安裝mips編譯器后不識別庫函數(shù),請高手指教,謝謝!

cygwin下安裝了mips的編譯器,但不能識別函數(shù),即使寫一個“Hello World”,使用mips-elf-gcc編譯時也會提示“undefined reference to `printf\'”,直接用gcc編譯就沒問題。不知是何原因,望高手指教,謝謝!…

查看全部問答∨

SMBUS的SLAVE地址

最近需要寫個讀寫SMBUS設(shè)備的寄存器的程序,好象掛在SMBUS上的各類設(shè)備都有自己固定的SLAVE ADDRESS,所以想問下是否有相關(guān)的資料記錄了各類設(shè)備預(yù)先分配好的地址,如果有相關(guān)資料的話,是否可以提供下哪里下載?比如SPD的SLAVE ADDRESS為A0,A2,A4 ...…

查看全部問答∨

如何用PLL做主時鐘

我想把PLL做主時鐘用,請問SysCtlClockSet函數(shù)中的參數(shù)應(yīng)該怎么設(shè)置?…

查看全部問答∨

程序代碼太長了,如何解決?

我用149    代碼要超過60k了,請問有沒有容量更大的,什么型號??…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 岗巴县| 阜平县| 阿鲁科尔沁旗| 视频| 嵩明县| 辽源市| 遵化市| 永德县| 阿巴嘎旗| 方城县| 湘西| 姚安县| 台东县| 扎赉特旗| 绍兴县| 黔江区| 西宁市| 阳曲县| 呼玛县| 马鞍山市| 旺苍县| 牟定县| 札达县| 佛冈县| 平南县| 岳池县| 钟山县| 灵山县| 嘉定区| 鄂托克旗| 砚山县| 南召县| 宣化县| 丘北县| 涡阳县| 木兰县| 通辽市| 哈巴河县| 扶风县| 中山市| 侯马市|