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

STM32代碼的啟動過程

發(fā)布者:FreeSpirit123最新更新時間:2025-01-02 來源: jianshu關(guān)鍵字:STM32  代碼  啟動過程 手機看文章 掃描二維碼
隨時隨地手機看文章

分享這篇文章,談一下STM32啟動流程。如果讀者朋友已經(jīng)有過匯編相關(guān)基礎(chǔ),能夠夠好理解本文內(nèi)容。匯編語言是比C語言更接近機器底層的編程語言,能讓我們更好的理解和操縱硬件底層。


STM32三種啟動模式

下好程序后,重啟芯片時,SYSCLK的第4個上升沿,BOOT引腳的值將被鎖存,這就是所謂的啟動過程。

STM32上電或者復(fù)位后,代碼區(qū)始終從0x00000000開始,其實就是將存儲空間的地址映射到0x00000000中。三種啟動模式如下:

從主閃存存儲器啟動,將主Flash地址0x08000000映射到0x00000000,這樣代碼啟動之后就相當于從0x08000000開始。主閃存存儲器是STM32內(nèi)置的Flash,作為芯片內(nèi)置的Flash,是正常的工作模式。一般我們使用JTAG或者SWD模式下載程序時,就是下載到這個里面,重啟后也直接從這啟動程序。

從系統(tǒng)存儲器啟動。首先控制BOOT0、BOOT1管腳,復(fù)位后,STM32與上述兩種方式類似,從系統(tǒng)存儲器地址0x1FFF F000開始執(zhí)行代碼。系統(tǒng)存儲器是芯片內(nèi)部一塊特定的區(qū)域,芯片出廠時在這個區(qū)域預(yù)置了一段Bootloader,就是通常說的ISP程序。這個區(qū)域的內(nèi)容在芯片出廠后沒有人能夠修改或擦除,即它是一個ROM區(qū)。啟動的程序功能由廠家設(shè)置。系統(tǒng)存儲器存儲的其實就是STM32自帶的bootloader代碼。

從內(nèi)置SRAM啟動,將SRAM地址0x20000000映射到0x00000000,這樣代碼啟動之后就相當于從0x20000000開始。內(nèi)置SRAM,也就是STM32的內(nèi)存,既然是SRAM,自然也就沒有程序存儲的能力了,這個模式一般用于程序調(diào)試。假如我只修改了代碼中一個小小的地方,然后就需要重新擦除整個Flash,比較的費時,可以考慮從這個模式啟動代碼,用于快速的程序調(diào)試,等程序調(diào)試完成后,在將程序下載到SRAM中。

用戶可以通過設(shè)置BOOT1和BOOT0引腳的狀態(tài),來選擇在復(fù)位后的啟動模式。STM32三種啟動模式對應(yīng)的存儲介質(zhì)均是芯片內(nèi)置的,如下圖:

串口下載程序原理

從系統(tǒng)存儲器啟動,這種模式啟動的程序功能是由廠家設(shè)置的。一般來說,這種啟動方式用的比較少。系統(tǒng)存儲器是芯片內(nèi)部一塊特定的區(qū)域,STM32在出廠時,由ST在這個區(qū)域內(nèi)部預(yù)置了一段BootLoader,也就是我們常說的ISP程序,這是一塊ROM,出廠后無法修改。

一般來說,我們選用這種啟動模式時,是為了從串口下載程序,因為在廠家提供的BootLoader中,提供了串口下載程序的固件,可以通過這個BootLoader將程序下載到系統(tǒng)的Flash中。

這個下載方式需要以下步驟:

將BOOT0設(shè)置為1,BOOT1設(shè)置為0,然后按下復(fù)位鍵,這樣才能從系統(tǒng)存儲器啟動BootLoader;

在BootLoader的幫助下,通過串口下載程序到Flash中;

程序下載完成后,又有需要將BOOT0設(shè)置為GND,手動復(fù)位,這樣,STM32才可以從Flash中啟動。

從匯編代碼分析STM32啟動過程

STM32的啟動文件與編譯器有關(guān),不同編譯器,它的啟動文件不同。雖然啟動文件(匯編)代碼各有不同,但它們原理類似,都屬于匯編程序。拿基于MDK-ARM的啟動文件來舉例,說一下要點內(nèi)容。在基于MDK的啟動文件開始,有一段匯編代碼是分配堆棧大小的。

這里重點知道堆棧數(shù)值大小就行。還有一段AREA(區(qū)域),表示分配一段堆棧數(shù)據(jù)段??梢允褂肧TM32CubeMX對上面的數(shù)值大小進行配置:

在IAR中,是通過工程配置堆棧大小:

看下面的匯編代碼,程序上電之后,是跳到Reset_Handler這個位置。

知道代碼是從Reset_Handler開始執(zhí)行,再來看如下Reset_Handler匯編代碼。在啟動的時候,執(zhí)行了SystemInit這個函數(shù)。

執(zhí)行完SystemInit函數(shù),初始化了系統(tǒng)時鐘,之后跳轉(zhuǎn)到main函數(shù)執(zhí)行。

關(guān)鍵字:STM32  代碼  啟動過程 引用地址:STM32代碼的啟動過程

上一篇:STM32入門之文件結(jié)構(gòu)
下一篇:【STM32 LL庫編程】外部中斷與中斷管理

推薦閱讀最新更新時間:2025-04-23 13:14

8、STM32定時器原理與使用(內(nèi)附代碼
1.定義 設(shè)置等待時間,到達等待時間之后執(zhí)行指定的硬件操作。 定時器最基本的功能就是定時,比如說定時發(fā)送串口數(shù)據(jù),定時采集AD數(shù)據(jù),也可以產(chǎn)生PWM方波等,定時器產(chǎn)生PWM控制電機狀態(tài)是工業(yè)控制的普通。 2、STM32F4xx系列的芯片:2個高級控制定時器(TIM1和TIM8)、10個通用定時器(10TIM2-TIM5,TIM9-TIM14)、2個基本定時器(TIM6和TIM7)、2個看門狗定時器 具體可參考中文參考手冊了解其特性及原理 3、定時器計數(shù)模式: 通用定時器可以向上計數(shù)、向下計數(shù)、向上向下雙向計數(shù)模式。 ①向上計數(shù)模式:計數(shù)器從0計數(shù)到自動加載值(TIMx_ARR),然后重新從0開始計數(shù)并且
[單片機]
8、<font color='red'>STM32</font>定時器原理與使用(內(nèi)附<font color='red'>代碼</font>)
STM32 無中斷串口代碼
下面的代碼是我使用STM32庫編寫的串口輸出和讀取的代碼。 1、串口初始化函數(shù):void USART_Ini(USART_TypeDef* USARTx,u16 buad) 2、串口中斷開啟和關(guān)閉:USART_IT(USART_TypeDef* USARTx,FunctionalState NewState) 3、串口接收:u16 Getch(USART_TypeDef* USARTx) 4、串口單個字符輸出:void Putch(USART_TypeDef* USARTx,u16 ch) 5、串口輸出字符串:void PutStr(USART_TypeDef* USARTx,u16 *SendBuf,u16 Le
[單片機]
分享STM32代碼讀保護個人解決方案
簡介:這個加載代碼讀保護功能的步驟可能對有些人來說還是比較麻煩的,畢竟產(chǎn)品多的時候,寫入之后還要按一下寫保護命令,對于產(chǎn)線操作員來說,可能一時疏忽忘記其中一個,就會造成代碼的外泄,是不是應(yīng)該還有更簡單的辦法一鍵寫入呢,答案是肯定的! 具體做法,就是要在生成HEX文件之前,要多幾個步驟 1.首先,加載: C:KeilARMBoardsKeilMCBSTM32Blinky文件夾中的一個STM32F10xOPT.s文件 2.修改下面兩個值為1 3.生成HEX文件之前務(wù)必進行一下此配置 這樣的話,就簡單的一個HEX文件就會使你的產(chǎn)品流入市場之后,即便是被抄板成功,也不會是代碼流出了 當然,必須保證自己公司的員工不
[單片機]
分享<font color='red'>STM32</font><font color='red'>代碼</font>讀保護個人解決方案
arm-none-eabi-gcc編譯STM32優(yōu)化刪除代碼解決辦法
前兩天使用arm-none-eabi-gcc編譯STM32F103C8程序,就是一個簡單的流水燈程序。 #include stm32f10x.h int main(void) { int i; RCC- APB2ENR=0xFFFFFFFF; GPIOC- CRL=0X33333333;//outpp at 50M GPIOC- CRH=0X33333333; while(1) { GPIOC- BSRR=(1ul 13); for(i=0;i 720000;i++); GPIOC- BRR=(1ul 13); for
[單片機]
分析TCP/IP協(xié)議棧代碼之ARP(STM32平臺)
1. ARP的簡介 Address Resolution Protocol-地址解析協(xié)議 ARP為IP地址到對應(yīng)的硬件地址之間提供動態(tài)映射。從邏輯Internet地址到對應(yīng)的物理硬件地址需要進行翻譯。這就是ARP的功能。ARP的功能是在32 bit的IP地址和采用不同網(wǎng)絡(luò)技術(shù)的硬件地址之間提供動態(tài)映射。 2. ARP的應(yīng)答流程 任何時候我們敲入下面這個形式的命令: view plain copy % ftp bsdi //示例而已 都會進行以下這些步驟。這些步驟的序號如圖 4 - 2所示。 1) 應(yīng)用程序FTP客戶端調(diào)用函數(shù)gethostbyname(3)把主機名(bsdi)轉(zhuǎn)換成32 bit的IP地址。
[單片機]
分析TCP/IP協(xié)議棧<font color='red'>代碼</font>之ARP(<font color='red'>STM32</font>平臺)
STM32使用HAL庫實現(xiàn)ADC單通道轉(zhuǎn)換
  STM32的ADC轉(zhuǎn)換還是很強大的,它具有多個通道選擇,這里我就不細說,不了解的可以自行百度,這里只是選取單通道,實現(xiàn)ADC轉(zhuǎn)換。在文章開始之前,我說一下數(shù)據(jù)左對齊跟右對齊的差別,以前一直糊里糊涂的,記錄下來以免以后自己忘記。12位二進制最大值為 0x0FFF 左對齊操作后的結(jié)果是 0xFFF0,右對齊后還是0x0FFF。反過來看 ,若寄存器里左對齊的數(shù)據(jù)值X (相當于實際數(shù)據(jù)*16,所以左對齊轉(zhuǎn)換的值要/16才是實際的值),則X 4才是實際的數(shù)據(jù)。而右對齊,則是數(shù)據(jù)保持不變,采集到多少就多少。至于是按左對齊保存到寄存器還是按照右對齊,就看你的配置里如何選了。   好了,下面就開始說明怎么用STM32CUBEMX實現(xiàn)ADC單通
[單片機]
<font color='red'>STM32</font>使用HAL庫實現(xiàn)ADC單通道轉(zhuǎn)換
STM32 SPI 發(fā)送第一個數(shù)據(jù)不成功問題
STM32的標準庫,跟HAL庫都是很實用的, 在使用SPI庫的過程中一定要注意時序的問題。 我在調(diào)試SPI過程中,調(diào)試了兩個IC,都是用HAL庫, 第一個IC沒出問題,第二個IC出現(xiàn)了第一次發(fā)送數(shù)據(jù)不成功問題, 不管發(fā)什么數(shù)據(jù),交互結(jié)果都是0x00, 我一開始用的是HAL_SPI_TransmitReceive(); 這個函數(shù),一直無法成功,改用標準庫結(jié)果也是一樣; 后來查到可能是收發(fā)太快的原因, 這里說的收發(fā)太快并不是說兩個數(shù)據(jù)之間,而是一個交互的時候收發(fā)太快; 于是我把它改為發(fā)送接收之間加個延時問題解決:   HAL_SPI_Transmit(&hspi1,&temp,sizeof(temp),10);   HAL_Delay
[單片機]
混子陪你學(xué)習(xí)STM32之基本定時器使用
基礎(chǔ)知識 定時器分類 typedef struct { uint32_t Prescaler; // 預(yù)分頻器 uint32_t CounterMode; // 計數(shù)模式 uint32_t Period; // 定時器周期 uint32_t ClockDivision; // 時鐘分頻 uint32_t RepetitionCounter; // 重復(fù)計算器 } TIM_TimeBaseInitTypeDef; Prescaler:定時器預(yù)分頻器設(shè)置,時鐘源經(jīng)該預(yù)分頻器才是定時器時鐘,它設(shè)定 TIMx_PSC寄存器的值。可設(shè)置范圍為0至65535,實現(xiàn)1至65536分頻。
[單片機]
小廣播
設(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
主站蜘蛛池模板: 桑日县| 酉阳| 东辽县| 丰镇市| 延川县| 姜堰市| 阿拉尔市| 仙游县| 达州市| 台中县| 通州市| 克东县| 奉新县| 临颍县| 舟曲县| 临潭县| 墨江| 巨鹿县| 清水河县| 彰化市| 平武县| 山丹县| 周至县| 水富县| 丹巴县| 佛山市| 邹城市| 太康县| 福建省| 扎兰屯市| 石景山区| 蒲城县| 浮梁县| 海安县| 马龙县| 长垣县| 龙井市| 莎车县| 南丹县| 通榆县| 嘉禾县|