STM32串口通信 中断配置

您所在的位置:网站首页 stm32配置步骤 STM32串口通信 中断配置

STM32串口通信 中断配置

2023-09-06 08:13| 来源: 网络整理| 查看: 265

一.关于如何配置通过中断的方式配置串口的收发 ,一共就是这8个步骤

1.使能串口时钟、使能GPIO时钟

2.引脚复用映射

3.GPIO端口模式设置

4.串口参数初始化设置

5.开启中断初始化NVIC

6.使能串口

7.编写中断处理函数

8.编写收发数据处理函数

二.初始化串口函数

1.使能串口时钟、使能GPIO时钟

//使能GPIOA RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能串口1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

2.引脚复用映射

//GPIOA_Pin_9 映射串口1 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); //GPIOA_Pin_10 映射串口2 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

3.GPIO端口模式设置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIOA初始化¯ GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO初始化里的结构体变量需要在最上面申明定义、包括串口1的结构体变量、串口1中断的结构体变量

4.串口参数初始化设置

USART1_InitStructure.USART_BaudRate = 115200; //波特率 //没有硬件流设置 USART1_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART1_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //输入\输出 USART1_InitStructure.USART_Parity = USART_Parity_No; //没有奇偶校验位 USART1_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位为1 USART1_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8个位 //USART1初始化 USART_Init(USART1, &USART1_InitStructure); //使能串口1 USART_Cmd(USART1, ENABLE);

5.开启中断初始化NVIC

IT_USART1_InitStructrue.NVIC_IRQChannel = USART1_IRQn; //中断串口1通道 IT_USART1_InitStructrue.NVIC_IRQChannelCmd = ENABLE; //使能中断串口1通道 IT_USART1_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为1 IT_USART1_InitStructrue.NVIC_IRQChannelSubPriority = 1; //响应优先级为1 //串口中断初始化 NVIC_Init(&IT_USART1_InitStructrue);

6.使能串口

//使能串口1中断服务函数 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

那么配置中断串口1的初始化函数就到这里。

三.编写中断处理函数

1.编写先对应的中断处理函数,这里用的是串口一,所以对应的也就是中断服务函数一

void USART1_IRQHandler(void) { //如果有数据触发中断1 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //清除中断标志位 USART_ClearITPendingBit(USART1,USART_IT_RXNE); //将串口中断接收的数据读出来,赋值为Res Res =USART_ReceiveData(USART1); USART_SendData(USART1, Res); switch(USARTReceIn) { case 0: if(Res) //如果Res 接收到数据,则把数据传入到数组 USARTReceBuff USARTReceBuff[USARTReceIn++] = Res; else //否则 USARTReceIn 清零重新判断 USARTReceIn = 0; break; default: //如果Res 接收到数据则把数据传入到数组 USARTReceBuff USARTReceBuff[USARTReceIn++] = Res; break; } //如果接收到的数据传入次数大于等于8次,则表示接收一帧数据,则把中断标志位置一 if(USARTReceIn >= 8) { USARTReceFullFlag = 1; } } }

2.编写收发数据处理函数

        这里的检测函数是面向一帧数据来判断的,当串口接收到一帧8位的数据之后会存入数组,而这个检测函数就是判断数据再做出需要的动作的

       eg:当串口接收数据标志位置一,则表示串口已经接收到了一帧8位的数据,那么就打开串口数据标志位,之后就是判断数组中数据的第一位数据是否是0x88,这些都是可以自定义的,可以加一些包头、包尾、校验和之内的判断条件,从而判断接收到的数据是否是你所需要的数据,如果不是则清空标志位、不做出任何动作,继续等待下一帧的数据来进行判断

/*************************************************************** * 功 能: 串口1数据检测函数 USARE1_detection * 参 数: 无 * 返回值: 无 * ****************************************************************/ void USARE1_detection(void) { if(USARTReceFullFlag) { if((USARTReceBuff[0] == 0x88)) { GPIO_ResetBits(GPIOF, GPIO_Pin_10); GPIO_ResetBits(GPIOF, GPIO_Pin_9); GPIO_SetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8); }else if((USARTReceBuff[0] == 0x99)) { GPIO_ResetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8); GPIO_SetBits(GPIOF, GPIO_Pin_9); } USARTReceFullFlag = 0; //关闭串口数据标志位 USARTReceIn = 0; //串口接收数据变量清零 } }

好了!!!

一个简单的串口接收函数就这样配置好了



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3