1.登陆进去 root coolKids
2.杀掉之前的程序
用 ps -ef 看一下两个程序的PID号 run.sh 和 sbcmon2.arm
然后用kill PID号 杀掉两个程序
3 进去alarm目录 启动程序 ./sendfile
就是alarm目录下
chmod 775 sendfile 权限设置
echo 123456 >> /dev/ttyS2 串口发送数据
重启命令:reboot
本实验将实现如下功能:开机的时候先显示提示信息,然后等待串口输入接收APP程序(无校验,一次性接收),在串口接收到APP程序之后,即可执行IAP。如果是SRAM APP,通过按下KEY0即可执行这个收到的SRAM APP程序。如果是FLASH APP,则需要先按下KEY_UP按键,将串口接收到的APP程序存放到STM32F4的FLASH,之后再按KEY2既可以执行这个FLASH APP程序。通过KEY1按键,可以手动清除串口接收到的APP程序。DS0用于指示程序运行状态。
注意:
1,SRAM APP代码的起始地址必须是:0X20001000,FLASH APP代码的起始地址必须是:0X08010000。
2,大家在创建APP代码的时候,切记要设置中断向量偏移量!!
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);//设置系统中断优先级分组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); //初始化延时函数
- uart_init(460800); //初始化串口波特率为115200
- UART4_Configuration();
- printf("\r\n系统上电!");
- // 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); //初始化延时函数
- uart_init(460800); //初始化串口波特率为115200
- UART4_Configuration();
- printf("\r\n系统启动!");
- if(vIapStr.FlashProgramFlag)
- printf("\r\n系统烧写请求。");
-
- // while(1)
- // {
- // delay_ms(1000);
- // printf("\r\n系统启动!");
- // FeedDog();
- // }
- FeedDog();
- while(1)
- {
-
- if(vIapStr.FlashProgramFlag)
- {
- printf("\r\n等待接收程序数据......");
- for(vIapStr.Rx = 0,t=0;t<10000;t++)
- {
- FeedDog();
- delay_ms(1);
- if(vIapStr.Rx >5) //开始接收数据
- {
- printf("\r\n开始接收程序数据");
- 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))//新周期内,没有收到任何数据,认为本次数据接收完成.
- {
- t = 0;
- delay_ms(2);
- flag = FlashDataCrc((u8 *)vIapStr.pUartRxBuf,(u8 *)vIapStr.pData,vIapStr.Rx,&vIapStr.Fram);
- if(flag == 0)
- {
- printf("\r\n第%d包数据接收错误,重新请求",vIapStr.Fram+1);
- error++;
- if(error>5)
- {
- vIapStr.FlashProgramFlag = 0;
- printf("\r\n超时正常启动");
- break;
- }
- }else
- printf("\r\n第%d包数据接收完成",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开始执行FLASH用户代码!!");
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
- }else
- {
- printf("\r\n程序版本错误!");
- printf("\r\n请重新下载应用程序!");
- vIapStr.FlashProgramFlag = 2;
- vIapStr.Fram = 0;
- }
-
- }else
- {
-
- printf("\r\n非FLASH应用程序,无法执行!");
- printf("\r\n请重新下载应用程序!");
- vIapStr.FlashProgramFlag = 2;
- vIapStr.Fram = 0;
- }
- }
- }
- else
- vIapStr.OldRx = vIapStr.Rx;
- }
-
- }
- else
- {
- FeedDog();
- printf("\r\n开始执行FLASH用户代码!!");
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
- }else
- {
- printf("\r\n非FLASH应用程序,无法执行!");
- printf("\r\n请重新下载应用程序!");
- vIapStr.FlashProgramFlag = 2;
- vIapStr.Fram = 0;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
IAP Bootloader V1.0-18.rar
(494.94 KB, 下载次数: 53)
|