我在開始STM32的仿真調(diào)試時(shí),遇到一個(gè)問題,就是調(diào)試時(shí)程序一直停在SystemInit()中的等待晶振中,怎么也出不來。
SystemInit()前面部分的代碼,都能走過,就是在執(zhí)行到最后一個(gè)函數(shù)時(shí)出問題了。
最后一個(gè)函數(shù)是:SetSysClock();
執(zhí)行到下面這個(gè)循環(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,我希望的是直接進(jìn)main函數(shù),那么,這個(gè)SystemInit()函數(shù)是從哪里來的?
2,為什么會(huì)進(jìn)入死循環(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的啊。
接下來是第二個(gè)問題,為什么進(jìn)入死循環(huán)?
看看注釋:/* Wait till HSE is ready and if Time out is reached exit */
等待HSE準(zhǔn)備就緒且超時(shí)時(shí)間到達(dá)。超時(shí)時(shí)間且不去管它,這個(gè)HSE是什么?
HSE(High Speed External Clock signal),高速外部時(shí)鐘信號(hào),是接外部時(shí)鐘源的。
相應(yīng)的還有HSI(High Speed Internal Clock signal),高速內(nèi)部時(shí)鐘信號(hào),是stm32芯片自帶的。
看到這個(gè)概念,我就明白問題所在了:是我用的板子,沒有接外部晶振啊!
所以,等待HSE準(zhǔn)備就緒,這是永遠(yuǎn)不能達(dá)成的條件啊。
所以,這里需要修改一下,不再等待HSE了,其實(shí)是不使用HSE了,而是修改為使用HSI。
當(dāng)我準(zhǔn)備修改文件的時(shí)候,發(fā)現(xiàn)了一個(gè)問題,我居然修改不了這個(gè)文件!
敲了字母,它不出現(xiàn)在代碼中???
上網(wǎng)一查,原來是system_stm32f0xx.c這個(gè)文件是只讀的。
好吧,從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)時(shí)鐘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時(shí)鐘頻率 2MHz
}
}
這樣修改之后,再進(jìn)入在線調(diào)試,果然走過了SystemInit(),然后進(jìn)入了main()。
這樣,就解決了在線調(diào)試總是進(jìn)不來main()的問題了。
不過,我還是有個(gè)疑問:為什么,這樣的代碼,在調(diào)試時(shí)有問題,而在全速運(yùn)行的時(shí)候就沒有問題呢?
再次仔細(xì)查看這段代碼:
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
其實(shí)并不是一個(gè)死循環(huán),跳出的條件有兩個(gè):HSE準(zhǔn)備好了,或者超時(shí)。
由于我的板子沒有接外接晶振,第一個(gè)條件是不能達(dá)到的,那么,第二個(gè)條件其實(shí)是可以達(dá)到的啊,為什么我會(huì)以為是個(gè)死循環(huán)呢?
讓我們來看看 HSE_STARTUP_TIMEOUT 是個(gè)什么值吧:
查看定義,是這樣的:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
其實(shí),不是死循環(huán),只是循環(huán)次數(shù)值太大(1280=0x500),單步調(diào)試,不能點(diǎn)擊走這么多的循環(huán)次數(shù)(另外,在這里,想進(jìn)行斷點(diǎn)執(zhí)行跳過循環(huán)也不管用,不清楚是什么原因,是因?yàn)檫€沒有到執(zhí)行到main()嗎?若有知道原因的高手,請指點(diǎn),謝謝!)。
這樣,我就考慮到了有幾個(gè)辦法解決這個(gè)問題了:
1,改小HSE_STARTUP_TIMEOUT,例如:1
評估:危險(xiǎn)!我們盡量不要去修改廠家提供的宏。萬一以后需要用HSE呢?另外還要考慮這個(gè)值是否有其它地方的調(diào)用。
2,調(diào)試時(shí),修改StartUpCounter變量值,為4ff,則很快達(dá)到0x500,跳出循環(huán)。
評估:可行,但是比較麻煩,每次運(yùn)行都需要修改一次。
若不想修改任何代碼,這倒也是一個(gè)選擇。
3,像前文說的那樣,修改SystemInit,默認(rèn)選擇HSI。
評估:可行。不過,代碼修改量比較大?;蛟S我們還有更好的選擇?
4,修改startup_stm32f0xx.s,不執(zhí)行SystemInit了
如下修改:
IMPORT __main
; IMPORT SystemInit
; LDR R0, =SystemInit
; BLX R0
LDR R0, =__main
BX R0
ENDP
實(shí)測,可行。修改時(shí)注意,這個(gè)文件也是只讀的,需要去掉只讀屬性后才能修改代碼。
改動(dòng)量較小。不過風(fēng)險(xiǎn)可不小,因?yàn)槲疫€不能準(zhǔn)確評估去掉 SystemInit 那部分代碼的影響。
可行的原因分析:系統(tǒng)復(fù)位后,HSI振蕩器默認(rèn)被選為系統(tǒng)時(shí)鐘。
5,去掉SystemIit() 中對 SetSysClock() 的調(diào)用;
實(shí)測,可行。
改動(dòng)最較小,只是把那句調(diào)用代碼注釋掉即可。且通過分析SetSysClock()函數(shù),可以知道,若沒有啟用HSE,則相當(dāng)于沒有執(zhí)行任何有效操作??梢哉f,對于使用HSI的情況,邏輯上沒有任何差別。
最終,我采用了第5種修改方法,調(diào)試運(yùn)行,一切正常。
上一篇:STM32-使用定時(shí)器做延時(shí)函數(shù)時(shí)遇到的坑
下一篇:STM32-基于匯編來分析延時(shí)
推薦閱讀
史海拾趣
芯茂微電子自創(chuàng)立之初,就致力于高性能模擬及數(shù)模混合集成電路的研發(fā)。經(jīng)過多年的努力,公司在BICMOS和BCD工藝平臺(tái)上取得了顯著的技術(shù)突破,成功開發(fā)出多款高性能、低功耗的集成電路產(chǎn)品。這些產(chǎn)品憑借卓越的性能和穩(wěn)定性,迅速獲得了市場的認(rèn)可,廣泛應(yīng)用于消費(fèi)類電子、通信、計(jì)算機(jī)等領(lǐng)域。公司的技術(shù)實(shí)力和創(chuàng)新能力得到了業(yè)界的一致認(rèn)可,成為國內(nèi)集成電路設(shè)計(jì)領(lǐng)域的佼佼者。
Eastron Corp一直重視人才的培養(yǎng)和引進(jìn)。公司建立了完善的人才培養(yǎng)和激勵(lì)機(jī)制,鼓勵(lì)員工不斷學(xué)習(xí)和創(chuàng)新。同時(shí),Eastron還積極引進(jìn)國內(nèi)外優(yōu)秀人才,為公司的發(fā)展注入新的活力。正是憑借一支高素質(zhì)、專業(yè)化的團(tuán)隊(duì),Eastron在電子行業(yè)中不斷取得新的突破。
在2009年,誠芯微(CXW)公司在深圳成立,標(biāo)志著其在中國電子行業(yè)的初步涉足。公司創(chuàng)始人憑借對集成電路設(shè)計(jì)領(lǐng)域的深刻理解和前瞻性的市場洞察,決定專注于電源芯片的研發(fā)與設(shè)計(jì)。初期,公司面臨著資金緊張、技術(shù)儲(chǔ)備不足等挑戰(zhàn),但創(chuàng)始人帶領(lǐng)團(tuán)隊(duì)堅(jiān)持自主研發(fā),逐步積累了技術(shù)實(shí)力。
人才是企業(yè)發(fā)展的核心競爭力。BCD Semi(Diodes)非常重視人才隊(duì)伍的建設(shè)和培養(yǎng)。公司積極引進(jìn)國內(nèi)外優(yōu)秀的研發(fā)、生產(chǎn)和銷售人才,為他們提供良好的工作環(huán)境和職業(yè)發(fā)展機(jī)會(huì)。同時(shí),公司還注重員工的培訓(xùn)和提升,定期組織各類培訓(xùn)活動(dòng)和技術(shù)交流會(huì)議,幫助員工不斷提升自身的專業(yè)技能和綜合素質(zhì)。通過這些措施,BCD Semi成功打造了一支高素質(zhì)、專業(yè)化的人才隊(duì)伍,為公司的持續(xù)發(fā)展提供了有力的人才保障。
請注意,這些故事是根據(jù)電子行業(yè)的普遍情況和市場趨勢構(gòu)建的,可能與BCD Semi(Diodes)公司的實(shí)際發(fā)展情況存在一定的差異。如需了解該公司更詳細(xì)的發(fā)展故事,建議查閱公司官方網(wǎng)站、相關(guān)新聞報(bào)道或行業(yè)分析報(bào)告等權(quán)威渠道獲取更準(zhǔn)確的信息。
AURORA公司成立于2016年,初出茅廬便面臨著巨大的挑戰(zhàn)。然而,公司的三位聯(lián)合創(chuàng)始人Chris Urmson、J. Andrew Bagnell和Sterling Anderson均來自自動(dòng)駕駛汽車領(lǐng)域的頂尖團(tuán)隊(duì),擁有豐富的經(jīng)驗(yàn)和深厚的技術(shù)背景。他們憑借對自動(dòng)駕駛技術(shù)的深刻理解和前瞻性眼光,為AURORA的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。在初創(chuàng)時(shí)期,AURORA通過與多家汽車制造商合作,共同設(shè)計(jì)和開發(fā)傳感器、軟件和數(shù)據(jù)服務(wù),逐漸在自動(dòng)駕駛領(lǐng)域嶄露頭角。
在1980年代,Dallas公司憑借其創(chuàng)新的DS1820溫度傳感器產(chǎn)品,成功打開了新市場的大門。這款溫度傳感器以其高精度、低功耗和易于集成的特性,贏得了眾多客戶的青睞。它的推出不僅為Dallas公司帶來了顯著的收入增長,也為公司后續(xù)的產(chǎn)品研發(fā)和市場拓展奠定了堅(jiān)實(shí)的基礎(chǔ)。
WINCE下,我們用的NAND FLASH的FAT32文件系統(tǒng)的文件分配表(FAT表)和文件目錄表(FDT表)在NAND FLASH的那個(gè)地方?還是不需要有? WINCE下,我們用的NAND FLASH的FAT32文件系統(tǒng)的文件分配表(FAT表)和文件目錄表(FDT表)在NAND FLASH的那個(gè)地方?還是不需要有?… 查看全部問答∨ |
|
網(wǎng)上找了些資料,關(guān)于用directshow的,依照上面的代碼,運(yùn)行的時(shí)候出錯(cuò)。 private object CreateComObj(Guid ClsID) { object com = null; ...… 查看全部問答∨ |
軟件開發(fā)不明白這個(gè)怎么實(shí)現(xiàn)啊 模型燈光多媒體控制系統(tǒng) (功能)播放圖片、語音、文字、動(dòng)畫,配合燈光同步控制---觸摸屏的 實(shí)現(xiàn)圖片、語音、文字與沙盤燈光的同步… 查看全部問答∨ |
求助關(guān)于cadence畫原理圖中關(guān)于OFFPAGELEFT的問題 關(guān)于分頁的電路連接(平坦式)中需要用到Off - page Connector, 其中有兩項(xiàng)(或者是4項(xiàng)):OFFPAGELEFT-L和OFFPAGELEFT-R 我看周潤景的書上寫著:設(shè)置采用雙向箭頭,結(jié)點(diǎn)在左(右)的電路端口連接器 而層次式連接器Hierarchical port中有:雙向 ...… 查看全部問答∨ |
|
Modesim仿真出現(xiàn)的錯(cuò)誤# ** Warning: (vsim-WLF-5000) Waveform log file vsim.wlf currently in use.# File in use by: haohao Hostname: hao ProcessID: 1164# Attempt ...… 查看全部問答∨ |
應(yīng)該通過什么的方法來實(shí)現(xiàn)開關(guān)電源的輸出電壓連續(xù)步進(jìn)可調(diào)輸出??如30~36V之間,步進(jìn)量為1V,應(yīng)該怎么做,請大家給個(gè)思路>… 查看全部問答∨ |
大家好,我們正在學(xué)習(xí)單片機(jī)和嵌入式,老師要求每個(gè)人設(shè)計(jì)一個(gè)有趣或者使用的作品。想了好久,沒有什么好的思路,有人有想法能指點(diǎn)一二么??… 查看全部問答∨ |
如果我用2條數(shù)據(jù)線是不是就要3條線了,這樣的話庫都不支持了,庫里最多2條線啊,還有就是我上面的ST的片選腳那樣設(shè)置是否合理啊,而且用SPI-RECIVEDATA()這個(gè)函數(shù)的時(shí)候一直讀到的是255。 不知道是什么原因 請各位幫忙… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 蘋果被判侵犯3G專利,需向西班牙公司TOT賠償1.1億美元
- 從設(shè)計(jì)概念到 FPGA 原型僅需數(shù)分鐘,印度 InCore 完成 SoC Generator 平臺(tái)硅驗(yàn)證
- 消息稱因難尋客戶,三星推遲美國芯片工廠的完工時(shí)間
- BOE(京東方)聯(lián)合榮耀打造榮耀Magic V5 以領(lǐng)先LTPO技術(shù)打造行業(yè)新標(biāo)桿
- 華為ADS 4發(fā)布:多傳感器融合,提升自動(dòng)駕駛安全性
- 曉鶯說:線控制動(dòng)變革風(fēng)云
- 大眾商用車推出AirConsole 將其信息娛樂系統(tǒng)擴(kuò)展為游戲機(jī)
- 福州大學(xué)發(fā)明新機(jī)器視覺傳感器 可使機(jī)器人對極端光照做出超快反應(yīng)
- 蘋果獲沉浸式虛擬顯示器相關(guān)的專利
- 英特爾汽車“折戟”,十年布局一夜歸零
- 老T叔的藏書閣——一位老工程師多年的資料積累
- 免費(fèi)申請 | ST多款開發(fā)板返場測評
- 了解設(shè)計(jì)完整AC-DC系統(tǒng)的快速低風(fēng)險(xiǎn)方法,輕松答題贏好禮
- 福祿克首款熱成像萬用表Fluke-279FC等你來嘗鮮!曬心得享好禮嘍!
- 一天一個(gè)Webench設(shè)計(jì),看誰能撐30天?
- 答題贏好禮|平穩(wěn)控制與位置服務(wù)中至關(guān)重要的 ADI MEMS IMU
- 力源帶你了解安森美半導(dǎo)體開發(fā)神器——高度靈活的物聯(lián)網(wǎng)開發(fā)套件( IDK )!看視頻輕松答題享好禮!
- 硬核拆解|看看千元智能電表內(nèi)部如何連接
- 看是德科技利用校準(zhǔn)降低儀器測量不確定度、提高測試精度 直播享好禮!
- 【有獎(jiǎng)直播】:Microchip ATmega4809系列單片機(jī)簡介
- 電動(dòng)化未來中的機(jī)器人角色
- 傅利葉智能與芝加哥康復(fù)中心達(dá)成戰(zhàn)略合作
- 研發(fā)智能機(jī)器人大腦,「思靈機(jī)器人」完成pre-A輪融資
- 光刻機(jī)領(lǐng)域王者ASML研發(fā)新代機(jī)型,2025年1納米工藝可期
- 未來,一個(gè)芯片搞定導(dǎo)航?
- 100%可再生能源哪里來?儲(chǔ)能將擔(dān)平衡系統(tǒng)重任
- 國網(wǎng)湖南電力全面啟動(dòng)“新基建” 將加大在特高壓、充電樁等方面投入
- 首家綜合能源公司上市在即,綜合能源盈利困局破解了么?
- 國網(wǎng)北京電力:今年將建1632個(gè)充電樁
- 五年之功:電改持續(xù)走向縱深