这个星期开始接触单片机基于STM32的编程,C语言只是在学校时用过,20多年过去了,重新捡起来。
编程工具是Keil uVision5。
这个星期完成了单片机之间的串口通讯,有些设置需要在机器断电的情况下保存,这时要将设置写入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;
}
uint16_t ReadFromFlashHalfWord(uint32_t Addr){
//读取32位字节数据后返回16位数据
return (__IO uint16_t)Addr;
}
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);
}
}
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();
}
读写测试:
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);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。