智能家居-九俊楚子 · 2023年01月03日 · 广东

【GD32F427开发板试用】-01-UART1 串口控制LED灯亮灭

今天用GD32F427R开发板先测试了UART1的通信功能,然后通过UART1的通信功能控制LED灯的亮灭,中间虽然遇到一些问题,还好最后都解决了,主要通信部分代码如下所示:

#include "gd32f4xx.h"
#include "gd32f427r_start.h"
#include "systick.h"
#include <stdio.h>
//#include "uart1c.c"
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
#define UART_Clock      RCU_USART1
#define UART_IO_Clock   RCU_GPIOA
#define UART_IO_Port    GPIOA
#define UART_TXD_Pin    GPIO_PIN_2
#define UART_RXD_Pin    GPIO_PIN_3

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(USART1);
    usart_baudrate_set(USART1,115200);
    usart_receive_config(USART1, USART_RECEIVE_ENABLE);    //--????
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);  //--????
    //--
    usart_enable(USART1);//--????--
    
    nvic_irq_enable(USART1_IRQn, 0, 0);
    usart_interrupt_enable(USART1, USART_INT_RBNE);//--??????--
    //    usart_interrupt_enable(USART0, USART_INT_TBE); //--??????--
    //
    //--??PD2?????,??PA9,??????PD2??--??????PA9???--
//    rcu_periph_clock_enable(RCU_GPIOC);     //--??IO??
//    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,GPIO_PIN_6);              //--
//    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);  //--??
//    gpio_bit_set(GPIOC, GPIO_PIN_6);
}

unsigned char Data=0;
void USART1_IRQHandler(void)
{
    if((RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE)) &&(RESET != usart_flag_get(USART1, USART_FLAG_RBNE)))
    {
        /* Read one byte from the receive data register */
       Data=usart_data_receive(USART1);
       if(Data==0x00)
             {
                 gpio_bit_reset(GPIOC, GPIO_PIN_6);
             }
             else if(Data==0xff)
             {
                  gpio_bit_set(GPIOC, GPIO_PIN_6);
             }
            usart_data_transmit(USART1,Data);
    }

}


void UART1_Transmit(unsigned char *Data,unsigned int Lenth)
{
    int i=0;
    for(i=0;i<Lenth;i++)
    {
        usart_data_transmit(USART1,Data[i]);
        while(RESET == usart_flag_get(USART1, USART_FLAG_TC));
    }
}
void LED_Init(void);
void Led_Test(void);
int main(void)
{
    
      /* configure systick */
    systick_config();

    /* enable the LEDs GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOC);

    /* configure LED1 GPIO port */
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    /* reset LED1 GPIO pin */
    gpio_bit_reset(GPIOC, GPIO_PIN_6);
    UART_Init();
    while(1)
    {

    }

}

程序的主要功能是,通过电脑串口发送0XFF给开发板MCU,点亮LED1,然后通过电脑串口发送0X00给开发板MCU,熄灭LED1,而串口UART1的TX是PA2,UART1的RX是PA3,所以硬件上需要将开发板的PA2和PA3分别接上USB转串口模块的RX和TX,然后程序中需要将PA2和PA3配置成串口通信功能。

因为在这之前开发板通过串口UART1能正常收发数据,所以

串口通信是正常的,后面通过串口通信控制LED1的亮灭先是出现不能正常控制亮灭的问题,然后通过在线仿真设置断点,发现电脑端串口发送0xFF的时候,MCU收到的是0X66,然后仔细想了一下,应该是串口调试助手发送的数据不是以十六进制数发送的,然后在串口助手上勾选以十六进制数发送数据后,就能正常通过串口控制LED灯的亮灭了。

演示视频

https://www.bilibili.com/vide...

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