申小林 · 2022年11月21日 · 四川

【GD32F427开发板试用】-02-UART0 串口测试

首先说一下,我这里使用的PA9和PA10两个引脚,但是,需要对板子的硬件做改动,因为在原理图中PA9除了作为串口的输出脚以外,还作为USB供电电源的检测脚,具体的连接如下图,可以在原理图中很轻易的找到,硬件改动需要移除掉三个元件:Q1、E10、C54 如下图:
1.png
最开始我想的是去除两个电容应该就可以了,然后将PD2的控制引脚置高就可以了,但是实际上测试还是不行,索性直接把这三个去掉就可以了。

硬件修改完成之后,就开始编辑代码了,我这里使用了串口的接收中断,接收到的数据原样返回,并且完成闪灯和定时发送的任务,这里就直接上代码了

#include "DRV_UART.h"

#define UART_Clock      RCU_USART0
#define UART_IO_Clock   RCU_GPIOA
#define UART_IO_Port    GPIOA
#define UART_TXD_Pin    GPIO_PIN_9
#define UART_RXD_Pin    GPIO_PIN_10

void UART_Init(void)
{
    rcu_periph_clock_enable( UART_Clock);       //--使能串口时钟
    rcu_periph_clock_enable(UART_IO_Clock);     //--使能IO时钟
    /* connect port to USARTx_Tx */
    gpio_af_set(UART_IO_Port, GPIO_AF_7,UART_TXD_Pin);//--设置TXD管脚复用--
    /* connect port to USARTx_Rx */
    gpio_af_set(UART_IO_Port, GPIO_AF_7, UART_RXD_Pin);//--设置RXD管脚复用--

    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set(UART_IO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP,UART_TXD_Pin);              //--设置发送管脚模式
    gpio_output_options_set(UART_IO_Port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,UART_TXD_Pin);  //--设置发送管脚模式

    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(UART_IO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP,UART_RXD_Pin);             //--设置接收脚模式
    gpio_output_options_set(UART_IO_Port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,UART_RXD_Pin); //--设置接收脚模式

    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0,115200);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);    //--使能接收
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);  //--使能发送
    //--
    usart_enable(USART0);//--使能串口--
    
    nvic_irq_enable(USART0_IRQn, 0, 0);
    usart_interrupt_enable(USART0, USART_INT_RBNE);//--使能接收中断--
    //    usart_interrupt_enable(USART0, USART_INT_TBE); //--使能发送中断--
    //
    //--由于PD2控制三极管,上拉PA9,所以这里先将PD2上拉--排除三极管对PA9的影响--
    rcu_periph_clock_enable(RCU_GPIOD);     //--使能IO时钟
    gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,GPIO_PIN_2);              //--
    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2);  //--设置
    gpio_bit_set(GPIOD, GPIO_PIN_2);
}

unsigned char Data=0;
void USART0_IRQHandler(void)
{
    if((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) &&(RESET != usart_flag_get(USART0, USART_FLAG_RBNE)))
    {
        /* Read one byte from the receive data register */
       Data=usart_data_receive(USART0);
       usart_data_transmit(USART0,Data);
    }
//    if((RESET != usart_flag_get(USART0, USART_FLAG_TBE)) &&(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)))
//    {
//        /* Write one byte to the transmit data register */
//        usart_data_transmit(USART0,0xff);
//    }
}


void UART0_Transmit(unsigned char *Data,unsigned int Lenth)
{
    int i=0;
    for(i=0;i<Lenth;i++)
    {
        usart_data_transmit(USART0,Data[i]);
        while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
    }
}














/*-------------------  end of  the  files  -------------------------*/

主函数代码很简单

int main(void)
{
    unsigned char Data[]={"this is a UART0 Test Demo\r\n" };
    systick_config();
    LED_Init();
    UART_Init();
    while(1) 
    {
        Led_Test();
        UART0_Transmit(Data,sizeof(Data));
    }
}

下面看一下效果图
2.png

好了,这个串口的设置以及分享就到这里。

推荐阅读
关注数
10707
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息