2969|1

79

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[GD32F310评测]通信USART配置和ECHO例程 [复制链接]

最近时间比较紧张,先搞定串口通信程序。本次实现的串口通信程序,RX为异步发送,TX为接收端,通过中断实现。为了验证串口收发功能的正常运行,使用ECHO来验证模块工作。

串口初始化的过程可以划分成三个步骤:

  • 使能时钟

  • 设置串口的参数

  • 使能串口

     rcu_periph_clock_enable(RCU_USART0); // USART0
     usart_clock_enable(USART0);
 ​
     gpio_mode_set(GPIOB,GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_6); // TX
     gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6); // TX
     gpio_mode_set(GPIOB,GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_7); // RX
     gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7); // RX
     usart_baudrate_set(USART0, 115200); // baudrate
     usart_parity_config(USART0,USART_PM_NONE); // parity
     usart_word_length_set(USART0,USART_WL_8BIT); // word length
     usart_stop_bit_set(USART0,USART_STB_1BIT); // stop bit 
     usart_transmit_config(USART0,USART_TRANSMIT_ENABLE); // Setup TX
     usart_receive_config(USART0,USART_RECEIVE_ENABLE); // Setup RX
     usart_data_first_config(USART0,USART_MSBF_LSB); // LSB
     usart_receiver_timeout_enable(USART0); // receiver timeout
     usart_receiver_timeout_threshold_config(USART0,0x0000FFFF);
 ​
     usart_enable(USART0);

USART的接收、发送的DMA可以通过下面的程序实现:

 // USART RX INT
     usart_interrupt_enable(USART0,USART_INT_RBNE);
     nvic_irq_enable(USART0_IRQn, 2U, 2U); // GPIO A0 -> EXTI 0
     
     // USART RX DMA
     usart_dma_transmit_config(USART0,USART_DENT_ENABLE);
     dma_usart_rx.periph_addr = USART0;
     dma_usart_rx.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; // 1 byte
     dma_usart_rx.memory_addr = (uint32_t)(usart_rx);
     dma_usart_rx.memory_width = DMA_PERIPHERAL_WIDTH_8BIT; // 1 byte
     dma_usart_rx.memory_inc = (uint8_t)DMA_MEMORY_INCREASE_DISABLE;
     dma_usart_rx.number = RX_BUFFER_LEN; // buffer size
     dma_usart_rx.priority = (uint32_t)DMA_PRIORITY_LOW;
     dma_init(DMA_CH1, &dma_usart_rx);
     dma_transfer_direction_config(DMA_CH1,DMA_MEMORY_TO_PERIPHERAL);
     
     dma_channel_enable(DMA_CH1);

测试的时候,编写了一个可以实现发送的例程:

 void print(const char* p_fmt, ...) 
 {
     //char str[TX_BUFFER_LEN];
     uint8_t len;
     int i;
 ​
 #if 0
     va_list vArgs;
     va_start(vArgs, p_fmt);
     vsprintf((char*)str, (char const*)p_fmt, vArgs); // This function haven't been realized.
     va_end(vArgs);
 #endif
     
     len = strlen(p_fmt);
     
     for(i=0;i<len;++i)
     {
         while(usart_flag_get(USART0,USART_FLAG_TBE) != SET)
         {
             int temp_delay = 0;
             if(temp_delay < TX_MAX_DELAY)  
                 ++temp_delay;
             else
                 break;
         }
         USART_TDATA(USART0) = (USART_TDATA_TDATA & p_fmt);
     }
     
     return ;
 }

结果发现函数vsprintf并没有被实现,所以只是暂时滥竽充数了一下。

实现了一个简单的测试功能:

 // Loop
 static uint32_t loop_index = 0;
     
     if(loop_index == 0)
     {
         print("Main Loop is running!\r\n");
         loop_index = 0x2FFFF;
     }
     else
     {
             loop_index -= 1;
     }
     

实现了一个简单的ECHO

 void USART0_IRQHandler(void)
 {
     if(usart_interrupt_flag_get(USART0,USART_INT_FLAG_RBNE) == SET)
     {
         // React receive message
         while(usart_flag_get(USART0,USART_FLAG_TBE) != SET)
         {
             static unsigned int temp_delay = 0;
             if(temp_delay < TX_MAX_DELAY)  
                 ++temp_delay;
             else
                 break;
         }
         USART_TDATA(USART0) = (USART_TDATA_TDATA & (USART_RDATA(USART0))); // 反手送出去同时消除标志位
     }
 }

 

下次作为压轴调试SVPWM的调制器。

此帖出自GD32 MCU论坛

最新回复

赶着交作业吧。。。  详情 回复 发表于 2022-6-6 06:04
点赞 关注
 

回复
举报

7069

帖子

11

TA的资源

版主

沙发
 
赶着交作业吧。。。
此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表