一、编程要点总结
1、初始化USART1相关GPIO
2、初始化USART结构体
3、 配置中断优先级(NVIC)
4、串口使能
5、写中断函数
二、代码分析
1、初始化USART1相关GPIO
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择串口接收引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选择串口发送引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速率 GPIO_Init(GPIOA,&GPIO_InitStructure);
2、初始化USART结构体
USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启串口1时钟 USART_InitStructure.USART_BaudRate = 115200; //设置串口波比特率 USART_InitStructure.USART_StopBits =USART_StopBits_1 ; //停止位 USART_InitStructure.USART_Parity =USART_Parity_No; //校验位 USART_InitStructure.USART_WordLength =USART_WordLength_8b ; //数据位 USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx; //选择串口模式 USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;//配置硬件控制流 USART_Init(USART1, &USART_InitStructure);
3、 配置中断优先级(初始化NVIC结构体)
static void NVIC_Configuration(void) //配置中断向量控制器 { NVIC_InitTypeDef NVIC_InitStructure; // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择中断控制器组 NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn; //选择中断源 NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; //使能中段 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级 NVIC_Init(&NVIC_InitStructure); //初始化结构体将值写入 }
4、串口使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //串口接收使能 USART_Cmd(USART1, ENABLE) //串口使能
5、写中断函数
//串口发送一个字节 串口号 数据 void USARTSend_Byes(USART_TypeDef* USARTx, uint8_t Data) { USART_SendData(USARTx,Data); //发送数据到USARTE while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);//等待数据发送完成 }
三、结构体&库函数
1、USART结构体
typedef struct { uint32_t USART_BaudRate; /*!< 串口波特率 */ uint16_t USART_WordLength; /*!< 数据位*/ uint16_t USART_StopBits; /*!< 停止位 */ uint16_t USART_Parity; /*!<校验位 */ uint16_t USART_Mode; /*!<出口模式*/ uint16_t USART_HardwareFlowControl; /*!< 硬件配置流*/ } USART_InitTypeDef;
2、串口中断使能函数
USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); @brief 指定USART 使能或者使能 @param1:串口号USARTx (1-5) @param2:中断源 @param3:使能或使能
TUSART_IT 值
USART_IT | 描述 |
USART_IT_PE | 奇偶错误中断 |
USART_IT_TXE | 发送中断 |
USART_IT_TC | 传输完成中断 |
USART_IT_RXNE | 接收中断 |
USART_IT_IDLE | 空闲总线中断 |
USART_IT_LBD | LIN 中断检测中断 |
USART_IT_CTS | CTS 中断 |
USART_IT_ERR | 错误中断 |
3、串口使能函数
USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) USART_Cmd(USART1, ENABLE); @brief 串口通讯总使能 @param1:串口号USARTx (1-5) @param2:使能或失能
4、串口数据发送函数
USART_SendData(USART_TypeDef* USARTx, uint8_t Data) USART_SendData(USARTx,Data) @brief 使串口发送数据 @param1:串口号USARTx (1-5) @param2:要发送的数据 (一个字节 字符型)
5、检测USART数据是否发送完成
USART_GetFlagStatus(USART_TypeDef* USARTx, u16 USART_FLAG) USART_GetFlagStatus(USARTx,USART_FLAG_TXE) (TXE发送寄存器空标志位) @brief 检查USART 相应标志位状态 @param1:串口号USARTx (1-5) @param2:要检测的相应寄存器(位)
四、程序总源码
usart.c文件
#include "usart.h" static void NVIC_Configuration(void) //配置中断向量控制器 { NVIC_InitTypeDef NVIC_InitStructure; // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择中断控制器组 NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn; //选择中断源 NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; //使能中段 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级 NVIC_Init(&NVIC_InitStructure); //初始化结构体将值写入 } void USART_config(void) //串口初始化配置函数 { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体 USART_InitTypeDef USART_InitStructure; //定义GPIO初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择串口接收引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选择串口发送引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速率 GPIO_Init(GPIOA,&GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启串口1时钟 USART_InitStructure.USART_BaudRate = 115200; //设置串口波比特率 USART_InitStructure.USART_StopBits =USART_StopBits_1 ; //停止位 USART_InitStructure.USART_Parity =USART_Parity_No; //校验位 USART_InitStructure.USART_WordLength =USART_WordLength_8b ; //数据位 USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx; //选择串口模式 USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;//配置硬件控制流 USART_Init(USART1, &USART_InitStructure); NVIC_Configuration(); //调用中断控制函数 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //串口接收使能 USART_Cmd(USART1, ENABLE); //串口使能 } //串口发送函数 串口号 数据 void USARTSend_Byes(USART_TypeDef* USARTx, uint8_t Data) { USART_SendData(USARTx,Data) //发送数据到USARTE while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET); //等待数据发送完成 //(TXE发送寄存器空标志位) }
usart.h文件
#ifndef __USART_H #define __USART_H #include "stm32f10x.h" void USART_config(void); void USARTSend_Byes(USART_TypeDef* USARTx, uint8_t Data); #endif
main.c
#include "stm32f10x.h" #include "bsp_led.h" #include "usart.h" int main(void) { USART_config(); //串口初始化配置函数 USARTSend_Byes(USART1,100); //串口发送函数 while(1); }