o88ne 发表于 2023-4-30 20:32

STM32串口通信 中断配置

一.关于如何配置通过中断的方式配置串口的收发 ,一共就是这8个步骤1.使能串口时钟、使能GPIO时钟2.引脚复用映射3.GPIO端口模式设置4.串口参数初始化设置5.开启中断初始化NVIC6.使能串口7.编写中断处理函数8.编写收发数据处理函数

o88ne 发表于 2023-4-30 20:33

二.初始化串口函数

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

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

o88ne 发表于 2023-4-30 20:33

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);

o88ne 发表于 2023-4-30 20:33

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);

o88ne 发表于 2023-4-30 20:33

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

o88ne 发表于 2023-4-30 20:34

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);

o88ne 发表于 2023-4-30 20:34

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);       

o88ne 发表于 2023-4-30 20:34

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

o88ne 发表于 2023-4-30 20:34

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

o88ne 发表于 2023-4-30 20:34

三.编写中断处理函数

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 = Res;
                                else      //否则 USARTReceIn 清零重新判断
                                        USARTReceIn = 0;
                                break;               
                        default:
                                //如果Res 接收到数据则把数据传入到数组    USARTReceBuff
                                USARTReceBuff = Res;
                                break;
                }
                //如果接收到的数据传入次数大于等于8次,则表示接收一帧数据,则把中断标志位置一
                if(USARTReceIn >= 8)            
                {
                        USARTReceFullFlag = 1;       
                }
   }
}

o88ne 发表于 2023-4-30 20:35

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

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

o88ne 发表于 2023-4-30 20:35

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

o88ne 发表于 2023-4-30 20:35

/***************************************************************
* 功能: 串口1数据检测函数   USARE1_detection
* 参数: 无
* 返回值: 无
*
****************************************************************/

void USARE1_detection(void)
{
       
        if(USARTReceFullFlag)
        {
                if((USARTReceBuff == 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 == 0x99))
                {
                        GPIO_ResetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8);
                        GPIO_SetBits(GPIOF, GPIO_Pin_9);
                }
                USARTReceFullFlag = 0;      //关闭串口数据标志位
                USARTReceIn = 0;            //串口接收数据变量清零
        }
}

o88ne 发表于 2023-4-30 20:35

好了!!!

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

公羊子丹 发表于 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


可对电路进行一个防护效果
页: [1]
查看完整版本: STM32串口通信 中断配置