配置串口的中断接收(标准库)基于STM32F103VET6单片机
注:如有错误欢迎批评改正。
1.串口初始化
我用的是片上外设UART4(因为USART1-3已经有别的用途)
首先定义一个UART(通用异步收发传输器)初始化函数,在函数中定义一个GPIO初始化结构体和一个USART初始化结构体。分别用于定义UART4引脚的输入输出模式和UART4的工作参数。
void UART4_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
// 打开串口外设的时钟
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
// 将USART Tx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
// 将USART Rx的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
// 配置串口的工作参数
// 配置波特率
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
// 配置 针数据字长
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// 配置停止位
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(DEBUG_USARTx, &USART_InitStructure);
// 串口中断优先级配置
NVIC_Configuration();
// 使能串口接收中断
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
// USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
// 使能串口
USART_Cmd(DEBUG_USARTx, ENABLE);
// 清除发送完成标志
USART_ClearFlag(UART4, USART_FLAG_TC);
}
2.中断初始化
然后定义一个NVIC(嵌套向量中断控制器)初始化函数,在函数中定义一个NVIC初始化结构体。用于配置中断源,优先级等参数。这些都可以在misc.h里看到,根据需要选择就好(如果英文不太好可以下载一个有道词典,划词翻译很方便,我就是英文不好)。
void NVIC_Configuration(void){
NVIC_InitTypeDef NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置USART为中断源 */NVIC_InitStructure.NVIC_IRQChannel
= DEBUG_USART_IRQ;/* 抢断优先级*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
= 1;/* 子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority
= 1;/* 使能中断 */NVIC_InitStructure.NVIC_IRQChannelCmd
= ENABLE;/* 初始化配置NVIC */NVIC_Init(
&NVIC_InitStructure);}
3.注意事项
这里主要就是说几个我遇到的问题,第一个就是要在串口初始化函数中使能串口接收中断,第二个就是程序要有一个死循环(这样程序才能一直运行从而有机会触发中断),还有就是在stm32f10x_it.h中写一个中断服务函数(只要触发中断就会调用这个函数,在选择中断源的时候可以选择中断触发条件,我这里选择的是接收寄存器非空中断,意思就是只要数据寄存器接收到数据就会触发中断)
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
UART4_Config();
/* 发送一个字符串 */
Usart_SendString( DEBUG_USARTx,"串口发送实验成功
");
//注释掉的是没使用中断时候的接收函数
// while(1)
// {
// UART4_DATA=UART4_RECEIVE();
// Usart_SendByte(DEBUG_USARTx,UART4_DATA);
// }
while(1)
{}
// 串口(UART4)中断服务函数void DEBUG_USART_IRQHandler(void)
{
uint8_t UART4_Temp;
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
UART4_Temp = USART_ReceiveData(DEBUG_USARTx);
USART_SendData(DEBUG_USARTx,UART4_Temp);
}
}
(函数名要在头文件中声明//.h文件)
以上是 配置串口的中断接收(标准库)基于STM32F103VET6单片机 的全部内容, 来源链接: utcz.com/z/520190.html