STM32F4串列埠IAP學習筆記

2021-09-21 06:18:44 字數 1563 閱讀 3136

圖1.1    stm32記憶體位址對映

通過設定boot1和boot0的電平就可以設定stm32啟動時從哪個位置開始啟動,通常預設從flash啟動。

當沒有iap時,程式從0x0800000處啟動,然後進入0x08000004處的復位中斷,並跳轉到0x08000004+n處的復位中斷程式,在復位中斷程式執行結束後,才會跳轉到main函式進行死迴圈。在迴圈時發生中斷就會進入對應的中斷服務程式執行,結束後再次返回main函式。

加入iap後,程式的執行流程就變成了:

圖2.1 iap程式流程

在乙個iap程式中比較重要的三個部分分別是:

以串列埠接收資料為例:

#define usart_rec_len  			122800  	//定義最大接收位元組數 120k位元組

#if en_usart1_rx //如果使能了接收

//串列埠1中斷服務程式

//注意,讀取usartx->sr能避免莫名其妙的錯誤

u8 usart_rx_buf[usart_rec_len]__attribute__((at(0x20001000)));

//接收緩衝,最大usart_rec_len個位元組.起始位址為0x20001000.

//接收狀態

//bit15, 接收完成標誌

//bit14, 接收到0x0d

//bit13~0, 接收到的有效位元組數目

u16 usart_rx_sta=0; //接收狀態標記

u32 usart_rx_cnt=0; //接收資料計數器

void usart1_irqhandler(void)

typedef void(*iapfun)(void);}

重要**分析:

typedef void(*iapfun)(void);

iapfun是我們建立的乙個型別別名,可通過iapfun宣告乙個返回值是void,引數型別是void的函式指標。

0x08000000是flash的起始位址,根據程式的大小分配size,注意為0x200的整數倍

start:由bootloader程式的start+size確定,0x08000000+8000=0x08008000

size:由flash的大小減去bootloader程式的大小確定,flash為1024k,0x100000-0x8000=0xf8000

STM32F4串列埠空閒中斷接收

stm32f4串列埠初始化 void uart init u32 bound 串列埠空閒中斷配置 u8 usart rx buf usart rec len 接收快取,最大usart rec len個位元組 u32 usart rx count 0 接收位元組計數 u8 flag idle 0 vo...

STM32F4的GPIO口配置模式

stm32f4 每組通用 i o 埠包括 4 個 32 位配置暫存器 moder otyper ospeedr 和 pupdr 2 個 32 位資料暫存器 idr 和 odr 1 個 32 位置位 復位暫存器 bsrr 1 個 32 位鎖定暫存器 lckr 和 2 個 32 位復用功能選擇暫存器 a...

STM32F4 IAP學習筆記

這裡預設是未定義vect tab sram,因此需要設定scb vtor的值,如下 scb vtor flash base vect tab offset 其中vect tab offset 0x10000,即偏移量,根據實際情況設定。為了方便修改,以及不改動系統檔案,將其放在main函式最開始處即...