<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      GD32的庫比較糟糕當時完全是參考STM32的驅動來的,當然我也知道直接用ST的庫可以,但是原因比較特殊就不多說了。

      代碼就不貼了,以后用GD的機會我想不會太多。

      先初始化串口,使能串口,使能接受完成中斷。

      再初始化DMA通道。貼一段

      1 int fputc(int ch, FILE *f)
      2 {
      3     usart_data_transmit(USART0, (uint8_t)ch);
      4     while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
      5     return ch;
      6 }

       

       1 void uart0_dma_config(void)
       2 {     
       3         dma_single_data_parameter_struct dma_init_struct;
       4     /* enable DMA1 */
       5     rcu_periph_clock_enable(RCU_DMA1);
       6     /* deinitialize DMA channel7(USART0 tx) */
       7     dma_deinit(DMA1, DMA_CH7);
       8     dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
       9     dma_init_struct.memory0_addr = (uint32_t)tx_buffer0;
      10     dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
      11     dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
      12     dma_init_struct.number = TXBUFF_SIZE;
      13     dma_init_struct.periph_addr = USART0_DATA_ADDRESS;
      14     dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
      15     dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
      16     dma_single_data_mode_init(DMA1, DMA_CH7, dma_init_struct);
      17     /* configure DMA mode */
      18     dma_circulation_disable(DMA1, DMA_CH7);
      19     dma_channel_subperipheral_select(DMA1, DMA_CH7, DMA_SUBPERI4);
      20     
      21     dma_deinit(DMA1, DMA_CH2);
      22     dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
      23     dma_init_struct.memory0_addr = (uint32_t)rx_buffer0;
      24         dma_init_struct.number = RXBUFF_SIZE;
      25     dma_single_data_mode_init(DMA1, DMA_CH2, dma_init_struct);
      26     /* configure DMA mode */
      27     dma_circulation_disable(DMA1, DMA_CH2);
      28     dma_channel_subperipheral_select(DMA1, DMA_CH2, DMA_SUBPERI4);
      29         
      30         dma_channel_enable(DMA1, DMA_CH2);//UART0 RX
      31         
      32         usart_dma_receive_config(USART0, USART_DENR_ENABLE);
      33         
      34 //        nvic_irq_enable(DMA1_Channel2_IRQn, 3, 0);
      35 //        dma_interrupt_enable(DMA1,DMA_CH2,DMA_CHXCTL_FTFIE);
      36 }    

      #define USART0_DATA_ADDRESS    ((uint32_t)0x40011004)

      其實里面的USART0_DATA_ADDRESS,就是串口0 的數據寄存器地址。

      先看接收。

       1 void USART1_IRQHandler(void)
       2 {
       3     uint32_t buff_length = 0;
       4     if((RESET != usart_interrupt_flag_get(USART1, USART_INT_IDLEIE)) && 
       5        (RESET != usart_flag_get(USART1, USART_FLAG_IDLEF)))
       6     {
       7                 usart_data_receive(USART1);
       8                 buff_length =  RXBUFF_SIZE - DMA_CHCNT(DMA0,DMA_CH5);
       9 //                 UART_TRANSMIT(USART1,rx_buffer1,buff_length);
      10 //                 UART_DMA_TRANSMIT(USART1,rx_buffer1,buff_length);     
      11 //            while(1)
      12 //            if(dma_flag_get(DMA0,DMA_CH6,DMA_INTF_FTFIF)!=RESET)//μè′yDMA2_Steam7′?ê?íê3é
      13 //                { 
      14 //                    dma_flag_clear(DMA0,DMA_CH6,DMA_INTF_FTFIF);//??3yDMA2_Steam7′?ê?íê3é±ê??
      15 //                    
      16 //                    break; 
      17 //            }
      18             UART_DMA_TRANSMIT(UART3,rx_buffer1,buff_length);     
      19              while(1)
      20             if(dma_flag_get(DMA0,DMA_CH4,DMA_INTF_FTFIF)!=RESET)//μè′yDMA2_Steam7′?ê?íê3é
      21                 { 
      22                     dma_flag_clear(DMA0,DMA_CH4,DMA_INTF_FTFIF);//??3yDMA2_Steam7′?ê?íê3é±ê??
      23                     
      24                     break; 
      25             }
      26             dma_channel_disable(DMA0, DMA_CH5);
      27             dma_flag_clear(DMA0,DMA_CH5,DMA_INTF_FTFIF);//??3yDMA2_Steam7′?ê?íê3é±ê??
      28             dma_channel_enable(DMA0, DMA_CH5);
      29             }
      30             else{     
      31                         uint32_t isrflags   = USART_STAT0(USART1);
      32                         if((usart_interrupt_flag_get(USART1,USART_FLAG_PERR))!=RESET)
      33                         {
      34                                         USART_DATA(USART1);
      35                                         usart_flag_clear(USART1, USART_FLAG_PERR);
      36                         }
      37                         if((usart_interrupt_flag_get(USART1, USART_FLAG_FERR))!=RESET)
      38                         {
      39                                         USART_DATA(USART1);
      40                                         usart_flag_clear(USART1, USART_FLAG_FERR);
      41                         }
      42                         
      43                         if((usart_interrupt_flag_get(USART1, USART_FLAG_NERR))!=RESET)
      44                         {
      45                                         USART_DATA(USART1);
      46                                         usart_flag_clear(USART1, USART_FLAG_NERR);
      47                         }        
      48                         
      49                         if((usart_interrupt_flag_get(USART1, USART_FLAG_ORERR))!=RESET)
      50                         {
      51                                         USART_DATA(USART1);//ORE???,????CR
      52                                         usart_flag_clear(USART1, USART_FLAG_ORERR);
      53                         }        
      54     }
      55 }

      數據當然是在DMA通道FIFO里,本次接收長度=總的FIFO長度-剩余接收長度。

      然后發送這么長的數據。

      清發送標志,關閉接受通道,清接收標志,再打開接收通道。

       1 void UART_DMA_TRANSMIT(uint32_t usart_periph,uint8_t *DATA,uint32_t NUM)
       2 {
       3     if(usart_periph == USART0)
       4         {
       5             memcpy(tx_buffer0,DATA,NUM);
       6             DMA_CHCNT(DMA1, DMA_CH7) = NUM;
       7             dma_channel_enable(DMA1, DMA_CH7);
       8         }
       9         else if(usart_periph == USART1)
      10         {
      11             memcpy(tx_buffer1,DATA,NUM);
      12             DMA_CHCNT(DMA0, DMA_CH6) = NUM;
      13             dma_channel_enable(DMA0, DMA_CH6);
      14         }
      15         else if(usart_periph == USART2)
      16         {
      17             memcpy(tx_buffer2,DATA,NUM);
      18             DMA_CHCNT(DMA0, DMA_CH3) = NUM;
      19             dma_channel_enable(DMA0, DMA_CH3);
      20         }
      21         else if(usart_periph == UART3)
      22         {
      23             memcpy(tx_buffer3,DATA,NUM);
      24             DMA_CHCNT(DMA0, DMA_CH4) = NUM;
      25             dma_channel_enable(DMA0, DMA_CH4);
      26         }
      27          
      28         usart_dma_transmit_config(usart_periph, USART_DENT_ENABLE);
      29 
      30 }

      發送函數:把數放入通道FIFO,告訴通道數據長度,使能通道,調用一次發送。OK

      posted on 2019-05-16 17:18  李小牛。  閱讀(9472)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 无码人妻久久一区二区三区app| 国产高清自产拍av在线| 久久a级片| 国产自产一区二区三区视频| 色综合热无码热国产| 国产伦码精品一区二区| 亚洲人成电影网站色| 一区二区三区久久精品国产| 成人午夜福利一区二区四区| 国产在线啪| 国产99久久亚洲综合精品西瓜tv| 久久综合色最新久久综合色| 永久免费AV无码网站YY| 西西444www高清大胆| 国产老肥熟一区二区三区| 午夜精品福利亚洲国产| 国产99青青成人A在线| 久久精品国产色蜜蜜麻豆| 国产成人无码A区在线观| 东京热无码国产精品| 亚成区成线在人线免费99| 暖暖 免费 高清 日本 在线观看5| 伊人欧美在线| 日韩精品一卡二卡三卡在线| 欧美xxxxhd高清| 亚洲精品三区四区成人少| 97午夜理论电影影院| 在线观看的网站| 国产一区二区三区四区五区加勒比| 国产一区国产二区在线视频| 国产成人综合色视频精品| 国产亚洲精品第一综合| 日韩乱码视频一区二区三区| 国产精品香港三级国产av| 亚洲护士一区二区三区| 亚洲日本韩国欧美云霸高清| 国产成人一区二区三区影院动漫| 亚洲人成网线在线播放VA| 久久国产精品老人性| 亚洲少妇人妻无码视频| 色吊丝免费av一区二区|