[其他ST产品] STM32串口通信 中断配置

[复制链接]
1580|17
 楼主| o88ne 发表于 2023-4-30 20:32 | 显示全部楼层 |阅读模式

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

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

2.引脚复用映射

3.GPIO端口模式设置

4.串口参数初始化设置

5.开启中断初始化NVIC

6.使能串口

7.编写中断处理函数

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


评论

———————————————— 版权声明:本文为CSDN博主「x97666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/x97666/article/details/121392583  发表于 2023-4-30 20:35
 楼主| o88ne 发表于 2023-4-30 20:33 | 显示全部楼层
二.初始化串口函数

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

  1.     //使能GPIOA
  2.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  3.         //使能串口1
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 楼主| o88ne 发表于 2023-4-30 20:33 | 显示全部楼层
2.引脚复用映射
  1.     //GPIOA_Pin_9  映射串口1
  2.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  3.         //GPIOA_Pin_10 映射串口2
  4.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
 楼主| o88ne 发表于 2023-4-30 20:33 | 显示全部楼层
3.GPIO端口模式设置
  1.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     //复用
  2.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //推挽
  3.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;;
  4.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;     //上拉
  5.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;       
  6.         //GPIOA初始化¯
  7.         GPIO_Init(GPIOA, &GPIO_InitStructure);  
 楼主| o88ne 发表于 2023-4-30 20:33 | 显示全部楼层
GPIO初始化里的结构体变量需要在最上面申明定义、包括串口1的结构体变量、串口1中断的结构体变量
37985644e60344e296.png
 楼主| o88ne 发表于 2023-4-30 20:34 | 显示全部楼层
4.串口参数初始化设置
  1.     USART1_InitStructure.USART_BaudRate = 115200;                  //波特率
  2.     //没有硬件流设置
  3.         USART1_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  4.         USART1_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //输入\输出
  5.         USART1_InitStructure.USART_Parity = USART_Parity_No;             //没有奇偶校验位
  6.         USART1_InitStructure.USART_StopBits = USART_StopBits_1;          //设置停止位为1
  7.         USART1_InitStructure.USART_WordLength = USART_WordLength_8b;     //字长8个位
  8.         //USART1初始化
  9.         USART_Init(USART1, &USART1_InitStructure);

  10.     //使能串口1
  11.         USART_Cmd(USART1, ENABLE);
 楼主| o88ne 发表于 2023-4-30 20:34 | 显示全部楼层
5.开启中断初始化NVIC
  1.        
  2.         IT_USART1_InitStructrue.NVIC_IRQChannel = USART1_IRQn;      //中断串口1通道
  3.         IT_USART1_InitStructrue.NVIC_IRQChannelCmd = ENABLE;        //使能中断串口1通道
  4.         IT_USART1_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1;  //抢占优先级为1
  5.         IT_USART1_InitStructrue.NVIC_IRQChannelSubPriority = 1;         //响应优先级为1
  6.        
  7.         //串口中断初始化
  8.         NVIC_Init(&IT_USART1_InitStructrue);       
 楼主| o88ne 发表于 2023-4-30 20:34 | 显示全部楼层
6.使能串口
  1.     //使能串口1中断服务函数
  2.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 楼主| o88ne 发表于 2023-4-30 20:34 | 显示全部楼层
那么配置中断串口1的初始化函数就到这里。
 楼主| o88ne 发表于 2023-4-30 20:34 | 显示全部楼层
三.编写中断处理函数

1.编写先对应的中断处理函数,这里用的是串口一,所以对应的也就是中断服务函数一
  1. void USART1_IRQHandler(void)
  2. {
  3.        
  4.         //如果有数据触发中断1
  5.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  6.         {
  7.                 //清除中断标志位
  8.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);  
  9.                 //将串口中断接收的数据读出来,赋值为Res
  10.                 Res =USART_ReceiveData(USART1);       
  11.                 USART_SendData(USART1, Res);
  12.                 switch(USARTReceIn)
  13.                 {
  14.                         case 0:
  15.                                 if(Res)   //如果Res 接收到数据,则把数据传入到数组  USARTReceBuff
  16.                                         USARTReceBuff[USARTReceIn++] = Res;
  17.                                 else      //否则 USARTReceIn 清零重新判断
  18.                                         USARTReceIn = 0;
  19.                                 break;               
  20.                         default:
  21.                                 //如果Res 接收到数据则把数据传入到数组    USARTReceBuff
  22.                                 USARTReceBuff[USARTReceIn++] = Res;
  23.                                 break;
  24.                 }
  25.                 //如果接收到的数据传入次数大于等于8次,则表示接收一帧数据,则把中断标志位置一
  26.                 if(USARTReceIn >= 8)            
  27.                 {
  28.                         USARTReceFullFlag = 1;         
  29.                 }
  30.      }
  31. }
 楼主| o88ne 发表于 2023-4-30 20:35 | 显示全部楼层
2.编写收发数据处理函数

        这里的检测函数是面向一帧数据来判断的,当串口接收到一帧8位的数据之后会存入数组,而这个检测函数就是判断数据再做出需要的动作的
 楼主| o88ne 发表于 2023-4-30 20:35 | 显示全部楼层
  eg:当串口接收数据标志位置一,则表示串口已经接收到了一帧8位的数据,那么就打开串口数据标志位,之后就是判断数组中数据的第一位数据是否是0x88,这些都是可以自定义的,可以加一些包头、包尾、校验和之内的判断条件,从而判断接收到的数据是否是你所需要的数据,如果不是则清空标志位、不做出任何动作,继续等待下一帧的数据来进行判断
 楼主| o88ne 发表于 2023-4-30 20:35 | 显示全部楼层
  1. /***************************************************************
  2. * 功  能: 串口1数据检测函数     USARE1_detection
  3. * 参  数: 无
  4. * 返回值: 无
  5. *
  6. ****************************************************************/

  7. void USARE1_detection(void)
  8. {
  9.        
  10.         if(USARTReceFullFlag)
  11.         {
  12.                 if((USARTReceBuff[0] == 0x88))
  13.                 {
  14.                         GPIO_ResetBits(GPIOF, GPIO_Pin_10);
  15.                         GPIO_ResetBits(GPIOF, GPIO_Pin_9);               
  16.                         GPIO_SetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8);
  17.                 }else if((USARTReceBuff[0] == 0x99))
  18.                 {
  19.                         GPIO_ResetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8);
  20.                         GPIO_SetBits(GPIOF, GPIO_Pin_9);
  21.                 }
  22.                 USARTReceFullFlag = 0;      //关闭串口数据标志位
  23.                 USARTReceIn = 0;            //串口接收数据变量清零
  24.         }
  25. }
 楼主| o88ne 发表于 2023-4-30 20:35 | 显示全部楼层
好了!!!

一个简单的串口接收函数就这样配置好了
15428644e60a314cea.png
公羊子丹 发表于 2024-3-15 07:25 | 显示全部楼层

但是,由于变压器存在漏感,
万图 发表于 2024-3-15 08:28 | 显示全部楼层

在此情况下我们通常会用电阻串联在电路中
Uriah 发表于 2024-3-15 09:31 | 显示全部楼层

缩合型灌封硅胶由于固化过程有体积收缩一般不使用在模块电源的灌封中
帛灿灿 发表于 2024-3-15 11:27 | 显示全部楼层

设备中的ESD静电阻抗器一般都不易老化损坏
Bblythe 发表于 2024-3-15 12:30 | 显示全部楼层

通过将各类分立元器件进行整合和封装,模块电源能够实现以最小的体积来实现功率密度更高的效果。
周半梅 发表于 2024-3-15 14:26 | 显示全部楼层

可对电路进行一个防护效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

426

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部