25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

96 satır
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. /*flash写入任务*/
  14. void AppTaskModbusWriteFlash(void *p_arg)
  15. {
  16. OS_ERR err;
  17. while(1)
  18. {
  19. OSSemPend(ModbusWriteFlash, 0, &err);
  20. OSTimeDly(OS_TICKS_PER_SEC);
  21. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  22. ModbusErr = ModbusFlashWrite();
  23. }
  24. }
  25. uint8_t ModbusFlashWrite(void)
  26. {
  27. uint32_t addres = MODBUS_FLASH_COIL_ADDR;
  28. uint16_t halfWord;
  29. FLASH_Status status;
  30. FLASH_Unlock();
  31. FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR
  32. | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  33. /*扇区擦除,写入之前必须先擦除*/
  34. status = FLASH_EraseSector(MODBUS_FLASH_SECTOR, VoltageRange_3);
  35. if(status != FLASH_COMPLETE)
  36. {
  37. return ERR_SLAVE;
  38. }
  39. for(uint16_t i = 0; i < 1250; i += 2)
  40. {
  41. /*前面的放在低字节,后面的放在高字节*/
  42. halfWord = ((uint16_t)ModbusCoil[i + 1] << 8) | ((uint16_t)ModbusCoil[i]);
  43. status = FLASH_ProgramHalfWord(addres, halfWord);
  44. /*写入失败,停止写入*/
  45. if(status != FLASH_COMPLETE)
  46. {
  47. return ERR_SLAVE;
  48. }
  49. addres += 2;
  50. }
  51. addres = MODBUS_FLASH_REG_ADDR;
  52. for(uint16_t i = 0; i < 10000; i++)
  53. {
  54. status = FLASH_ProgramHalfWord(addres, ModbusReg[i]);
  55. /*写入失败,停止写入*/
  56. if(status != FLASH_COMPLETE)
  57. {
  58. return ERR_SLAVE;
  59. }
  60. addres += 2;
  61. }
  62. FLASH_Lock();
  63. return 0;
  64. }
  65. void ModbusRegReadFlash(void)
  66. {
  67. memcpy(ModbusReg, (const void *)MODBUS_FLASH_REG_ADDR, sizeof(ModbusReg));
  68. }
  69. void ModbusCoilReadFlash(void)
  70. {
  71. memcpy(ModbusCoil, (const void *)MODBUS_FLASH_COIL_ADDR, sizeof(ModbusCoil));
  72. }