• MM32F0020 UART1空闲中断接收


    目录:

    1.MM32F0020简介

    2.初始化MM32F0020 UART1空闲中断和NVIC中断

    3.编写MM32F0020 UART1中断接收和空闲中断函数

    4.编写MM32F0020 UART1发送字节和ASCII字符函数

    5.编写MM32F0020 UART1处理空闲中断接收数据函数

    6.MM32F0020 UART1发送UART1空闲中断接收到的数据到上位机串口助手

    提要:

      学习MM32F0020 UART1空闲中断接收数据,UART1产生空闲中断表示接收完一帧数据,可以通过空闲中断置标志来判断一帧数据接收完成,通过上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1空闲中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手显示出来。

    内容:

    1、MM32F0020简介

    (1)MM32F0020微控制器是基于Arm® Cortex®-M0内核,最高工作频率可达48MHz;

      (2)供电电压支持:2.0V - 5.5V;

      (3)多达32KB的Flash,2KB的SRAM;

      (4)1个I2C;

      (5)2个UART;

      (6)1个12位的共8通道的ADC;

      (7)1个I2C或I2S;

      (8)1个16位高级定时,1个16位通用定时器,1个16位基本定时器;

      (9)1个IWDG和一个WWDG看门狗。

    2.初始化MM32F0020 UART1空闲中断和NVIC中断:

      MM32F0020 UART1的GPIO初始化,根据MM32F0020的DS数据手册选择PA12:UART1_TX,PA3:UART1_RX做为UART1的发送和接收数据的引脚,具体配置步骤,及其初始化如下所示:

    (1)使能GPIOA外设时钟;

    (2)配置IO管脚GPIO_AFx复用为UART1功能;

    (3)配置UARTx IO的管脚;

    (4)配置GPIO的输出速度;

    (5)配置IO管脚的工作模式;

    (6)根据GPIOA配置的参数整体初始化GPIO各管脚的成员参数。

    复制代码
    void Bsp_UART1_GPIO_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); 
        //UART Initial set
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_1);
    
        //UART1_TX   GPIOA.12
        GPIO_StructInit(&GPIO_InitStruct);
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        //UART1_RX    GPIOA.3
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
    复制代码

      MM32F0020 UART1和NVIC中断优先级初始化,并使能UART1空闲中断功能,具体配置步骤,及其初始化如下所示:

    (1)使能UART1外设时钟;

    (2)调用之前配置的UART1GPIO初始化函数;

    (3)调配置UART1通信波特率为115200;

    (4)配置UART1字长为8位;

    (5)配置UART1收发数据为1位停止位;

    (6)配置UART1收发数据为无奇偶校验位;

    (7)配置UART1允许串口收发数据;

    (8)根据以上配置参数初始化UART1结构体成员;

    (9)使能UART1中断接收和UART1空闲中断功能;

    (10)配置UART1的NVIC中断优先级为0,并使能和初始化NVIC中断(优先级为0-3均可,参数越小优先级越高)。

      根据以上配置参数,则UART1初始化代码如下所示:

    复制代码
    void Bsp_UART1_NVIC_Init(u32 baudrate)
    {
        UART_InitTypeDef UART_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;  
        //Enable UART1 Clock
        RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART1, ENABLE);
        //UART1 GPIO Init
        Bsp_UART1_GPIO_Init();
        
        UART_StructInit(&UART_InitStruct);
        UART_InitStruct.BaudRate = baudrate;
        //The word length is in 8-bit data format.
        UART_InitStruct.WordLength = UART_WordLength_8b;
        UART_InitStruct.StopBits = UART_StopBits_1;
        //No even check bit.
        UART_InitStruct.Parity = UART_Parity_No;
        //No hardware data flow control.
        UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
        UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx;   
        UART_Init(UART1, &UART_InitStruct);
        //Enable UART1 RXIEN and RXIDLE
        UART_ITConfig(UART1,UART_IT_RXIEN | UART_IER_RXIDLE, ENABLE);
        
        //UART1 NVIC
        NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
        //UART1 Priority
        NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
        //Enable UART1_IRQn
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;    
        NVIC_Init(& NVIC_InitStruct);   
        
        UART_Cmd(UART1,ENABLE);
    }
    复制代码

    3.编写MM32F0020 UART1中断接收和空闲中断函数:

    (1)定义UART1空闲中断接收和发送数据相关的的缓存,变量以及空闲中断标志,代码如下所示:

    //UART1 Recv Buffer
    u8 gUART1_Rx_Buf[UART1_RXD_LEN];      
    //UART1 Recv Count
    u16 gUART1_Rx_Cnt;  
    //UART1 IDLE Flag
    u8 gUART1_IDLE_Flag = 0;

    (2)头文件声明与UART1空闲中断接收和发送相关的宏,缓存、变量以及函数声明等,如下所示:

    复制代码
    //UART1 Baudrate
    #define UART1_BAUDRATE  (115200)
    //UART1 Recv length
    #define UART1_RXD_LEN   (200) 
    
    //UART1 Recv Buffer
    extern u8 gUART1_Rx_Buf[UART1_RXD_LEN];  
    //UART1 Recv Count
    extern u16 gUART1_Rx_Cnt;  
    //UART1 IDLE Flag
    extern u8 gUART1_IDLE_Flag;
    
    //UART1 NVIC Init
    void Bsp_UART1_NVIC_Init(u32 baudrate);
    //Process UART1 Recv Task
    void Bsp_UART1_Recv_Task(void);
    //UART sends a byte data
    void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data);
    //Send ASCII characters
    void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str);
    //UART sends multi-byte data
    void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len);
    复制代码

    (3)编写UART1中断接收数据和空闲中断函数,如下所示:

    复制代码
    void UART1_IRQHandler(void)
    {
        u8 Recv;
        
         //Check receive status
        if(UART_GetITStatus(UART1, UART_IT_RXIEN) == SET) 
        {                         
            UART_ClearITPendingBit(UART1, UART_IT_RXIEN);
            
            Recv = UART_ReceiveData(UART1);
            
            gUART1_Rx_Buf[gUART1_Rx_Cnt] = Recv;
            
            if(gUART1_Rx_Cnt < UART1_RXD_LEN-1)
            {
                gUART1_Rx_Cnt++;
            }
            else
            {
                gUART1_Rx_Cnt = 0;
            }  
        }
        if(UART_GetITStatus(UART1, UART_IER_RXIDLE) != RESET)
        {
            UART_ClearITPendingBit(UART1,UART_IER_RXIDLE);
            gUART1_IDLE_Flag = 1;
        }     
    }
    复制代码

    4.编写MM32F0020 UART1发送字节和ASCII字符函数:

    (1)MM32F0020 UART1发送字节函数如下所示:

    void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
    {
        UART_SendData(uart,data);
        while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT));
    }

    (2)MM32F0020  UART1发送多字节函数如下所示:

    复制代码
    void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len)
    {
        while(len--)
        {
            Bsp_UART_SendByte(uart,*buf++);
        }
    }
    复制代码

    (3)MM32F0020  UART1发送ASCII字符串函数如下所示:

    复制代码
    void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
    {
        while(*str)
        {
            Bsp_UART_SendByte(uart,*str++);
        }
    }
    复制代码

    5.编写MM32F0020 UART1处理空闲中断接收数据函数

      MM32F0020 UART1处理空闲中断接收到的数据函数如下所示,当上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手。

    复制代码
    void Bsp_UART1_Recv_Task(void)
    {
        //UART1 IDLE Flag
        if(gUART1_IDLE_Flag == 1)
        {
            gUART1_IDLE_Flag = 0;
            
            if((gUART1_Rx_Buf[0] == 0x55) && (gUART1_Rx_Buf[1] == 0x01) && (gUART1_Rx_Buf[2] == 0x02) && (gUART1_Rx_Buf[3] == 0x03) && \
                (gUART1_Rx_Buf[4] == 0x04) && (gUART1_Rx_Buf[5] == 0x05) && (gUART1_Rx_Buf[6] == 0x06) && (gUART1_Rx_Buf[7] == 0x07))
            {
                LED4_TOGGLE();          
                Bsp_UART_SendBytes(UART1,gUART1_Rx_Buf,gUART1_Rx_Cnt);
            }
            gUART1_Rx_Cnt = 0;
            memset(gUART1_Rx_Buf,0,sizeof(gUART1_Rx_Buf));
        }
    }
    复制代码

    6.MM32F0020 UART1发送UART1空闲中断接收到的数据到上位机串口助手

      当上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1空闲中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手。

    (1)在main函数中调用UART1 NVIC空闲中断使能初始化函数;

    (2)在main函数的while(1)主循环中调用UART1处理空闲中断接收到的数据函数,循环检测UART1的空闲中断接收是否接收到上位机串口助手下发的数据,如有收到就原样发送到上位机串口助手上显示出来;

    复制代码
    int main(void)
    {
        //UART1 NVIC Init Baudrate 115200
        Bsp_UART1_NVIC_Init(UART1_BAUDRATE);
        
        while(1) 
        {
            //Process UART1 Recv Task
            Bsp_UART1_Recv_Task();
        }
    }
    复制代码

    (3)上位机串口助手发送8字节16进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,下位机MM32F0020 UART1空闲中断接收到一帧数据后原样把接收到的数据发送到上位机上显示出来,如下图1所示:

                    图1

    总结:

      学习MM32F0020 UART1空闲中断接收数据,UART1产生空闲中断表示接收完一帧数据,可以通过空闲中断置标志来判断一帧数据接收完成,通过上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1空闲中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手显示出来。

    注意事项:

      (1)MM32F0020每个外设都有自己独立的时钟,需使能UART1 发送和接收引脚的GPIO时钟;

      (2)使能UART1外设时钟;

      (3)配置GPIOA的 PA12和PA3复用成UART1功能

      (4)使能UART1接收中断和UART1空闲中断;

      (5)使能UART1 NVIC中断,使能UART1;

      (6)UART2的操作方法与UART1的方法一样,可参考以上UART1把对应的UART1参数改成UART2,使能UART2空闲中断,使能相应外设时钟即可。

     

  • 相关阅读:
    nodejs中对es6语法规范讲解
    干货分享 | MindSpore21天实战营手记(四):基于YOLOV3-DarkNet50的篮球检测模型
    【无标题】
    Django笔记十四之统计总数、最新纪录和空值判断等功能
    大整数加法
    【数字信号去噪】基于matlab硬阈值、软阈值、半软阈值、Maxmin阈值、Garrote阈值小波变换心音去噪【含Matlab源码 2064期】
    云计算中的过度授权:安全隐患与应对策略
    常用的正则表达式30个,整数、浮点数、中文、英文字母、手机号、邮箱、日期、IP等等( JavaScript、Java)
    Redis注解式开发并整合ssm项目以及击穿,穿透和雪崩的介绍及解决方案
    【无标题】
  • 原文地址:https://www.cnblogs.com/armny3264-lcpj/p/16017665.html