rcu_periph_clock_enable(RCU_DMA0);
dma_parameter_struct dma;
//DMA接收配置
dma.direction=DMA_PERIPHERAL_TO_MEMORY; //方向 外设至内存
dma.memory_addr=(uint32_t)&ModbusRecBuffer[0]; //内存地址 modbus缓冲区
dma.memory_inc=DMA_MEMORY_INCREASE_ENABLE; //内存增长 启用
dma.memory_width=DMA_MEMORY_WIDTH_8BIT; //内存宽度 8位
dma.number=MODBUS_REC_BUFFER_LEN; //接收最大数量 300字节
dma.periph_addr=(uint32_t)&USART_DATA(USART0); //外设地址 串口1,数据寄存器
dma.periph_inc=DMA_PERIPH_INCREASE_DISABLE; //外设增长 否,固定
dma.periph_width=DMA_PERIPHERAL_WIDTH_8BIT; //外设宽度 8位
dma.priority=DMA_PRIORITY_MEDIUM; //优先级
dma_init(DMA0,DMA_CH4,&dma);
dma_channel_enable(DMA0,DMA_CH4);
usart_dma_transmit_config(USART0,USART_DENR_ENABLE); //dma接收中断
//usart_interrupt_enable(USART0,USART_INT_RBNE); //接收中断
void USART1_IRQHandler(void){ //串口1收发中断 modbus
// USART_FLAG_ORERR /USART_FLAG_RBNE
//USART_FLAG_ORERR 数据未能来得及接收,有丢失的字节
if(usart_flag_get(USART1,USART_FLAG_RT)){
usart_flag_clear(USART1,USART_FLAG_RT);
dma_channel_disable(DMA0,DMA_CH5);
if(ModbusRecBuffer[0]==MODBUS_ADDR && MODBUS_REC_BUFFER_LEN-dma_transfer_number_get(DMA0,DMA_CH5)>=7){ //modbus至少7字节
ModbusRecReady=1;
UartReady[1]=1;
}
dma_transfer_number_config(DMA0,DMA_CH5,MODBUS_REC_BUFFER_LEN);
dma_channel_enable(DMA0,DMA_CH5);
}
}
|