4600|0

862

帖子

2

TA的资源

纯净的硅(初级)

楼主
 

[GD32F350]第二弹:USART相关 [复制链接]

本帖最后由 wo4fisher 于 2018-9-3 20:51 编辑

1、colibri_350共有两个USART外设,在板上USART0连接到了PA9(Tx)&PA10(Rx),然后排针TTL电平引出,USART1在CPU引脚PA2(Tx)&PA3(Rx)引出到ch340...

      图中左上角第一列排针从上到下第一脚是PA10,第二脚是PA9;最下边usb口作为调试器和ch340(usb转ttl)共用。
2、“printf("HelloWorld\r\n");”走起
      运行固件库中的   04_USART_Printf   例程,前提是在前边修改了LED脚位和cpu时钟选择基础上。
      源程序对usart的定义:
  1. /* eval board low layer COM */
  2. #define COMn                             1U

  3. /* definition for COM1, connected to USART0 */
  4. #define EVAL_COM1                        USART0
  5. #define EVAL_COM1_CLK                    RCU_USART0

  6. #define EVAL_COM1_TX_PIN                 GPIO_PIN_9
  7. #define EVAL_COM1_RX_PIN                 GPIO_PIN_10

  8. #define EVAL_COM_GPIO_PORT               GPIOA
  9. #define EVAL_COM_GPIO_CLK                RCU_GPIOA
  10. #define EVAL_COM_AF                      GPIO_AF_1
复制代码



  1. static rcu_periph_enum COM_CLK[COMn]  = {EVAL_COM1_CLK};

  2. static uint32_t COM_TX_PIN[COMn]      = {EVAL_COM1_TX_PIN};

  3. static uint32_t COM_RX_PIN[COMn]      = {EVAL_COM1_RX_PIN};
复制代码



      串口初始化相关代码:
  1. void gd_eval_com_init(uint32_t com)
  2. {
  3.     uint32_t COM_ID;
  4.    
  5.     if(EVAL_COM1 == com){
  6.         COM_ID = 0U;
  7.     }else{
  8.     }

  9.     /* enable COM GPIO clock */
  10.     rcu_periph_clock_enable(EVAL_COM_GPIO_CLK);  

  11.     /* enable USART clock */
  12.     rcu_periph_clock_enable(COM_CLK[COM_ID]);

  13.     /* connect port to USARTx_Tx */
  14.     gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_TX_PIN[COM_ID]); [/size]
  15. [size=4]
  16.     /* connect port to USARTx_Rx */
  17.     gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_RX_PIN[COM_ID]);

  18.     /* configure USART Tx as alternate function push-pull */
  19.     gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_TX_PIN[COM_ID]);
  20.     gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_TX_PIN[COM_ID]);

  21.     /* configure USART Rx as alternate function push-pull */
  22.     gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_RX_PIN[COM_ID]);
  23.     gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_RX_PIN[COM_ID]);

  24.     /* USART configure */
  25.     usart_deinit(com);
  26.     usart_baudrate_set(com, 115200U);
  27.     usart_receive_config(com, USART_RECEIVE_ENABLE);
  28.     usart_transmit_config(com, USART_TRANSMIT_ENABLE);

  29.     usart_enable(com);
  30. }
复制代码

      编译,一切正常,下载代码到板子上,复位运行(事先用另一个usb转ttl的Rx脚连接PA9,GND相连)

      结果如下:

3、另一个USART呢
      我们知道,colibri板上的cpu有两个usart,并且都已引出,那么下边就来在2的基础上实现两个串口都能正常输出。
      很简单,在原来基础上,再增加一路就可以了。
usart相关定义:
  1. /* eval board low layer COM */
  2. #define COMn                             2U

  3. /* definition for COM0, connected to USART0 */
  4. #define EVAL_COM0                        USART0
  5. #define EVAL_COM0_CLK                    RCU_USART0

  6. #define EVAL_COM0_TX_PIN                 GPIO_PIN_9
  7. #define EVAL_COM0_RX_PIN                 GPIO_PIN_10

  8. #define EVAL_COM0_GPIO_PORT               GPIOA      //
  9. #define EVAL_COM0_GPIO_CLK                RCU_GPIOA  //
  10. #define EVAL_COM0_AF                      GPIO_AF_1

  11. #define EVAL_COM1                        USART1
  12. #define EVAL_COM1_CLK                    RCU_USART1

  13. #define EVAL_COM1_TX_PIN                 GPIO_PIN_2
  14. #define EVAL_COM1_RX_PIN                 GPIO_PIN_3

  15. #define EVAL_COM1_GPIO_PORT               GPIOA      //
  16. #define EVAL_COM1_GPIO_CLK                RCU_GPIOA  //
  17. #define EVAL_COM1_AF                      GPIO_AF_1
复制代码



  1. static rcu_periph_enum COM_CLK[COMn]  = {EVAL_COM0_CLK,EVAL_COM1_CLK};

  2. static uint32_t COM_TX_PIN[COMn]      = {EVAL_COM0_TX_PIN,EVAL_COM1_TX_PIN};

  3. static uint32_t COM_RX_PIN[COMn]      = {EVAL_COM0_RX_PIN,EVAL_COM1_RX_PIN};
复制代码



      串口初始化函数:
  1. void gd_eval_com_init(uint32_t com)
  2. {
  3.     uint32_t COM_ID;
  4.    
  5.     if(EVAL_COM0 == com){
  6.     COM_ID = 0U;

  7.     /* enable COM GPIO clock */
  8.     rcu_periph_clock_enable(EVAL_COM0_GPIO_CLK);

  9.     /* enable USART clock */
  10.     rcu_periph_clock_enable(COM_CLK[COM_ID]);

  11.     /* connect port to USARTx_Tx */
  12.     gpio_af_set(EVAL_COM0_GPIO_PORT, EVAL_COM0_AF, COM_TX_PIN[COM_ID]);

  13.     /* connect port to USARTx_Rx */
  14.     gpio_af_set(EVAL_COM0_GPIO_PORT, EVAL_COM0_AF, COM_RX_PIN[COM_ID]);

  15.     /* configure USART Tx as alternate function push-pull */
  16.     gpio_mode_set(EVAL_COM0_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_TX_PIN[COM_ID]);
  17.     gpio_output_options_set(EVAL_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_TX_PIN[COM_ID]);

  18.     /* configure USART Rx as alternate function push-pull */
  19.     gpio_mode_set(EVAL_COM0_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_RX_PIN[COM_ID]);
  20.     gpio_output_options_set(EVAL_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_RX_PIN[COM_ID]);

  21.     /* USART configure */
  22.     usart_deinit(com);
  23.     usart_baudrate_set(com, 115200U);
  24.     usart_receive_config(com, USART_RECEIVE_ENABLE);
  25.     usart_transmit_config(com, USART_TRANSMIT_ENABLE);

  26.     usart_enable(com);
  27.   }
  28.     else if(EVAL_COM1 == com){
  29.     COM_ID = 1U;

  30.     /* enable COM GPIO clock */
  31.     rcu_periph_clock_enable(EVAL_COM1_GPIO_CLK);

  32.     /* enable USART clock */
  33.     rcu_periph_clock_enable(COM_CLK[COM_ID]);

  34.     /* connect port to USARTx_Tx */
  35.     gpio_af_set(EVAL_COM1_GPIO_PORT, EVAL_COM1_AF, COM_TX_PIN[COM_ID]);

  36.     /* connect port to USARTx_Rx */
  37.     gpio_af_set(EVAL_COM1_GPIO_PORT, EVAL_COM1_AF, COM_RX_PIN[COM_ID]);

  38.     /* configure USART Tx as alternate function push-pull */
  39.     gpio_mode_set(EVAL_COM1_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_TX_PIN[COM_ID]);
  40.     gpio_output_options_set(EVAL_COM1_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_TX_PIN[COM_ID]);

  41.     /* configure USART Rx as alternate function push-pull */
  42.     gpio_mode_set(EVAL_COM1_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_RX_PIN[COM_ID]);
  43.     gpio_output_options_set(EVAL_COM1_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_RX_PIN[COM_ID]);

  44.     /* USART configure */
  45.     usart_deinit(com);
  46.     usart_baudrate_set(com, 115200U);
  47.     usart_receive_config(com, USART_RECEIVE_ENABLE);
  48.     usart_transmit_config(com, USART_TRANSMIT_ENABLE);

  49.     usart_enable(com);
  50.   }
  51. }
复制代码


:代码未作优化。
      初始化的时候只要使用 gd_eval_com_init(EVAL_COM0)或者 gd_eval_com_init(EVAL_COM1)就可以实现USART0和USART1的切换。当然如果是使用printf的话,需要事先将fputc()函数中的相关代码对应到USART0或者USART1。
      这样两个USART就实现了数据的发送。
基于篇幅,下一篇,USART1+DMA(收、发)+各种中断+modbus客户端实现。

此帖出自GD32 MCU论坛
点赞 关注
个人签名水不撩不知深浅 人不拼怎知输赢
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表