国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

bootloader編寫——MCU固件升級系列2(STM32)

這篇具有很好參考價值的文章主要介紹了bootloader編寫——MCU固件升級系列2(STM32)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本系列將從升級流程、boot代碼編寫、APP代碼編寫以及固件打包來介紹,硬件選用STM32F407ZGT6(手里只有),來完成這系列教程。

bootloader編寫——MCU固件升級系列2(STM32)

前言

開發(fā)STM32固件升級并編寫B(tài)ootloader時,需要注意以下幾個關鍵點:

  1. 熟悉硬件和數(shù)據(jù)手冊:在開發(fā)過程中,確保充分理解STM32微控制器的特性和功能。閱讀相關數(shù)據(jù)手冊,了解其內存布局、外設接口以及其他重要信息。

  2. 選擇合適的通信接口:根據(jù)項目需求選擇合適的通信接口進行固件升級,如串口、I2C、SPI、USB等。確保所選接口可以與外部設備(如PC)正常通信。(后續(xù)會使用CAN UART)

  3. 定義固件升級協(xié)議:設計一個簡單且可靠的通信協(xié)議,用于在Bootloader和外部設備之間傳輸數(shù)據(jù)。協(xié)議應包括命令、地址、數(shù)據(jù)長度、數(shù)據(jù)包校驗等信息。

  4. 保留足夠的Bootloader空間:為Bootloader預留足夠的程序存儲空間。Bootloader的大小可能會隨著功能的增加而增大,因此預留一定的余量非常重要。

  5. 安全和魯棒性:確保Bootloader代碼具有良好的異常處理和錯誤檢測能力。避免因意外情況導致的設備損壞或不可恢復狀態(tài)。

  6. 可擴展性:在設計Bootloader時考慮到未來可能的功能擴展。保持代碼結構清晰,易于維護和升級。

  7. 測試與驗證:在實際硬件上對Bootloader進行充分測試,確保其下載、擦除、寫入等操作的正確性和穩(wěn)定性。

遵循以上關鍵點,在開發(fā)過程中保持耐心和細致,能有效編寫出一個可靠、高效的STM32 Bootloader。

編寫B(tài)ootloader程序

在編寫前我需要確定幾個地方:

  • bootloader

    • 確定bootloader存放地址 0x08000000
    • 配置bootloader中斷向量表
    • 實現(xiàn)串口或USB等通信接口 UART
    • 編寫flash擦除、編程函數(shù)
    • 確定應用程序存放地址 0x08000000 + Boot_size + PARAM_SIZE
    • 跳轉到應用程序入口 跳轉指令
  • 注意事項

    • 確認芯片型號和數(shù)據(jù)手冊,了解芯片的Flash大小和布局
    • 確定應用程序和bootloader的存放地址
    • 確定bootloader的觸發(fā)方式,如按鍵觸發(fā)、超時觸發(fā)等
    • bootloader需要配置中斷向量表,以便跳轉到應用程序時正確執(zhí)行
    • bootloader需要實現(xiàn)串口或USB等通信接口,以便與上位機進行通信
    • bootloader需要編寫flash擦除、編程函數(shù),以便將應用程序下載到Flash中
    • bootloader需要檢查應用程序的合法性,如校驗和、簽名等
    • bootloader需要跳轉到應用程序入口,啟動應用程序

在MCU中,bootloader主要作用引導進入APP1程序,檢測升級標注位是否需要將備份APP2覆蓋到APP1中(升級新程序)或者接收升級包進行升級(可以是CAN、UART通信或者讀取SD卡獲取升級包)。bootloader程序盡量保持簡潔,不需要用到資源統(tǒng)統(tǒng)去掉(很容易出現(xiàn)問題,往往初始化的外設資源,最好都去初始化(保留原來的狀態(tài))),保證小巧、穩(wěn)定和擴展性。
需要實現(xiàn)的功能:flash擦除接口和通信接口,主要這兩個,還需要添加狀態(tài)和標注位。

Flash讀寫和擦除

Flash 功能接口

u32 STMFLASH_ReadWord(u32 faddr)
{
	return *(vu32*)faddr; 
}  

uint16_t STMFLASH_GetFlashSector(u32 addr)
{
	if(addr<ADDR_FLASH_SECTOR_1)return FLASH_Sector_0;
	else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_Sector_1;
	else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_Sector_2;
	else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_Sector_3;
	else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_Sector_4;
	else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_Sector_5;
	else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_Sector_6;
	else if(addr<ADDR_FLASH_SECTOR_8)return FLASH_Sector_7;
	else if(addr<ADDR_FLASH_SECTOR_9)return FLASH_Sector_8;
	else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;
	else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10; 
	return FLASH_Sector_11;	
}

void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)	
{ 
  FLASH_Status status = FLASH_COMPLETE;
	u32 addrx=0;
	u32 endaddr=0;	
  if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;	//非法地址
	FLASH_Unlock();									//解鎖 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期間,必須禁止數(shù)據(jù)緩存
 		
	addrx=WriteAddr;				//寫入的起始地址
	endaddr=WriteAddr+NumToWrite*4;	//寫入的結束地址
	if(status==FLASH_COMPLETE)
	{
		while(WriteAddr<endaddr)//寫數(shù)據(jù)
		{
			if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//寫入數(shù)據(jù)
			{ 
				break;	//寫入異常
			}
			WriteAddr+=4;
			pBuffer++;
		} 
	}
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除結束,開啟數(shù)據(jù)緩存
	FLASH_Lock();//上鎖
} 

void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)   	
{
	u32 i;
	for(i=0;i<NumToRead;i++)
	{
		pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//讀取4個字節(jié).
		ReadAddr+=4;//偏移4個字節(jié).	
	}
}

實現(xiàn)在SD卡尋找APP程序,進行升級。

	FIL fnew;                         /* 文件對象 */
	FRESULT res_sd = FR_OK;                   /* 文件操作結果 */
	UINT fnum;                        /* 文件成功讀寫數(shù)量 */
	BYTE ReadBuffer[512]={0};        /* 讀緩沖區(qū) */
	
	u8 checknum = 0;
	int writeSum = 0;
 	while(SD_Init())
	{

	}
 	exfuns_init();									 
  f_mount(fs[0],"0:",1); 					
	Flash_Erase(APP1_ADDRESS);
	while(1)
	{
		t++; 
		res_sd = f_open(&fnew, "0:APP2.bin", FA_OPEN_EXISTING | FA_READ);
		if(res_sd == FR_OK)//有升級文件
		{
			printf("open bootloader\r\n");
			fnum = 1;
			do
			{
				res_sd = f_read(&fnew, ReadBuffer, sizeof(ReadBuffer), &fnum);
				if(res_sd == FR_OK)
				{
						printf("##");
						if(fnum!=0)
						STMFLASH_Write(APP1_ADDRESS+writeSum,(u32*)ReadBuffer,fnum/4);
						writeSum += fnum;
						for(int i = 0 ; i < fnum;i++)
						{
							checknum ^= ReadBuffer[i];
							printf("0x%2x ",ReadBuffer[i]);
						}
						printf("\r\n");
						memset(ReadBuffer,0,sizeof(ReadBuffer));
				}
				else
				{
						
						printf("read file failth(%d)\n", res_sd);
				}
			}while(fnum > 0);
			/* 不再讀,關閉文件 */
        f_close(&fnew);
				u8 readBuf[4];
				u8 readCheckCrc = 0;
				for(int i = 0;i < writeSum ; i++)
				{
					STMFLASH_Read(APP1_ADDRESS+i*4,(u32*)readBuf,1);
					for(int j = 0;j<4;j++)
					readCheckCrc ^= readBuf[j];
				}
				printf("boot jump app\r\n");
				if(readCheckCrc == checknum && readCheckCrc!=0)
				{
					printf("check sum success jump APP1\r\n");
					//跳轉
					jump_to_app();
				}
				else
				{
					printf("check sum Failth\r\n");
				}
				while(1);
				
		}
		else
		{
			printf("not found bootloader \r\n");
		}
		LED0=!LED0;  //狀態(tài)燈  bootloader狀態(tài)
	}

上面還需要進行優(yōu)化,需要添加一些標志位可以在一個扇區(qū)或者在備份寄存器標記,來做升級標記。

跳轉指令 重點

#define  APP1_ADDRESS  0x8020000
__asm void start_app(uint32_t r0_msp, uint32_t r1_pc)
{
    MOV SP, R0    //R0的數(shù)值   其實就是參數(shù)r0_msp
    BX R1             //R1               其實就是r1_pc
}
void jump_to_app(void)
{
	start_app((*(uint32_t *)(APP1_ADDRESS)),(*(uint32_t *)(APP1_ADDRESS + 4)));
}

在實際操作過程中,遇到跳轉,沒能正常運行APP。
我進行分析,排除問題,把問題范圍縮小,可能會出現(xiàn)的問題:1、Flash讀寫接口有問題 2、FAT32文件系統(tǒng)讀取數(shù)據(jù)有問題。
看前面的代碼,我都加了日志信息輸出,把文件系統(tǒng)讀到的數(shù)據(jù)輸出,和真實的bin文件內容對比,對比問題是正確,說明問題出現(xiàn)在Flash擦除。
看下面的截圖,左邊是都是FF沒做寫入前做擦除,右邊是擦除后再寫,是寫入成功的。
寫入前要先做擦除處理。
bootloader編寫——MCU固件升級系列2(STM32)文章來源地址http://www.zghlxwxcb.cn/news/detail-435287.html

到了這里,關于bootloader編寫——MCU固件升級系列2(STM32)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • stm32利用bootloader與app實現(xiàn)遠程升級

    stm32利用bootloader與app實現(xiàn)遠程升級

    1、flash空間分配: 事先在flash開辟好空間,假設flash為128k,我這邊給它分為五個區(qū),分別為bootloader、標志位、application、application backup、標簽ID。 (注:升級之前,app的代碼燒錄于application的flash存儲區(qū)域內。用于app升級的 bin文件 大小一定要小于自己開辟的flash空間大小)

    2024年02月13日
    瀏覽(27)
  • STM32F103 USB OTA升級BootLoader (一)

    STM32F103 USB OTA升級BootLoader (一)

    ?1.配置外部高速晶振 ?2.勾選USB功能 ?3.將USB模式配置Virtual Port Com ?4.將系統(tǒng)主頻配置為72M,USB頻率配置為48M. ?5.配置好項目名稱,開發(fā)環(huán)境,最后獲取代碼。 6.修改Flash大小和勾選Use Micro LIB ? 7.修改main.c代碼 ?Update.c代碼 Update.h代碼 ?源碼鏈接: 跳轉鏈接 上位機升級工具:

    2024年02月11日
    瀏覽(28)
  • 【STM32】IAP升級01 bootloader實現(xiàn)以及APP配置(主要)

    【STM32】IAP升級01 bootloader實現(xiàn)以及APP配置(主要)

    通過之前的了解 之前的了解,我們知道實現(xiàn)IAP升級需要兩個條件: 1.APP程序必須在 IAP 程序之后的某個偏移量為 x 的地址開始; 2.APP程序的中斷向量表相應的移動,移動的偏移量為 x; 默認條件下的起始地址 默認的條件下,圖中 IROM1 的起始地址(Start)一般為 0x08000000,大小

    2024年02月03日
    瀏覽(47)
  • 基于STM32單片機BOOTLOADER通過串口升級程序IAP——APP方案

    基于STM32單片機BOOTLOADER通過串口升級程序IAP——APP方案

    ????????????????????????此方法前提是你得有一個EEPROM ? ? ? ? 我用的單片機是STM32F103ZET6 , 此單片機FLASH容量為512KB; 在此單片機里面FLASH的起始地址是0X8000000,BOOT作為引導加載程序一般都是從這個地址開始,單片機一上點默認會從這個地址開始運行,所以將自己

    2024年02月04日
    瀏覽(96)
  • stm32、gd32等芯片固件升級思路

    stm32、gd32等芯片固件升級思路

    眾所都周知,固件固件就是固定不動的軟件,所以不用升級,此貼完結。 。 。 。 。 。 哎,話雖如此固件一般情況下不需要更新,畢竟主要功能是為控制一些底層的硬件,但是你永遠不知道明天和需求哪個先來。所以在一些必要時刻需要給你的單片機留一個后門用于應對各

    2024年02月12日
    瀏覽(28)
  • STM32深入系列02——BootLoader分析與實現(xiàn)

    STM32深入系列02——BootLoader分析與實現(xiàn)

    ==== 文章匯總 ==== 這個應該是最基本的方法,只要自己寫過程序的應該都會,將編譯生成的 hex 文件使用 ST-Link 工具或者 J-Link 工具直接下載進 Flash 即可。Keil中點擊下載也能一鍵下載。 下載時可以看到地址是從 0x0800 0000 ,即 Flash 的起始地址開始下載的。 優(yōu)點 :簡單,插上下

    2024年02月02日
    瀏覽(54)
  • STM32F0實現(xiàn)IAP升級固件

    STM32F0實現(xiàn)IAP升級固件

    好幾年前寫過一篇關于 STM32 bootloader 升級固件的博客,但是使用的芯片是 STM32 F4 系列,升級固件的方式是在外部 flash 的 fat32 文件系統(tǒng)中存入固件文件,reset 后通過特定按鍵進入 IAP 程序。 最近需要在 STM32 上實現(xiàn)同樣的 IAP 功能,但是方式不太一樣,也發(fā)現(xiàn)一些芯片的差別,

    2024年02月14日
    瀏覽(21)
  • STM32 USB DFU固件升級的設計與實現(xiàn)

    STM32 USB DFU固件升級的設計與實現(xiàn)

    STM32微控制器支持通過USB DFU(Device Firmware Upgrade)協(xié)議進行固件升級,這使得設備可以在不需要特殊的調試工具或編程器的情況下,通過USB接口實現(xiàn)固件的更新。 在本文中,我們將介紹如何設計和實現(xiàn)STM32 USB DFU固件升級功能,并提供相關的代碼示例。 ?作者簡介:熱愛科研

    2024年01月25日
    瀏覽(23)
  • STM32單片機實現(xiàn)固件在線升級(IAP)

    單片機的固件升級方式有很多種, 1、ICP:In Circuit Programing,簡單說就是在單片機開發(fā)時使用燒錄器升級程序,比如使用J-Link燒錄單片機程序。 2、ISP:In System Programing,在單片機內部實現(xiàn)了基于通信接口(如串口、I2C、SPI等等)的FLASH引導程序,配合廠家提供的燒錄軟件工具

    2024年02月13日
    瀏覽(23)
  • STM32 IAP應用開發(fā)——通過USB實現(xiàn)固件升級

    STM32 IAP應用開發(fā)——通過USB實現(xiàn)固件升級

    什么是IAP? IAP(In-Application Programming) 指MCU可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。在應用編程(IAP)是用戶的應用代碼對片內Flash存儲器進行擦除/編程的方法。這種方式的典型應用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機的ISP功能就

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包