今天用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灯的亮灭了。