我在用GD32E103做串口通讯的时候,采用DMA方式。但是每次执行到发送函数后,程序就会卡死。不知道是不是我的DMA配置有什么问题?参考demo程序看不出有何问题发生。需要配置为DMA的串口已经用重定向测试过,可以打印数据,串口的配置没有问题。
datasheet如下
void uart1_dma_txinit(void)
{
dma_parameter_struct dma_init_struct;
/* enable DMA0 */
rcu_periph_clock_enable(RCU_DMA0);
dma_struct_para_init(&dma_init_struct);
dma_deinit(DMA0, DMA_CH6);
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;//????
dma_init_struct.memory_addr = NULL;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.number = 0;
dma_init_struct.periph_addr = USART1_DATA_ADDRESS; //????
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA0, DMA_CH6, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH6);
dma_memory_to_memory_disable(DMA0, DMA_CH6);
}
void usart2_dma_send(uint8_t *buffer, uint16_t len)
{
dma_channel_disable(DMA0, DMA_CH6);
dma_memory_address_config(DMA0, DMA_CH6,(uint32_t)buffer);//????????????
dma_transfer_number_config(DMA0, DMA_CH6,len);//????????
dma_channel_enable(DMA0, DMA_CH6);
usart_dma_transmit_config(USART1, USART_TRANSMIT_ENABLE);//????DMA??
while(RESET == dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF));
//dma_flag_clear(DMA0, DMA_CH6, DMA_FLAG_FTF);
}
//调用的代码块如下
for( ;; )
{
gd_eval_led_toggle(LED2);
//dma_flag_clear(DMA0, DMA_CH6, DMA_FLAG_FTF);
//usart1_dma_trans(str, 1);
usart2_dma_send(str,1);
//while(RESET == dma_flag_get(DMA0, DMA_CH6, DMA_INTF_FTFIF));
printf("dma err: %d \n", dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_ERR));
printf("dma intf_ftfif %d \n", dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF));
printf("dma htf : %d \n", dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_HTF));
//dma_flag_clear(DMA0, DMA_CH6, DMA_FLAG_HTF);
vTaskDelay(500 / portTICK_RATE_MS);
}