串口设置的一般步骤可以总结为如下几个步骤:
串口时钟使能,GPIO 时钟使能
串口是挂载在 APB2 下面的外设,所以使能函数为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
串口复位
当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置
这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外
设的操作。复位的是在函数 USART_DeInit()中完成:
void USART_DeInit(USART_TypeDef* USARTx);//串口复位
GPIO 端口模式设置
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
串口参数初始化
USART_InitStructure.USART_BaudRate = bound; //波特率设置;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl
= USART_HardwareFlowControl_None; //无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
使能串口
编写中断处理函数
实现代码如下:
#include "Uart.h"
int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
{
USART1->DR=ch;
while((USART1->SR & 0x40) == 0);
return ch;
}
/*串口初始化*/
void UART1_Init(u32 bound)
{
GPIO_InitTypeDef gpioO;
USART_InitTypeDef usartT;
NVIC_InitTypeDef nvicN;
//时钟外设设置 GPIOA USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
//GPIO A9 TX A10 RX
gpioO.GPIO_Pin = GPIO_Pin_9;
gpioO.GPIO_Mode = GPIO_Mode_AF_PP; //推挽 复用
gpioO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpioO);
gpioO.GPIO_Pin = GPIO_Pin_10;
gpioO.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空 输入
GPIO_Init(GPIOA,&gpioO);
usartT.USART_BaudRate = bound; //波特率
usartT.USART_WordLength = USART_WordLength_8b; //((uint16_t)0x0000)
usartT.USART_StopBits = USART_StopBits_1; //1 停止位
usartT.USART_Parity = USART_Parity_No; //奇偶校验
usartT.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流
usartT.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 RX ((uint16_t)0x0004) tx ((uint16_t)0x0008)
USART_Init(USART1,&usartT);
USART_Cmd(USART1,ENABLE); //使能串口1
USART_ClearFlag(USART1,USART_FLAG_TC); //清除标志位
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启相关中断
//NVIC配置
nvicN.NVIC_IRQChannel = USART1_IRQn; //中断
nvicN.NVIC_IRQChannelCmd = ENABLE;
nvicN.NVIC_IRQChannelPreemptionPriority = 1;
nvicN.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&nvicN);
}
void USART1_IRQHandler()
{
u8 res = '2';
if(USART_GetITStatus(USART1,USART_IT_RXNE ) != RESET) //接收中断
{
res = USART_ReceiveData(USART1); //接收数据 (USART1->DR)
USART_SendData(USART1,res); //发送数据
//printf("rn已收到rn");
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
串口设置的一般步骤可以总结为如下几个步骤:
串口时钟使能,GPIO 时钟使能
串口是挂载在 APB2 下面的外设,所以使能函数为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
串口复位
当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置
这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外
设的操作。复位的是在函数 USART_DeInit()中完成:
void USART_DeInit(USART_TypeDef* USARTx);//串口复位
GPIO 端口模式设置
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
串口参数初始化
USART_InitStructure.USART_BaudRate = bound; //波特率设置;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl
= USART_HardwareFlowControl_None; //无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
使能串口
编写中断处理函数
实现代码如下:
#include "Uart.h"
int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
{
USART1->DR=ch;
while((USART1->SR & 0x40) == 0);
return ch;
}
/*串口初始化*/
void UART1_Init(u32 bound)
{
GPIO_InitTypeDef gpioO;
USART_InitTypeDef usartT;
NVIC_InitTypeDef nvicN;
//时钟外设设置 GPIOA USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
//GPIO A9 TX A10 RX
gpioO.GPIO_Pin = GPIO_Pin_9;
gpioO.GPIO_Mode = GPIO_Mode_AF_PP; //推挽 复用
gpioO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpioO);
gpioO.GPIO_Pin = GPIO_Pin_10;
gpioO.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空 输入
GPIO_Init(GPIOA,&gpioO);
usartT.USART_BaudRate = bound; //波特率
usartT.USART_WordLength = USART_WordLength_8b; //((uint16_t)0x0000)
usartT.USART_StopBits = USART_StopBits_1; //1 停止位
usartT.USART_Parity = USART_Parity_No; //奇偶校验
usartT.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流
usartT.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 RX ((uint16_t)0x0004) tx ((uint16_t)0x0008)
USART_Init(USART1,&usartT);
USART_Cmd(USART1,ENABLE); //使能串口1
USART_ClearFlag(USART1,USART_FLAG_TC); //清除标志位
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启相关中断
//NVIC配置
nvicN.NVIC_IRQChannel = USART1_IRQn; //中断
nvicN.NVIC_IRQChannelCmd = ENABLE;
nvicN.NVIC_IRQChannelPreemptionPriority = 1;
nvicN.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&nvicN);
}
void USART1_IRQHandler()
{
u8 res = '2';
if(USART_GetITStatus(USART1,USART_IT_RXNE ) != RESET) //接收中断
{
res = USART_ReceiveData(USART1); //接收数据 (USART1->DR)
USART_SendData(USART1,res); //发送数据
//printf("rn已收到rn");
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
举报