通用同步异步收发器 —-USART
2.1
通用同步异步收发器(USART)是一种全双工串行数据交换接口,支持同步或异步通信。可灵活配置,以便于与多种外部设备进行全双工数据交换。USART 接口发送与接收波特率可配置,也支持通过 DMA 进行连续通信。USART 还支持多处理器通信、LIN 模式、同步模式、单线半双工通信、智能卡异步协议、IrDA SIR ENDEC 功能、以及硬件流控制功能。
2.2 主要特性
支持全双工通信
支持单线半双工通信
波特率可配置,最高波特率可达 3Mbit/s
支持 8bit 或 9bit 数据帧
支持 1bit 或 2bit 停止位
支持硬件生成校验位及校验位检查
支持硬件流控: RTS、CTS
支持 DMA 收发
支持多处理器通信:如果地址不匹配,则进入静默模式, 可通过空闲总线检测或地址标识唤醒
支持同步模式,允许用户在主模式下控制双向同步串行通信
支持智能卡异步协议,符合 ISO7816-3 标准
支持串行红外协议(IrDA SIR)编码与解码,提供正常与低功耗两种运行模式
支持 LIN 模式
支持多钟错误检测:数据溢出错误、帧错误、噪声错误、检验错误
支持多个中断请求:发送数据寄存器为空、CTS 标志、发送完成、数据已接收、数据溢出、总线空闲、
检验错误、LIN 模式断开帧检测、以及多缓冲区通信中的噪声标志/溢出错误/帧错误
2.3 串口中断接收函数配置
void uart_init(unsigned long bound)
{
USART_InitType USART_InitStructure;
GPIO_InitType GPIO_InitStructure;
RCC_ClocksType RCC_ClocksStatus;
NVIC_InitType NVIC_InitStructure;
/* System Clocks Configuration */
/* Enable GPIO clock */
GPIO_APBxClkCmd(USARTx_GPIO_CLK, ENABLE);
/* Enable USART1 Clock */
USART_APBxClkCmd(USARTx_CLK, ENABLE);
/* Initialize GPIO_InitStructure */
GPIO_InitStruct(&GPIO_InitStructure);
/* Configure USART1 Tx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTx_TxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternate = USARTx_Tx_GPIO_AF;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
/* Configure USART1 Rx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTx_RxPin;
GPIO_InitStructure.GPIO_Alternate = USARTx_Rx_GPIO_AF;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
RCC_GetClocksFreqValue(&RCC_ClocksStatus);
/* USART1 and USARTz configuration ------------------------------------*/
USART_InitStructure.BaudRate = bound;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable USARTz Receive and Transmit interrupts */
USART_ConfigInt(USARTx, USART_INT_RXDNE, ENABLE);
// USART_ConfigInt(USARTx, USART_INT_TXDE, ENABLE);
/* Configure USARTx */
USART_Init(USARTx, &USART_InitStructure);
/* Enable the USARTx */
USART_Enable(USARTx, ENABLE);
}
#ifndef __USART_H
#define __USART_H
#include "n32g031.h"
#include <stdarg.h>
#include "stdio.h"
#define _USART1_COM_
#ifdef _USART1_COM_
#define USARTx USART1
#define USARTx_CLK RCC_APB2_PERIPH_USART1
#define USARTx_GPIO GPIOA
#define USARTx_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define USARTx_RxPin GPIO_PIN_10
#define USARTx_TxPin GPIO_PIN_9
#define USARTx_Rx_GPIO_AF GPIO_AF4_USART1
#define USARTx_Tx_GPIO_AF GPIO_AF4_USART1
#define GPIO_APBxClkCmd RCC_EnableAPB2PeriphClk
#define USART_APBxClkCmd RCC_EnableAPB2PeriphClk
void uart_init(unsigned long bound);
void USART1_IRQHandler(void);
#endif
#endif
void USART1_IRQHandler(void)
{
static u8 res;
if (USART_GetIntStatus(USARTx, USART_INT_RXDNE) != RESET)
{
res =USART_ReceiveData(USARTx);
printf("fengji:%d \r\n",res);
}
}
程序编译下载后用串口助手打印出来效果如下