|
- #define PAGE_ADDR (0x08000000 + 63 * 1024)
复制代码- uint8 MemReadByte(uint16 *data,uint16 num)
- {
- uint16 *temp_addr = (uint16 *)PAGE_ADDR;
-
- while(num --)
- {
- *data ++ = *temp_addr ++;
- }
-
- return 1;
- }
复制代码- uint8 MemWriteByte(uint16 *data,uint16 num)
- {
- FLASH_Status temp_stat;
- uint32 temp_addr = PAGE_ADDR;
-
- FLASH_Unlock(); // Flash解锁,允许操作相关的寄存器
- temp_stat = FLASH_ErasePage(PAGE_ADDR); // 擦出制定的页
-
- if(temp_stat != FLASH_COMPLETE)
- {
- FLASH_Lock();
- return 0;
- }
-
- while(num --)
- {
- temp_stat = FLASH_ProgramHalfWord(temp_addr,*data);
- if(temp_stat != FLASH_COMPLETE)
- {
- FLASH_Lock();
- return 0;
- }
-
- temp_addr += 2;
- data++;
- }
-
- FLASH_Lock();
- return 1;
- }
复制代码- #include "app_cfg.h"
- uint16 write_buf[10] = {0,1,2,3,4,5,6,7,8,9};
- int main(void)
- {
- uint16 cnt;
-
- STM32Init();
-
- MemWriteByte(write_buf,10);
- for(cnt = 0;cnt < 10;cnt ++)
- {
- write_buf[cnt] = 11;
- }
- MemReadByte(write_buf,10);
-
- while(1)
- {
- ;
- }
- }
复制代码
呵 先用别人的代码来开门见山,看的懂的一眼就知道这段代码是干嘛的,看不懂的,我这就简单介绍下,这是一段动态操作stm32内部flash的程序,内部flash,不仅仅是作为程序的烧录,也可以作为一些少量且重要的信息的动态存储,放心,操作得当,掉电不丢失。(注意,添加官方的flash头文件)
正是因为程序在运行时可以动态的擦除自身的flash,才有了这么多的IAP。(这句话,说的自己都有点含糊,你们就将就的看吧),程序是最好的老师,我也不多说废话,收集了一些IAP的例程。
串口IAP:
各大开发板的例程都有,并且有见解 就不分享了
U盘IAP:
U盘IAP.rar
(914.02 KB, 下载次数: 32)
SD卡IAP:
SD卡IAP.rar
(2.98 MB, 下载次数: 27)
CAN总线 IAP:
CAN-Bootloader-master.zip
(9.04 MB, 下载次数: 41)
还有对应这个的上位机
稍微涉猎下,就会发现,这些IAP都有一个通性,都是将内部flash分成两个区,一个bootloader区,一个用户APP区,程序一上上电,肯定先执行bootloader区的程序,在这里,先等待几秒钟,是否有升级命令,没有就判断APP区是不是可以执行的,是就跳转,不是就一直等待,有升级命令,就执行升级。升级完成,检查一下,开始跳转到APP区,那里将是一个无限循环。可以加命令跳转到bootloader区,重新操作。值得注意的是,烧写flash时,一定要知道自己烧录到了哪一块里面了。
|
|