AT32F403A DMA+串口空闲中断

1 串口配置

void usart_tx_configuration(void)//tx:A2rx:A3
{
  gpio_init_type gpio_init_struct;
	
  crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);
	crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
	
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = GPIO_PINS_2;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);

  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;	
  gpio_init_struct.gpio_pins = GPIO_PINS_3;
  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  gpio_init(GPIOA, &gpio_init_struct);
	
  usart_init(usart_tx, 230400, USART_DATA_8BITS, USART_STOP_1_BIT);
  usart_transmitter_enable(usart_tx, TRUE);
  usart_receiver_enable(usart_tx, TRUE);	
  nvic_irq_enable(USART2_IRQn, 0,0);
 	usart_interrupt_enable(usart_tx,USART_IDLE_INT, TRUE);
  usart_enable(usart_tx, TRUE);
  usart_dma_transmitter_enable(usart_tx,TRUE);
}

2 DMA配置

void dma_usart_tx_config(void)
{
	dma_init_type dma_init_struct;
	crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
	
  /* dma1 channel1 for usart2 tx configuration */
  dma_reset(DMA1_CHANNEL1);
  dma_default_para_init(&dma_init_struct);
  dma_init_struct.buffer_size = usart_rx_rx.setcount;
  dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
  dma_init_struct.memory_base_addr = (uint32_t)usart_tx_tx.tx_buffer;
  dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  dma_init_struct.memory_inc_enable = TRUE;
  dma_init_struct.peripheral_base_addr = (uint32_t)&usart_tx->dt;
  dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  dma_init_struct.peripheral_inc_enable = FALSE;
  dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  dma_init_struct.loop_mode_enable = FALSE;
  dma_init(DMA1_CHANNEL1, &dma_init_struct);
	
	 /* dma1 channel2 for usart2 rx configuration */
  dma_reset(DMA1_CHANNEL2);
  dma_default_para_init(&dma_init_struct);
  dma_init_struct.buffer_size = usart_tx_rx.setcount;
  dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  dma_init_struct.memory_base_addr = (uint32_t)usart_tx_rx.rx_buffer;
  dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  dma_init_struct.memory_inc_enable = TRUE;
  dma_init_struct.peripheral_base_addr = (uint32_t)&usart_tx->dt;
  dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  dma_init_struct.peripheral_inc_enable = FALSE;
  dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  dma_init_struct.loop_mode_enable = FALSE;
  dma_init(DMA1_CHANNEL2, &dma_init_struct);
	
	dma_flexible_config(DMA1, FLEX_CHANNEL1, DMA_FLEXIBLE_UART2_TX);
	dma_flexible_config(DMA1, FLEX_CHANNEL2, DMA_FLEXIBLE_UART2_RX);
  dma_channel_enable(DMA1_CHANNEL2, TRUE);
//	dma_channel_enable(DMA1_CHANNEL1, TRUE);
}

3 串口中断函数

void USART2_IRQHandler(void)
{
	if (usart_flag_get(usart_tx, USART_IDLEF_FLAG) != RESET)
	{
		usart_flag_clear(usart_tx, USART_IDLEF_FLAG);	
		dma_channel_enable(DMA1_CHANNEL2, FALSE);
	  usart_tx_rx.recv_end_flag = 1;
		usart_tx_rx.rx_cout = BUFFER_SIZE-dma_data_number_get(DMA1_CHANNEL2);
		dma_channel_enable(DMA1_CHANNEL2, TRUE);
	}		
}

4 DMA发送

void usart_dma_work(u8 *data,u16 len)
{ 
      DMA1_CHANNEL1->dtcnt=len;                          
      DMA1_CHANNEL1->maddr=(uint32_t)data;                
      usart_dma_transmitter_enable(usart_tx,TRUE);        
      dma_channel_enable(DMA1_CHANNEL1, TRUE);            
      while(dma_flag_get(DMA1_FDT1_FLAG)==RESET );        
      dma_flag_clear(DMA1_FDT1_FLAG);                    
      dma_channel_enable(DMA1_CHANNEL1, FALSE);           
      usart_dma_transmitter_enable(usart_tx,FALSE);        

}

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值