|
1.登陸進(jìn)去 root coolKids
2.殺掉之前的程序
用 ps -ef 看一下兩個(gè)程序的PID號(hào) run.sh 和 sbcmon2.arm
然后用kill PID號(hào) 殺掉兩個(gè)程序
3 進(jìn)去alarm目錄 啟動(dòng)程序 ./sendfile
就是alarm目錄下
chmod 775 sendfile 權(quán)限設(shè)置
echo 123456 >> /dev/ttyS2 串口發(fā)送數(shù)據(jù)
重啟命令:reboot
本實(shí)驗(yàn)將實(shí)現(xiàn)如下功能:開機(jī)的時(shí)候先顯示提示信息,然后等待串口輸入接收APP程序(無校驗(yàn),一次性接收),在串口接收到APP程序之后,即可執(zhí)行IAP。如果是SRAM APP,通過按下KEY0即可執(zhí)行這個(gè)收到的SRAM APP程序。如果是FLASH APP,則需要先按下KEY_UP按鍵,將串口接收到的APP程序存放到STM32F4的FLASH,之后再按KEY2既可以執(zhí)行這個(gè)FLASH APP程序。通過KEY1按鍵,可以手動(dòng)清除串口接收到的APP程序。DS0用于指示程序運(yùn)行狀態(tài)。
注意:
1,SRAM APP代碼的起始地址必須是:0X20001000,F(xiàn)LASH APP代碼的起始地址必須是:0X08010000。
2,大家在創(chuàng)建APP代碼的時(shí)候,切記要設(shè)置中斷向量偏移量!
stm32單片機(jī)源程序如下:
- #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)先級(jí)分組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í)函數(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í)函數(shù)
- uart_init(460800); //初始化串口波特率為115200
- UART4_Configuration();
- printf("\r\n系統(tǒng)啟動(dòng)!");
- if(vIapStr.FlashProgramFlag)
- printf("\r\n系統(tǒng)燒寫請(qǐng)求。");
-
- // while(1)
- // {
- // delay_ms(1000);
- // printf("\r\n系統(tǒng)啟動(dò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等待超時(shí)!");
- }
- 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ù),認(rèn)為本次數(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ù)接收錯(cuò)誤,重新請(qǐng)求",vIapStr.Fram+1);
- error++;
- if(error>5)
- {
- vIapStr.FlashProgramFlag = 0;
- printf("\r\n超時(shí)正常啟動(dòng)");
- 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程序版本號(hào):%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程序版本錯(cuò)誤!");
- printf("\r\n請(qǐng)重新下載應(yīng)用程序!");
- vIapStr.FlashProgramFlag = 2;
- vIapStr.Fram = 0;
- }
-
- }else
- {
-
- printf("\r\n非FLASH應(yīng)用程序,無法執(zhí)行!");
- printf("\r\n請(qǐng)重新下載應(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請(qǐng)重新下載應(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 上傳
點(diǎn)擊文件名下載附件
|
|