2436|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))); // 反手送出去同时消除标志位
     }
 }

image-20220605211917082.png  

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

此帖出自GD32 MCU论坛

最新回复

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

回复
举报

6646

帖子

9

TA的资源

版主

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

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

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
硬件设计手册

硬件设计手册

芯片封装概述

芯片封装 一、DIP双列直插式封装  DIP(DualIn-line Package)是指采用双列直插形式封装的集成电路芯片,绝大多数中小规模 ...

一种零交叉调整率的解决方案

交叉调整率一直是困扰多路输出电源设计者的棘手问题,如果多路输出中的某(特别是负载较重的)一路出现负载大幅度变化(甚至开路 ...

glibc-2.11-libgcc_eh-1.patch

C运行时库glibc的相关安装包及补丁地址: glibc-2.11.tar.bz2,下载地址为 ftp://ftp.gnu.org/gnu/glibc/glibc-2.11.tar.bz2 ...

关于运放接入容性负载后的稳定性问题

看到有人翻出来一个很久以前的帖子,是运放接入电容负载后发生振荡的,但似乎没有看到正确的回帖。这个现象是菜鸟级设计者常见的 ...

LED灯渐亮渐灭功能一般通过什么电路实现?

LED灯渐亮渐灭功能一般通过什么电路实现?这个GP9401方案的竞争力如何? 455871 455869 455 ...

无刷电机驱动器技术工程师招聘

岗位职责: 1、设计开发BLDC驱动器; 2、对BLDC控制算法进行仿真研究,完成产品开发; 3、完成样机制作,调试,量产后版本 ...

【获奖名单】有奖问答|MPS 隔离解决方案

【活动详情】有奖问答|MPS 隔离解决方案 【领奖日期】请获奖者务必在2022年4月8日23:59前,按照下方领奖确认流程完成领 ...

《换道赛车:新能源汽车的中国道路》二、政府在新能源汽车发展中的角色立场和历史责任

《换道赛车:新能源汽车的中国道路》二、政府在新能源汽车发展中的角色立场和历史责任 政府对新能源的配套政策帮扶和设施建设 ...

嵌入式硬件和嵌入式软件如何选择?

最近岗位分配,让选择嵌入式软件和嵌入式硬件,应该如何选择?那个更有前途,包括钱途?应该如何学习?

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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