Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

85 wiersze
2.2 KiB

  1. #include "stm32f4xx.h"
  2. #include "hardware.h"
  3. #include "ucos_ii.h"
  4. #include "os.h"
  5. #include "app_cfg.h"
  6. #include "sys_cfg.h"
  7. extern OS_EVENT* ModbusReceived; /*接收到modbus请求报文*/
  8. extern OS_EVENT* ModbusAssembled; /*modbus响应帧组装完成*/
  9. /*USART接收空闲中断*/
  10. void USART1_IRQHandler(void)
  11. {
  12. OSIntEnter(); /*进入中断*/
  13. uint32_t temp;
  14. uint16_t rxLenRemain;
  15. if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
  16. {
  17. /*在计算数据长度之前先关闭DMA接收通道,防止计算过程中DMA继续转运数据*/
  18. DMA_Cmd(DMA2_Stream2, DISABLE);
  19. /*清除IDLE中断标志位*/
  20. temp = USART1->SR;
  21. temp = USART1->DR;
  22. (void)temp;
  23. /*清除传输已经完成TCIF2、传输已经完成一半HTIF2标志位*/
  24. DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2);
  25. /*计算数据长度*/
  26. rxLenRemain = DMA_GetCurrDataCounter(DMA2_Stream2);
  27. ModbusRxLen = MODBUS_RX_BUF_SIZE - rxLenRemain;
  28. if(ModbusRxLen != 0)
  29. {
  30. OSSemPost(ModbusReceived);
  31. }
  32. /*重新指定接收地址*/
  33. DMA_MemoryTargetConfig(DMA2_Stream2, (uint32_t)ModbusRxBuf, DMA_Memory_0);
  34. /*重启DMA*/
  35. DMA_SetCurrDataCounter(DMA2_Stream2, MODBUS_RX_BUF_SIZE);
  36. DMA_Cmd(DMA2_Stream2, ENABLE);
  37. }
  38. OSIntExit(); /*退出中断*/
  39. }
  40. /*modbus响应帧发送*/
  41. void ModbusSend(uint8_t *txBuf, uint16_t len)
  42. {
  43. /*先关闭DMA发送通道*/
  44. DMA_Cmd(DMA2_Stream7, DISABLE);
  45. /*等待DMA关闭*/
  46. while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE);
  47. /*清除传输已经完成TCIF7、传输已经完成一半HTIF7、FIFO错误FEIF7标志位*/
  48. DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_FEIF7 | DMA_FLAG_HTIF7 | DMA_FLAG_TCIF7);
  49. /*配置发送地址和长度*/
  50. DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0);
  51. DMA_SetCurrDataCounter(DMA2_Stream7, len);
  52. /*启动 DMA 发送*/
  53. DMA_Cmd(DMA2_Stream7, ENABLE);
  54. }
  55. /*modbus协议帧解析任务*/
  56. void AppTaskModbusParse (void *p_arg)
  57. {
  58. while(1)
  59. {
  60. OSTimeDly(OS_TICKS_PER_SEC);
  61. }
  62. }