首先说一下,我这里使用的PA9和PA10两个引脚,但是,需要对板子的硬件做改动,因为在原理图中PA9除了作为串口的输出脚以外,还作为USB供电电源的检测脚,具体的连接如下图,可以在原理图中很轻易的找到,硬件改动需要移除掉三个元件:Q1、E10、C54 如下图:
最开始我想的是去除两个电容应该就可以了,然后将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);
gpio_af_set(UART_IO_Port, GPIO_AF_7,UART_TXD_Pin);
gpio_af_set(UART_IO_Port, GPIO_AF_7, UART_RXD_Pin);
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);
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_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);
rcu_periph_clock_enable(RCU_GPIOD);
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)))
{
Data=usart_data_receive(USART0);
usart_data_transmit(USART0,Data);
}
}
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));
}
}
主函数代码很简单
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));
}
}
下面看一下效果图
好了,这个串口的设置以及分享就到这里。
原作者:兆易创新GD32 MCU 申小林