首先说一下,我这里使用的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); //--使能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));
}
}
下面看一下效果图
好了,这个串口的设置以及分享就到这里。