[研电赛技术支持] GD32F103/303串口+空闲中断连续接收数据

[复制链接]
2128|22
 楼主| t61000 发表于 2022-11-18 15:29 | 显示全部楼层 |阅读模式
头文件#ifndef _UART_H_
#define _UART_H_

#include "stdint.h"
#include "gd32f30x.h"
#define CACHE_NUM 128



//数据接收处理函数
typedef void (*recv_hanled)(uint8_t *data, uint16_t len);

typedef struct
{

    uint32_t usart_periph;                        //外设名称
    uint32_t dma_periph;                                //dma 外设
    dma_channel_enum dma_channelx;//dma外设通道
    uint8_t dma_nvic_irq;                         //dma中断号
    uint8_t uart_nvic_irq;                        //串口中断号
    uint8_t dma_or_idle;                                //传输完成标记和收到一帧数据标记dm
    uint16_t data_num;                                        //已经接收到的数据量
    uint8_t uart_rx_buffers[CACHE_NUM];//接收数据缓冲区
    recv_hanled hanled_fun;                        //数据接收处理函数
} uart_dam_t;


//初始化串口涉及的时钟和gpio gpio USART/UART
void bsp_uart_gpio_rcu_init(uint32_t usart_periph);

/*基本初始化函数*/
void bsp_uart_usart_base_init(uint32_t usart_periph);

//串口相关自定义结构初始化
uart_dam_t * init_uart_dma_struct(uint32_t usart_periph);

//使能串口中断
void bsp_uart_enable_uart_interrupt(uart_dam_t *puart_dma);

//dma 外设初始化
int bsp_uart_dma_nvic_init(uart_dam_t *puart_dma);

//注册一个处理函数
int bsp_uart_register_handle(uart_dam_t *puart_dma, recv_hanled hanled_fun);

循环调用函数,处理串口信息
void bsp_uart_dma_procees(uint32_t tick);
#endif



 楼主| t61000 发表于 2022-11-18 15:32 | 显示全部楼层
源文件
  1. #include "uart.h"
  2. #include "stdio.h"
  3. #include "gd32f30x.h"




  4. //每个串口外设一个自定义结构

  5. uart_dam_t uart0_dma;
  6. uart_dam_t uart1_dma;
  7. uart_dam_t uart2_dma;
  8. uart_dam_t uart3_dma;

  9. //接收到的数据个数
  10. volatile uint16_t uart_rxcount[5];
  11. //串口空闲或缓冲器慢标志
  12. volatile uint8_t idle_or_full = 0;

  13. /* 重定向printf函数 */
  14. int fputc(int ch, FILE *f)
  15. {
  16.     int cnt = 1000;
  17.     usart_data_transmit(USART0, (uint8_t)ch);

  18.     while(RESET == usart_flag_get(USART0, USART_FLAG_TBE) && cnt--);


  19.     usart_data_transmit(USART1, (uint8_t)ch);
  20.     cnt = 1000;

  21.     while(RESET == usart_flag_get(USART1, USART_FLAG_TBE) && cnt--);

  22.     return ch;
  23. }
  24. //初始化自定义结构体
  25. uart_dam_t * init_uart_dma_struct(uint32_t usart_periph)
  26. {
  27.                 //UART0 DMA0-CH4
  28.                 //UART1 DMA0-CH5
  29.                 //UART2-DMA0-CH2
  30.                 //UART3-DMA1-CH2


  31.     uart_dam_t *puart_dma = NULL;


  32.     if(usart_periph == USART0)
  33.     {
  34.         puart_dma = &uart0_dma;
  35.         puart_dma->dma_periph = DMA0;
  36.         puart_dma->dma_channelx = DMA_CH4;
  37.         puart_dma->dma_nvic_irq = DMA0_Channel4_IRQn;
  38.         puart_dma->uart_nvic_irq = USART0_IRQn;
  39.     }
  40.     else if(usart_periph == USART1)
  41.     {
  42.         puart_dma = &uart1_dma;
  43.         puart_dma->dma_periph = DMA0;
  44.         puart_dma->dma_channelx = DMA_CH5;
  45.         puart_dma->dma_nvic_irq = DMA0_Channel5_IRQn;
  46.         puart_dma->uart_nvic_irq = USART1_IRQn;
  47.     }
  48.     else if(usart_periph == USART2)
  49.     {
  50.         puart_dma = &uart2_dma;
  51.         puart_dma->dma_periph = DMA0;
  52.         puart_dma->dma_channelx = DMA_CH2;
  53.         puart_dma->dma_nvic_irq = DMA0_Channel2_IRQn;
  54.         puart_dma->uart_nvic_irq = USART2_IRQn;
  55.     }
  56.     else if(usart_periph == UART3)
  57.     {
  58.         puart_dma = &uart3_dma;
  59.         puart_dma->dma_periph = DMA1;
  60.         puart_dma->dma_channelx = DMA_CH2;
  61.         puart_dma->dma_nvic_irq = DMA0_Channel2_IRQn;
  62.         puart_dma->uart_nvic_irq = UART3_IRQn;
  63.     }

  64.     puart_dma->usart_periph = usart_periph;
  65.     return puart_dma;
  66. }


  67. /*!
  68.     \brief      初始化串口涉及的时钟和gpio gpio USART/UART
  69.     \param[in]  usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4)
  70.     \param[out] none
  71.     \retval     none
  72. */

  73. void bsp_uart_gpio_rcu_init(uint32_t usart_periph)
  74. {
  75.     /*********************串口0********************/
  76.     if(usart_periph == USART0)
  77.     {
  78.         /* 使能串口时钟 */
  79.         rcu_periph_clock_enable(RCU_USART0);
  80.         /* 使能gpio时钟 */
  81.         rcu_periph_clock_enable(RCU_GPIOA);

  82.         /* gpio IO 初始化发送引脚 */
  83.         gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
  84.         /* 初始化接收引脚 */
  85.         gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
  86.     }
  87.     /*********************串口0********************/

  88.     /*********************串口1********************/
  89.     else if(usart_periph == USART1)
  90.     {
  91.         /* 使能串口时钟 */
  92.         rcu_periph_clock_enable(RCU_USART1);

  93.         /* 使能gpio时钟 */
  94.         rcu_periph_clock_enable(RCU_GPIOA);

  95.         /* gpio IO 初始化发送引脚 */
  96.         gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  97.         /* 初始化接收引脚 */
  98.         gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
  99.     }
  100.     /*********************串口1********************/

  101.     /*********************串口2********************/
  102.     else if(usart_periph == USART2)
  103.     {
  104.         /* 使能串口时钟 */
  105.         rcu_periph_clock_enable(RCU_USART2);

  106.         /* 使能gpio时钟 */
  107.         rcu_periph_clock_enable(RCU_GPIOB);

  108.         /* gpio IO 初始化发送引脚 */
  109.         gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
  110.         /* 初始化接收引脚 */
  111.         gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);

  112.     }
  113.     /*********************串口2********************/

  114.     /*********************串口3********************/
  115.     else if(usart_periph == UART3)
  116.     {
  117.         /* 使能串口时钟 */
  118.         rcu_periph_clock_enable(RCU_UART3);

  119.         /* 使能gpio时钟 */
  120.         rcu_periph_clock_enable(RCU_GPIOC);

  121.         /* gpio IO 初始化发送引脚 */
  122.         gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
  123.         /* 初始化接收引脚 */
  124.         gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);

  125.     }
  126.     /*********************串口3********************/

  127.     /*********************串口4********************/
  128.     else if(usart_periph == UART4)
  129.     {
  130.         /* 使能串口时钟 */
  131.         rcu_periph_clock_enable(RCU_UART4);
  132.     }

  133.     /*********************串口4********************/

  134. }

  135. /*基本初始化函数*/
  136. void bsp_uart_usart_base_init(uint32_t usart_periph)
  137. {
  138.     //外设的gpio初始化和时钟初始化
  139.     bsp_uart_gpio_rcu_init(usart_periph);

  140.     /* USART configure 串口参数初始化 */
  141.     usart_deinit(usart_periph);
  142.     //设置波特率
  143.     usart_baudrate_set(usart_periph, 115200U);
  144.     //设置数据长度
  145.     usart_word_length_set(usart_periph, USART_WL_8BIT);
  146.     //设置停止位
  147.     usart_stop_bit_set(usart_periph, USART_STB_1BIT);
  148.     //设置检验位
  149.     usart_parity_config(usart_periph, USART_PM_NONE);
  150.     //硬件流管理 都关闭
  151.     usart_hardware_flow_rts_config(usart_periph, USART_RTS_DISABLE);
  152.     usart_hardware_flow_cts_config(usart_periph, USART_CTS_DISABLE);
  153.     //串口接收使能
  154.     usart_receive_config(usart_periph, USART_RECEIVE_ENABLE);
  155.     //串口发送使能
  156.     usart_transmit_config(usart_periph, USART_TRANSMIT_ENABLE);
  157.     //使能串口
  158.     usart_enable(usart_periph);
  159. }


  160. /*
  161.         使能串口中断
  162. */
  163. void bsp_uart_enable_uart_interrupt(uart_dam_t *puart_dma)
  164. {
  165.     /*中断管理器使能,并分配优先级*/

  166.     nvic_irq_enable(puart_dma->uart_nvic_irq, 1, 1);

  167.     /*清除中断标志*/
  168.     usart_interrupt_flag_clear(puart_dma->usart_periph, USART_INT_FLAG_IDLE);
  169.     /* 使能串口中断 */
  170.     usart_interrupt_enable(puart_dma->usart_periph, USART_INT_IDLE);//空闲中断
  171. }



  172. /*
  173.         功能:DMA 中断接收数据,uart5 不可以使用dma传输数据
  174.         hope_len:希望接收的数据个数
  175.         circulation:是否使用连续模式
  176. */
  177. int  bsp_uart_dma_nvic_init(uart_dam_t *puart_dma)
  178. {
  179.     dma_parameter_struct dma_init_struct;

  180.     if(puart_dma == NULL)
  181.     {
  182.         return 0;
  183.     }

  184.     /* enable DMA0 clock 使能DMA0 的时钟*/
  185.     if(puart_dma->usart_periph == USART0 ||
  186.             puart_dma->usart_periph == USART1 ||
  187.             puart_dma->usart_periph == USART2)
  188.     {
  189.         rcu_periph_clock_enable(RCU_DMA0);
  190.     }
  191.     else if(puart_dma->usart_periph == UART3)
  192.     {
  193.         rcu_periph_clock_enable(RCU_DMA1);
  194.     }

  195.     //中断管理器开启通道中断
  196.     nvic_irq_enable(puart_dma->dma_nvic_irq, 0, 1);
  197.     // 复位代码指定通道
  198.     dma_deinit(puart_dma->dma_periph, puart_dma->dma_channelx);
  199.     dma_struct_para_init(&dma_init_struct);
  200.     dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; //外设到内存
  201.     dma_init_struct.memory_addr = (uint32_t)puart_dma->uart_rx_buffers;        //接收缓冲区开始地址
  202.     dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//内存地址自动增长
  203.     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;//数据长度8bit
  204.     dma_init_struct.number = CACHE_NUM;//缓冲区大小
  205. #define USART0_DATA_ADDRESS      ((uint32_t)&USART_DATA(USART0))
  206.     dma_init_struct.periph_addr = USART0_DATA_ADDRESS;//外设寄存器地址
  207.     dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//外设寄存器地址不自动增加
  208.     dma_init_struct.memory_width = DMA_PERIPHERAL_WIDTH_8BIT;//外输数据宽度
  209.     dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;//DMA优先级
  210.     dma_init(puart_dma->dma_periph, puart_dma->dma_channelx, &dma_init_struct);
  211.     dma_circulation_enable(puart_dma->dma_periph, puart_dma->dma_channelx);//连续传输

  212.     //数据传输方式不是内存到内存
  213.     dma_memory_to_memory_disable(puart_dma->dma_periph, puart_dma->dma_channelx);

  214.     /* USART DMA0 串口0DMA 数据接收使能 */
  215.     usart_dma_receive_config(puart_dma->usart_periph, USART_DENR_ENABLE);
  216.     /* enable DMA0 串口0 DMA 接收完成中断使能 */
  217.     dma_interrupt_enable(puart_dma->dma_periph, puart_dma->dma_channelx, DMA_INT_FTF);
  218.     /* enable DMA0 启用指定的DMA通道*/
  219.     dma_channel_enable(puart_dma->dma_periph, puart_dma->dma_channelx);
  220.     return 1;
  221. }

  222. /*
  223.         禁止中断和DMA
  224. */
  225. void  bsp_uart0_init_idle_it_disable()
  226. {
  227.     //禁止中断
  228.     nvic_irq_disable(USART0_IRQn);
  229.     usart_interrupt_disable(USART0, USART_INT_IDLE);//空闲中断
  230.     //禁止DMA
  231.     dma_channel_disable(DMA0, DMA_CH4);

  232. }

  233. /*
  234.         串口0中断处理函数
  235. */
  236. void USART0_IRQHandler(void)
  237. {
  238.     uart_dam_t *p_uart_dma = &uart0_dma;

  239.     if(RESET != usart_interrupt_flag_get(p_uart_dma->usart_periph, USART_INT_FLAG_IDLE))
  240.     {
  241.         usart_data_receive(p_uart_dma->usart_periph);


  242.         p_uart_dma->data_num = CACHE_NUM - dma_transfer_number_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  243.         p_uart_dma->dma_or_idle = 1;
  244.         //重新使能dma,重新计算剩余未传输数量
  245.         dma_channel_disable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);
  246.         DMA_CHCNT(p_uart_dma->dma_periph, p_uart_dma->dma_channelx) = CACHE_NUM;
  247.         dma_channel_enable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  248.     }
  249. }
  250. /*
  251.         串口3中断处理函数
  252. */
  253. void USART1_IRQHandler(void)
  254. {
  255.     uart_dam_t *p_uart_dma = &uart1_dma;

  256.     if(RESET != usart_interrupt_flag_get(p_uart_dma->usart_periph, USART_INT_FLAG_IDLE))
  257.     {
  258.         usart_data_receive(p_uart_dma->usart_periph);


  259.         p_uart_dma->data_num = CACHE_NUM - dma_transfer_number_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  260.         p_uart_dma->dma_or_idle = 1;
  261.         //重新使能dma,重新计算剩余未传输数量
  262.         dma_channel_disable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);
  263.         DMA_CHCNT(p_uart_dma->dma_periph, p_uart_dma->dma_channelx) = CACHE_NUM;
  264.         dma_channel_enable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  265.     }
  266. }
  267. /*
  268.         串口2中断处理函数
  269. */
  270. void USART2_IRQHandler(void)
  271. {
  272.     uart_dam_t *p_uart_dma = &uart2_dma;

  273.     if(RESET != usart_interrupt_flag_get(p_uart_dma->usart_periph, USART_INT_FLAG_IDLE))
  274.     {
  275.         usart_data_receive(p_uart_dma->usart_periph);


  276.         p_uart_dma->data_num = CACHE_NUM - dma_transfer_number_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  277.         p_uart_dma->dma_or_idle = 1;
  278.         //重新使能dma,重新计算剩余未传输数量
  279.         dma_channel_disable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);
  280.         DMA_CHCNT(p_uart_dma->dma_periph, p_uart_dma->dma_channelx) = CACHE_NUM;
  281.         dma_channel_enable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  282.     }
  283. }
  284. /*
  285.         串口3中断处理函数
  286. */
  287. void UART3_IRQHandler(void)
  288. {
  289.     uart_dam_t *p_uart_dma = &uart3_dma;

  290.     if(RESET != usart_interrupt_flag_get(p_uart_dma->usart_periph, USART_INT_FLAG_IDLE))
  291.     {
  292.         usart_data_receive(p_uart_dma->usart_periph);


  293.         p_uart_dma->data_num = CACHE_NUM - dma_transfer_number_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  294.         p_uart_dma->dma_or_idle = 1;
  295.         //重新使能dma,重新计算剩余未传输数量
  296.         dma_channel_disable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);
  297.         DMA_CHCNT(p_uart_dma->dma_periph, p_uart_dma->dma_channelx) = CACHE_NUM;
  298.         dma_channel_enable(p_uart_dma->dma_periph, p_uart_dma->dma_channelx);

  299.     }
  300. }
  301. /*串口0dma*/
  302. void DMA0_Channel4_IRQHandler(void)
  303. {
  304.     uart_dam_t *p_uart_dma = &uart0_dma;

  305.     //获取中断标记并判断否是置位
  306.     if(dma_interrupt_flag_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_FTF))
  307.     {
  308.         //清除dma中断标记
  309.         dma_interrupt_flag_clear(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_G);
  310.         p_uart_dma->dma_or_idle = SET;
  311.     }

  312. }
  313. /*串口1 dma*/
  314. void DMA0_Channel5_IRQHandler(void)
  315. {
  316.     uart_dam_t *p_uart_dma = &uart1_dma;

  317.     //获取中断标记并判断否是置位
  318.     if(dma_interrupt_flag_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_FTF))
  319.     {
  320.         //清除dma中断标记
  321.         dma_interrupt_flag_clear(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_G);
  322.         p_uart_dma->dma_or_idle = SET;
  323.     }

  324. }
  325. /*串口2 dma*/
  326. void DMA0_Channel2_IRQHandler(void)
  327. {
  328.     uart_dam_t *p_uart_dma = &uart2_dma;

  329.     //获取中断标记并判断否是置位
  330.     if(dma_interrupt_flag_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_FTF))
  331.     {
  332.         //清除dma中断标记
  333.         dma_interrupt_flag_clear(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_G);
  334.         p_uart_dma->dma_or_idle = SET;
  335.     }

  336. }
  337. /*串口3 dma*/
  338. void DMA1_Channel2_IRQHandler(void)
  339. {
  340.     uart_dam_t *p_uart_dma = &uart3_dma;

  341.     //获取中断标记并判断否是置位
  342.     if(dma_interrupt_flag_get(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_FTF))
  343.     {
  344.         //清除dma中断标记
  345.         dma_interrupt_flag_clear(p_uart_dma->dma_periph, p_uart_dma->dma_channelx, DMA_INT_FLAG_G);
  346.         p_uart_dma->dma_or_idle = SET;
  347.     }

  348. }

  349. /*注册一个处理函数*/
  350. int bsp_uart_register_handle(uart_dam_t *puart_dma, recv_hanled hanled_fun)
  351. {

  352.     puart_dma->hanled_fun = hanled_fun;
  353. }

  354. //循环调用函数用于处理各个串口数据
  355. void bsp_uart_dma_procees(uint32_t tick)
  356. {
  357.     if(uart0_dma.dma_or_idle)
  358.     {
  359.         uart_dam_t *puart_dma = &uart0_dma;
  360.         puart_dma->dma_or_idle = 0;
  361.         puart_dma->hanled_fun(puart_dma->uart_rx_buffers, puart_dma->data_num);
  362.         puart_dma->data_num = 0;
  363.     }
  364.     else if(uart1_dma.dma_or_idle)
  365.     {
  366.         uart_dam_t *puart_dma = &uart1_dma;
  367.         puart_dma->dma_or_idle = 0;
  368.         puart_dma->hanled_fun(puart_dma->uart_rx_buffers, puart_dma->data_num);
  369.         puart_dma->data_num = 0;
  370.     }

  371.     if(uart2_dma.dma_or_idle)
  372.     {
  373.         uart_dam_t *puart_dma = &uart2_dma;
  374.         puart_dma->dma_or_idle = 0;
  375.         puart_dma->hanled_fun(puart_dma->uart_rx_buffers, puart_dma->data_num);
  376.         puart_dma->data_num = 0;
  377.     }

  378.     if(uart3_dma.dma_or_idle)
  379.     {
  380.         uart_dam_t *puart_dma = &uart3_dma;
  381.         puart_dma->dma_or_idle = 0;
  382.         puart_dma->hanled_fun(puart_dma->uart_rx_buffers, puart_dma->data_num);
  383.         puart_dma->data_num = 0;
  384.     }

  385. }
 楼主| t61000 发表于 2022-11-18 15:34 | 显示全部楼层
测试
  1. #include "gd32f30x.h"
  2. #include "gd32f303_sys.h"
  3. #include "systick.h"
  4. #include "uart.h"
  5. #include "stdio.h"
  6. #include "adc.h"
  7. #include "button.h"
  8. #include "bsp_gpio.h"
  9. #include "at24cxx.h"

  10. void uart0_recv_hanled(uint8_t *data, uint16_t len)
  11. {
  12.     printf("read len = %d:", len);

  13.     for(int i = 0; i < len; i++)
  14.     {
  15.         printf("%02x ", (int)data[i]);
  16.     }

  17.     printf("\r\n");
  18. }
  19. /*!
  20.         主函数:
  21. */

  22. int main(void)
  23. {


  24.     /* 配置系统时钟 */
  25.     systick_config();
  26.     //设置中断分组
  27.     nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  28.     /* gpio时钟使能*/

  29.     // 配置MCU调试下载使用swd方式,同时将pb3 和PB4 作为普通gpio
  30.     rcu_periph_clock_enable(RCU_AF);
  31.     gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
  32.     //gpio
  33.     bsp_gpio_init();
  34.     //串口初始化
  35.     bsp_uart_gpio_rcu_init(USART0);
  36.     bsp_uart_usart_base_init(USART0);
  37.     //下边是串口的数据接收使用dma方式需要调用和函数
  38.     uart_dam_t *uart_dma = init_uart_dma_struct(USART0);
  39.     bsp_uart_enable_uart_interrupt(uart_dma);
  40.     bsp_uart_dma_nvic_init(uart_dma);
  41.     bsp_uart_register_handle(uart_dma, uart0_recv_hanled);

  42.     // bsp_at24c02_init();
  43.     printf("hello gd32\r\n");
  44.     //初始化ADC
  45. //    adc_init();
  46. //    init_btn();

  47.     BEEP = 0;

  48.     while(1)
  49.     {
  50.         if(tick % 500 == 0)
  51.         {
  52.             LED0 = !LED0;
  53.             LED1 = !LED1;
  54.             LED2 = !LED2;
  55.         }

  56.         //循环调用
  57.         bsp_uart_dma_procees(tick);


  58.     }

  59. }

 楼主| t61000 发表于 2022-11-18 15:42 | 显示全部楼层
 楼主| t61000 发表于 2022-11-18 15:42 | 显示全部楼层
# 测试图
817956377377c363d7.png
chenqianqian 发表于 2022-11-19 10:57 来自手机 | 显示全部楼层
这样发帖,不方便阅读啊。
daichaodai 发表于 2022-11-19 17:41 来自手机 | 显示全部楼层
用中断发送和接受数据,效率更高。
tpgf 发表于 2022-12-7 13:51 | 显示全部楼层
每个数据包之间应该都有多长时间的空闲时间呢
磨砂 发表于 2022-12-7 14:17 | 显示全部楼层
如何在这种情况下测试丢包数据情况呢
晓伍 发表于 2022-12-7 14:38 | 显示全部楼层
确实轮询太浪费资源 使用中断接收就会好很多
八层楼 发表于 2022-12-7 14:53 | 显示全部楼层
目前定时的间隔是多少呀  感觉时间准吗
观海 发表于 2022-12-7 15:17 | 显示全部楼层
看代码 貌似楼主启用了dma是吗  如果代码非常简单的话  使用dma会不会反而复杂化呢
观海 发表于 2022-12-7 15:20 | 显示全部楼层
当出现串口堵塞的时候 一般如何处理呢
guanjiaer 发表于 2022-12-7 15:37 | 显示全部楼层
感觉过程处理的有点复杂了  其实流程还是很简单的
vivilyly 发表于 2022-12-11 17:56 | 显示全部楼层
可以使用DMA的方式进行数据的传输的吗?
louliana 发表于 2022-12-12 10:44 | 显示全部楼层
串口的空闲字符是用来激活空闲中断的吗
jkl21 发表于 2022-12-12 11:41 | 显示全部楼层
GD32F103有空闲中断的吗?
elsaflower 发表于 2022-12-12 12:12 | 显示全部楼层
串口通信数据连续性,该怎么处理?   
janewood 发表于 2022-12-12 12:52 | 显示全部楼层
串口接收比较好的处理方式了吗?              
houjiakai 发表于 2022-12-12 13:41 | 显示全部楼层
串口中断接收程序,怎样一次性接受多个字符?  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

124

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部