這個星期開始接觸單片機基於STM32的編程,C語言只是在學校時用過,20多年過去了,從新撿起來。編程
編程工具是Keil uVision5。ide
這個星期完成了單片機之間的串口通信,有些設置須要在機器斷電的狀況下保存,這時要將設置寫入Flash,須要的時候再讀取出來。通過一天的努力,測試成功了。工具
實際的代碼:測試
uint32_t ReadFromFlashOneWord(uint32_t Addr){
//從Flash中讀取一個字(半個字的讀取)
uint32_t HData,LData;//定義高位、低位兩個數據
HData=(__IO uint16_t)Addr;
LData=(__IO uint16_t)(Addr+2);
return (HData<<16)+LData;
}ui
uint16_t ReadFromFlashHalfWord(uint32_t Addr){
//讀取32位字節數據後返回16位數據
return (__IO uint16_t)Addr;
}code
void ReadFromFlashMultipleWord(uint32_t StartAddr,uint16_t ReadData,uint16_t Count){
uint16_t i;
for(i=0;i<Count;i++){
ReadData[i]=ReadFromFlashHalfWord(StartAddr+i2);
}
}ip
void WriteToFlashOneWord(uint32_t StartAddr,uint32_t WriteData){
//向Flash指定的地址寫入一個字
HAL_FLASH_Unlock();
//擦除
FLASH_EraseInitTypeDef EraseInitStrut;
EraseInitStrut.TypeErase=FLASH_TYPEERASE_PAGES;
EraseInitStrut.PageAddress=StartAddr;
EraseInitStrut.NbPages=1;
//設置頁面錯誤
uint32_t PageError=0;
//擦除
HAL_FLASHEx_Erase(&EraseInitStrut,&PageError);
//寫入Flash
HAL_FLASH_Program(TYPEPROGRAM_WORD,StartAddr,WriteData);
//鎖定Flash
HAL_FLASH_Lock();
}
讀寫測試:it
uint32_t TestData=0x12345678; uint32_t TestAddr=0x0800F000; //寫入Flash WriteToFlashOneWord(TestAddr,TestData); HAL_Delay (100); //uint16_t OutData; uint8_t HData1,HData2,LData1,LData2; HData1= (uint8_t)(TestData>>24); HData2= (uint8_t)(TestData>>16); LData1= (uint8_t)(TestData>>8); LData2=(uint8_t)TestData; //OutData=ReadFromFlashHalfWord(TestAddr); Send_Buffer[61]=HData1; Send_Buffer[62]=HData2; Send_Buffer[63]=LData1; Send_Buffer[64]=LData2; HAL_UART_Transmit(&hlpuart1,Send_Buffer,70,10);