解释一下这段代码void APPProgram(uint32_t adrr,uint32_t Data,int len)//传入地址按2k对齐 { int i; uint32_t full=(0xffffffff)>>((4-(len%4))*8);//末位处理法 full^=0xffffffff; if((adrr&0xc000000)==0x8000000){ FLASH_Unlock(); FLASH_ErasePage(adrr);//擦除1k FLASH_ErasePage(adrr+0x400); for(i=0;i<512;i++){ if((len/4)<i) goto EndProgram1; FLASH_ProgramWord(adrr+(i*4),((uint32_t*)Data)[i]|(((len/4)==i)?full:0));//小端模式 } EndProgram1: FLASH_Lock(); }else{//外部flash写法 W25QXX_Write((uint8_t*)Data,adrr&0x3ffffff,len);//500ms } }
时间: 2024-04-02 07:34:37 浏览: 54
这段代码的作用是将数据写入指定地址的Flash或外部Flash中。下面是对该函数的解释:
1. 函数参数
- adrr:写入数据的地址,需要按2k对齐。
- Data:需要写入的数据。
- len:需要写入的数据长度。
2. 末位处理法
- 由于Flash只能按页(一般为1k或2k大小)进行擦除和写入操作,因此需要进行末尾数据的处理。
- full 的计算方法为将 0xffffffff 右移 (4-(len%4)) * 8 位后取反,即将末尾不足4字节的数据全部填充为1。
- 因此在写入末尾不足4字节的数据时,需要将这些数据与 full 进行或运算,将其填充为1。
3. 内部Flash写法
- 如果写入地址位于内部Flash(0x08000000 ~ 0x080FFFFF),则需要使用STM32内部Flash操作函数进行擦除和写入操作。
- 首先需要进行Flash解锁操作,然后擦除待写入数据的两个1k页(adrr和adrr+0x400)。
- 然后将数据按512字节为单位,分别写入每一页中,最后进行Flash锁定操作。
4. 外部Flash写法
- 如果写入地址位于外部Flash(0x8000000 ~ 0xBFFFFFF),则需要使用外部Flash操作函数进行写入操作。
- 这里使用的是W25QXX型号的SPI Flash,使用W25QXX_Write函数进行写入操作,写入速度较慢,大约需要500ms。
总体来说,该函数的作用是将数据写入STM32的Flash或外部Flash中,其中对于末尾不足4字节的数据进行了特别处理,保证了数据的完整性。如果写入地址为内部Flash,则使用STM32内部Flash操作函数进行擦除和写入操作,如果写入地址为外部Flash,则使用W25QXX_Write函数进行写入操作。
阅读全文