Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

76 rader
1.6 KiB

  1. #include "stm32f4xx_flash.h"
  2. #include "stm32f4xx.h"
  3. #include "modbus.h"
  4. #include "modbus_flash.h"
  5. #include "string.h"
  6. extern uint8_t ModbusCoil[1250];
  7. extern uint16_t ModbusReg[10000];
  8. uint8_t ModbusCoilWriteFlash(void)
  9. {
  10. uint32_t addres = MODBUS_FLASH_COIL_ADDR;
  11. uint16_t halfWord;
  12. FLASH_Status status;
  13. FLASH_Unlock();
  14. /*扇区擦除,写入之前必须先擦除*/
  15. status = FLASH_EraseSector(MODBUS_FLASH_SECTOR, VoltageRange_3);
  16. for(uint16_t i = 0; i < 1250; i += 2)
  17. {
  18. /*前面的放在低字节,后面的放在高字节*/
  19. halfWord = ((uint16_t)ModbusCoil[i + 1] << 8) | ((uint16_t)ModbusCoil[i]);
  20. status = FLASH_ProgramHalfWord(addres, ModbusCoil[i]);
  21. /*写入失败,停止写入*/
  22. if(status != FLASH_COMPLETE)
  23. {
  24. break;
  25. }
  26. addres += 2;
  27. }
  28. FLASH_Lock();
  29. }
  30. uint8_t ModbusRegWriteFlash(void)
  31. {
  32. uint32_t addres = MODBUS_FLASH_REG_ADDR;
  33. FLASH_Status status;
  34. FLASH_Unlock();
  35. /*扇区擦除,写入之前必须先擦除*/
  36. status = FLASH_EraseSector(MODBUS_FLASH_SECTOR, VoltageRange_3);
  37. for(uint16_t i = 0; i < 10000; i++)
  38. {
  39. status = FLASH_ProgramHalfWord(addres, ModbusReg[i]);
  40. /*写入失败,停止写入*/
  41. if(status != FLASH_COMPLETE)
  42. {
  43. break;
  44. }
  45. addres += 2;
  46. }
  47. FLASH_Lock();
  48. }
  49. uint8_t ModbusRegReadFlash(void)
  50. {
  51. memcpy(ModbusCoil, (const void *)MODBUS_FLASH_COIL_ADDR, 1250);
  52. }
  53. uint8_t ModbusCoilReadFlash(void)
  54. {
  55. memcpy(ModbusReg, (const void *)MODBUS_FLASH_REG_ADDR, 10000);
  56. }