这个星期开始接触单片机基于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);