#include "stm32f4xx.h" #include "hardware.h" #include "ucos_ii.h" #include "os.h" #include "app_cfg.h" #include "sys_cfg.h" extern OS_EVENT* ModbusReceived; /*接收到modbus请求报文*/ extern OS_EVENT* ModbusAssembled; /*modbus响应帧组装完成*/ /*USART接收空闲中断*/ void USART1_IRQHandler(void) { OSIntEnter(); /*进入中断*/ uint32_t temp; uint16_t rxLenRemain; if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET) { /*在计算数据长度之前先关闭DMA接收通道,防止计算过程中DMA继续转运数据*/ DMA_Cmd(DMA2_Stream2, DISABLE); /*清除IDLE中断标志位*/ temp = USART1->SR; temp = USART1->DR; (void)temp; /*清除传输已经完成TCIF2、传输已经完成一半HTIF2标志位*/ DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2); /*计算数据长度*/ rxLenRemain = DMA_GetCurrDataCounter(DMA2_Stream2); ModbusRxLen = MODBUS_RX_BUF_SIZE - rxLenRemain; if(ModbusRxLen != 0) { OSSemPost(ModbusReceived); } /*重新指定接收地址*/ DMA_MemoryTargetConfig(DMA2_Stream2, (uint32_t)ModbusRxBuf, DMA_Memory_0); /*重启DMA*/ DMA_SetCurrDataCounter(DMA2_Stream2, MODBUS_RX_BUF_SIZE); DMA_Cmd(DMA2_Stream2, ENABLE); } OSIntExit(); /*退出中断*/ } /*modbus响应帧发送*/ void ModbusSend(uint8_t *txBuf, uint16_t len) { /*先关闭DMA发送通道*/ DMA_Cmd(DMA2_Stream7, DISABLE); /*等待DMA关闭*/ while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE); /*清除传输已经完成TCIF7、传输已经完成一半HTIF7、FIFO错误FEIF7标志位*/ DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_FEIF7 | DMA_FLAG_HTIF7 | DMA_FLAG_TCIF7); /*配置发送地址和长度*/ DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0); DMA_SetCurrDataCounter(DMA2_Stream7, len); /*启动 DMA 发送*/ DMA_Cmd(DMA2_Stream7, ENABLE); } /*modbus协议帧解析任务*/ void AppTaskModbusParse (void *p_arg) { while(1) { OSTimeDly(OS_TICKS_PER_SEC); } }