xuxinyi 2 сар өмнө
parent
commit
6f02cee50e
2 өөрчлөгдсөн 41 нэмэгдсэн , 0 устгасан
  1. 2 0
      Core/Inc/main.h
  2. 39 0
      Core/Src/main.c

+ 2 - 0
Core/Inc/main.h

@@ -70,6 +70,8 @@ void Error_Handler(void);
 #define PowerLED_GPIO_Port GPIOB
 
 /* USER CODE BEGIN Private defines */
+
+#define FLASH_USER_ADDR   0x0800FC00  // 用户存储页(最后 1KB)
 extern uint8_t rx_buf[25];
 extern uint8_t rx_buf_uart2[25];
 extern uint8_t rx_buf_uart2_DMA[25];

+ 39 - 0
Core/Src/main.c

@@ -190,6 +190,35 @@ uint32_t RTC_CalcDiffSeconds(RTC_DateTimeTypeDef *t1, RTC_DateTimeTypeDef *t2)
     return 24*3600 - (s1 - s2);  // 跨零点的情况
 }
 
+void Flash_Write_LoraAddr(uint8_t addrH, uint8_t addrL)
+{
+  HAL_FLASH_Unlock();
+
+  // 擦除 1 页(1024字节)
+  FLASH_EraseInitTypeDef eraseInit;
+  uint32_t PageError = 0;
+  eraseInit.TypeErase   = FLASH_TYPEERASE_PAGES;
+  eraseInit.PageAddress = FLASH_USER_ADDR;
+  eraseInit.NbPages     = 1;
+  HAL_FLASHEx_Erase(&eraseInit, &PageError);
+
+  // 组合两个字节为一个半字(高字节 | 低字节)
+  uint16_t halfword = ((uint16_t)addrH << 8) | addrL;
+
+  // 写入
+  HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_USER_ADDR, halfword);
+
+  HAL_FLASH_Lock();
+}
+
+void Flash_Read_LoraAddr(uint8_t *addrH, uint8_t *addrL)
+{
+  uint16_t halfword = *(uint16_t*)FLASH_USER_ADDR;
+  *addrH = (halfword >> 8) & 0xFF;
+  *addrL = halfword & 0xFF;
+}
+
+
 
 /* USER CODE END 0 */
 
@@ -232,6 +261,16 @@ int main(void)
 
   powerOn();
   E52_CtlPowerOn_Fun();
+
+  deviceInfo.loraDeviceAddress_H = 0xFE;
+  deviceInfo.loraDeviceAddress_L = 0xE1;
+  Flash_Write_LoraAddr(deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
+  uint8_t addrH, addrL;
+  while (TRUE) {
+    Flash_Read_LoraAddr(&addrH, &addrL);
+    printf("LoraAddr: %02X%02X\r\n", addrH, addrL);
+    HAL_Delay(1000);
+  }
   // 在需要设置RTC时间的地方直接调用
   // 参数依次为:小时、分钟、秒、星期、月份、日期、年份(均为BCD格式)
   RTC_SetDateTime(&hrtc,