You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

94 lines
2.1 KiB

  1. #include "stm32f4xx_flash.h"
  2. #include "stm32f4xx.h"
  3. #include "modbus.h"
  4. #include "modbus_flash.h"
  5. #include "string.h"
  6. #include "os.h"
  7. extern uint8_t ModbusCoil[1250];
  8. extern uint16_t ModbusReg[10000];
  9. extern uint8_t ModbusErr;
  10. extern OS_EVENT* ModbusWriteFlash; /*接收到modbus写入coil请求报文*/
  11. uint8_t ModbusFlashWrite(void);
  12. uint8_t ModbusErrReply(uint8_t func, uint8_t err);
  13. void AppTaskModbusWriteFlash(void *p_arg)
  14. {
  15. OS_ERR err;
  16. while(1)
  17. {
  18. OSSemPend(ModbusWriteFlash, 0, &err);
  19. OSTimeDly(OS_TICKS_PER_SEC);
  20. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  21. ModbusErr = ModbusFlashWrite();
  22. }
  23. }
  24. uint8_t ModbusFlashWrite(void)
  25. {
  26. uint32_t addres = MODBUS_FLASH_COIL_ADDR;
  27. uint16_t halfWord;
  28. FLASH_Status status;
  29. FLASH_Unlock();
  30. FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR
  31. | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  32. /*扇区擦除,写入之前必须先擦除*/
  33. status = FLASH_EraseSector(MODBUS_FLASH_SECTOR, VoltageRange_3);
  34. if(status != FLASH_COMPLETE)
  35. {
  36. return ERR_SLAVE;
  37. }
  38. for(uint16_t i = 0; i < 1250; i += 2)
  39. {
  40. /*前面的放在低字节,后面的放在高字节*/
  41. halfWord = ((uint16_t)ModbusCoil[i + 1] << 8) | ((uint16_t)ModbusCoil[i]);
  42. status = FLASH_ProgramHalfWord(addres, halfWord);
  43. /*写入失败,停止写入*/
  44. if(status != FLASH_COMPLETE)
  45. {
  46. return ERR_SLAVE;
  47. }
  48. addres += 2;
  49. }
  50. addres = MODBUS_FLASH_REG_ADDR;
  51. for(uint16_t i = 0; i < 10000; i++)
  52. {
  53. status = FLASH_ProgramHalfWord(addres, ModbusReg[i]);
  54. /*写入失败,停止写入*/
  55. if(status != FLASH_COMPLETE)
  56. {
  57. return ERR_SLAVE;
  58. }
  59. addres += 2;
  60. }
  61. FLASH_Lock();
  62. return 0;
  63. }
  64. void ModbusRegReadFlash(void)
  65. {
  66. memcpy(ModbusReg, (const void *)MODBUS_FLASH_REG_ADDR, sizeof(ModbusReg));
  67. }
  68. void ModbusCoilReadFlash(void)
  69. {
  70. memcpy(ModbusCoil, (const void *)MODBUS_FLASH_COIL_ADDR, sizeof(ModbusCoil));
  71. }