標題:
stm32 IAP Bootloader V1.0程序源碼
[打印本頁]
作者:
feilonglong
時間:
2018-8-3 11:43
標題:
stm32 IAP Bootloader V1.0程序源碼
1.登陸進去 root coolKids
2.殺掉之前的程序
用 ps -ef 看一下兩個程序的PID號 run.sh 和 sbcmon2.arm
然后用kill PID號 殺掉兩個程序
3 進去alarm目錄 啟動程序 ./sendfile
就是alarm目錄下
chmod 775 sendfile 權(quán)限設(shè)置
echo 123456 >> /dev/ttyS2 串口發(fā)送數(shù)據(jù)
重啟命令:reboot
本實驗將實現(xiàn)如下功能:開機的時候先顯示提示信息,然后等待串口輸入接收APP程序(無校驗,一次性接收),在串口接收到APP程序之后,即可執(zhí)行IAP。如果是SRAM APP,通過按下KEY0即可執(zhí)行這個收到的SRAM APP程序。如果是FLASH APP,則需要先按下KEY_UP按鍵,將串口接收到的APP程序存放到STM32F4的FLASH,之后再按KEY2既可以執(zhí)行這個FLASH APP程序。通過KEY1按鍵,可以手動清除串口接收到的APP程序。DS0用于指示程序運行狀態(tài)。
注意:
1,SRAM APP代碼的起始地址必須是:0X20001000,F(xiàn)LASH APP代碼的起始地址必須是:0X08010000。
2,大家在創(chuàng)建APP代碼的時候,切記要設(shè)置中斷向量偏移量!!
stm32單片機源程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "stmflash.h"
#include "iap.h"
#include <absacc.h>
u8 uartRxBuf[DEFpUartRxBufLen];
u8 uartTxBuf[DEFpUartTxBufLen];
u32 FlashData[1024*28]__at(0x20002000);
IapStr vIapStr = {
FlashData,
uartRxBuf,
uartTxBuf,
0,
0,
0,
0,
0,
0,
1
};
int main(void)
{
u16 t,error=0;
u16 flag;
u8 *pString;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
WatchdogInit();
FeedDog();
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
FeedDog();
PWR_BackupAccessCmd(ENABLE);
PWR_BackupRegulatorCmd(ENABLE);
delay_init(168); //初始化延時函數(shù)
uart_init(460800); //初始化串口波特率為115200
UART4_Configuration();
printf("\r\n系統(tǒng)上電!");
// while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET);
FeedDog();
// if(*(u16 *)(BKPSRAM_BASE+2) < 50)
// *(u16 *)BKPSRAM_BASE = 0x5aa5;
// *(u16 *)(BKPSRAM_BASE+2) = 0;
// if(*(u16 *)BKPSRAM_BASE == 0x5aa5)
vIapStr.FlashProgramFlag = 1;
// else
// vIapStr.FlashProgramFlag = 0;
*(u16 *)BKPSRAM_BASE = 0;
delay_init(168); //初始化延時函數(shù)
uart_init(460800); //初始化串口波特率為115200
UART4_Configuration();
printf("\r\n系統(tǒng)啟動!");
if(vIapStr.FlashProgramFlag)
printf("\r\n系統(tǒng)燒寫請求。");
// while(1)
// {
// delay_ms(1000);
// printf("\r\n系統(tǒng)啟動!");
// FeedDog();
// }
FeedDog();
while(1)
{
if(vIapStr.FlashProgramFlag)
{
printf("\r\n等待接收程序數(shù)據(jù)......");
for(vIapStr.Rx = 0,t=0;t<10000;t++)
{
FeedDog();
delay_ms(1);
if(vIapStr.Rx >5) //開始接收數(shù)據(jù)
{
printf("\r\n開始接收程序數(shù)據(jù)");
break;
}
}
vIapStr.OldRx = 0;
if(vIapStr.FlashProgramFlag == 1 && t>9999)
{
vIapStr.FlashProgramFlag = 0;
printf("\r\n等待超時!");
}
vIapStr.Fram = 0;
t = 0;
while(vIapStr.FlashProgramFlag&&t++<4000)
{
FeedDog();
delay_ms(2);
if((vIapStr.Rx)&&(vIapStr.OldRx == vIapStr.Rx))//新周期內(nèi),沒有收到任何數(shù)據(jù),認為本次數(shù)據(jù)接收完成.
{
t = 0;
delay_ms(2);
flag = FlashDataCrc((u8 *)vIapStr.pUartRxBuf,(u8 *)vIapStr.pData,vIapStr.Rx,&vIapStr.Fram);
if(flag == 0)
{
printf("\r\n第%d包數(shù)據(jù)接收錯誤,重新請求",vIapStr.Fram+1);
error++;
if(error>5)
{
vIapStr.FlashProgramFlag = 0;
printf("\r\n超時正常啟動");
break;
}
}else
printf("\r\n第%d包數(shù)據(jù)接收完成",vIapStr.Fram);
vIapStr.OldRx = 0;
vIapStr.Rx = 0;
if(flag ==2)
{
printf("\r\n程序接收完成");
error = 0;
if(((*(vu32*)(0x20002000+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
{
pString = (u8 *)(0x20002000 + 0x10000);
if(pString[0] == 'd' &&
pString[1] == 'm' &&
pString[2] == 'w' &&
pString[3] == 'A' &&
pString[4] == 'p' &&
pString[5] == 'p'
)
{
printf("\r\n程序版本號:%s",pString);
printf("\r\n開始更新固件...");
iap_write_appbin(FLASH_APP1_ADDR,(u8 *)vIapStr.pData,vIapStr.FlashLenth);//更新FLASH代碼
FeedDog();
printf("\r\n固件更新完成!");
printf("\r\n開始執(zhí)行FLASH用戶代碼!!");
iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
}else
{
printf("\r\n程序版本錯誤!");
printf("\r\n請重新下載應(yīng)用程序!");
vIapStr.FlashProgramFlag = 2;
vIapStr.Fram = 0;
}
}else
{
printf("\r\n非FLASH應(yīng)用程序,無法執(zhí)行!");
printf("\r\n請重新下載應(yīng)用程序!");
vIapStr.FlashProgramFlag = 2;
vIapStr.Fram = 0;
}
}
}
else
vIapStr.OldRx = vIapStr.Rx;
}
}
else
{
FeedDog();
printf("\r\n開始執(zhí)行FLASH用戶代碼!!");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
}else
{
printf("\r\n非FLASH應(yīng)用程序,無法執(zhí)行!");
printf("\r\n請重新下載應(yīng)用程序!");
vIapStr.FlashProgramFlag = 2;
vIapStr.Fram = 0;
}
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
IAP Bootloader V1.0-18.rar
(494.94 KB, 下載次數(shù): 53)
2018-8-3 16:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
tianyu22
時間:
2019-8-1 15:31
正好學(xué)習(xí)stm32的備份區(qū)怎么使用
作者:
云飄火燒
時間:
2019-12-2 10:21
支持一下
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1