您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

79 行
1.7 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. /*计算数据长度*/
  20. rxLenRemain = DMA_GetCurrDataCounter(DMA2_Stream2);
  21. ModbusRxLen = MODBUS_RX_BUF_SIZE - rxLenRemain;
  22. if(ModbusRxLen != 0)
  23. {
  24. OSSemPost(ModbusReceived);
  25. }
  26. /*重启DMA*/
  27. DMA_SetCurrDataCounter(DMA2_Stream2, MODBUS_RX_BUF_SIZE);
  28. DMA_Cmd(DMA2_Stream2, ENABLE);
  29. /*清除IDLE中断标志位*/
  30. temp = USART1->SR;
  31. temp = USART1->DR;
  32. }
  33. OSIntExit(); /*退出中断*/
  34. }
  35. /*modbus响应帧发送*/
  36. void ModbusSend(uint8_t *txBuf, uint16_t len)
  37. {
  38. /*先关闭DMA发送通道*/
  39. DMA_Cmd(DMA2_Stream7, DISABLE);
  40. /*等待DMA关闭*/
  41. while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE);
  42. /*配置发送地址和长度*/
  43. DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0);
  44. DMA_SetCurrDataCounter(DMA2_Stream7, len);
  45. /*启动 DMA 发送*/
  46. DMA_Cmd(DMA2_Stream7, ENABLE);
  47. }
  48. /*modbus响应帧发送任务*/
  49. void AppTaskModbusSend (void *p_arg)
  50. {
  51. }
  52. /*modbus协议帧解析任务*/
  53. void AppTaskModbusParse (void *p_arg)
  54. {
  55. }