目录:

1.MM32F0020简介

2.初始化MM32F0020 UART1和NVIC中断

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

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

5.编写MM32F0020 UART1处理中断接收到的数据函数

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

提要:

  学习MM32F0020 UART1中断接收数据,通过上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0020的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共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位的ADC;

  (7)1个I2C或I2S;

  (8)1个高级定时,1个通用定时器,1个基本定时器。

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

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

(1)使能GPIOA外设时钟;

(2)配置IO的管脚;

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

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

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

void Bsp_UART1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
//UART initialset
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中断优先级初始化,具体配置步骤,及其初始化如下所示:

(1)使能UART1外设时钟;

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

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

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

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

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

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

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

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

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

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

void Bsp_UART1_NVIC_Init(u32 baudrate)
{
UART_InitTypeDef UART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART1, ENABLE); 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); UART_ITConfig( UART1,UART_IT_RXIEN, 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 Recv Timing Count
u8 gUART1_Rx_TimeCnt = 0;
//UART1 Recv Flag
bool gUART1_Rx_Flag = false;

(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 Recv Timing Count
extern u8 gUART1_Rx_TimeCnt;
//UART1 Recv Flag
extern bool gUART1_Rx_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(gUART1_Rx_Cnt >= 8)
{
gUART1_Rx_Flag = true;
}
}
}

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字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0020的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手。

void Bsp_UART1_Recv_Task(void)
{
//UART1 Rx Flag
if(gUART1_Rx_Flag == true)
{
gUART1_Rx_Flag = false; if((gUART1_Rx_Buf[0] == 0xAA) && (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] == 0x55))
{
        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字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0020的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共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进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55,下位机MM32F0020 UART1中断接收到一帧数据后原样把接收到的数据发送到上位机上显示出来,如下图1所示:

                图1

总结:

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

注意事项:

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

  (2)使能UART1外设时钟;

  (3)使能UART1接收中断;

  (4)使能UART1 NVIC中断;

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

MM32F0020 UART1中断接收的更多相关文章

  1. MM32F0020 UART1中断接收和UART1中断发送

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1使能中断发送函数 4.编写MM32F0020 UART1中断接收和中断 ...

  2. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  3. MM32F0020 UART1空闲中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1空闲中断和NVIC中断 3.编写MM32F0020 UART1中断接收和空闲中断函数 4.编写MM32F0020 UART1 ...

  4. MM32F0020 UART1硬件自动波特率的使用

    目录: 1.MM32F0020简介 2.UART自动波特率校准应用场景 3.MM32F0020 UART自动波特率校准原理简介 4.MM32F0020 UART1 NVIC硬件自动波特率配置以及初始化 ...

  5. MM32F0140 UART1空闲中断接收

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1空闲中断和NVIC中断 3.编写MM32F0140 UART1中断接收和空闲中断函数 4.编写MM32F0140 UART1 ...

  6. 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

    灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...

  7. MM32F0140 UART1 DMA RX and TX 中断接收和发送数据

    目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...

  8. 基于STM8的UART发送和中断接收---STM8-第二章

    1. 综述 UART的基础知识,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器. 做软件开发的人都 ...

  9. STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

    Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...

随机推荐

  1. numpy常用函数记录

    np.square() 函数返回一个新数组,该数组的元素值为源数组元素的平方. 源阵列保持不变. 示例: import numpy as np a = np.array([[1, 2, 3], [4, ...

  2. Component、PureComponent源码解析

    1.什么是Component,PureComponent? 都是class方式定义的基类,两者没有什么大的区别,只是PureComponent内部使用shouldComponentUpdate(nex ...

  3. CF1229D - Wojtek and Card Tricks

    做法一 首先将排列用康托展开映射到整数,并且预处理出排列之间乘法的结果,复杂度 \(\mathcal{O}(k(k!) ^ 2)\). 枚举左端点,有可能分段的右端点至多只有 \(k!\) 个,不妨将 ...

  4. Content-Type: multipart/form-data;文件上传利用

    当我们找到一个文件上传接口时,发现他的MIME类型检测为Content-Type: multipart/form-data;时,我们就可以尝试下面几种方法来绕过限制. ---------------- ...

  5. 使用代码绑定 DataGridView 控件用于程序界面显示表格

    需求 软件界面需要使用表格,对数据进行显示.交互,这是一个非常通用的需求. 实现方法 DataGridView介绍 参考 https://docs.microsoft.com/en-us/dotnet ...

  6. Linux编译安装升级bash5.1

    线上服务器有次做漏洞扫描时,被扫描出有bash漏洞.平时还是比较少遇到有bash的漏洞,好在编译升级比较简单. 测试环境系统:CentOS.Ubuntu 一.下载官网最新bash版本 bash官网下载 ...

  7. PHP7.x环境下安装redis扩展

    注:以下介绍的安装方式为PHP的安装路径为/usr/local/php,如果你的服务器上PHP的安装目录不一致请按实际情况处理. 首先下载PHP7的redis扩展 wget https://githu ...

  8. Android蓝牙扫码连接时,防止Activity重启

    集成了一个蓝牙的扫码枪,发现每次连接时,应用的当前Activity会销毁再次创建.调试了下, 没有监听到任何的事件,非常困惑.搜了一阵了解到是Android的一个机制. 某些设备配置可能会在运行时发生 ...

  9. Python中类的两种用法

    第一种用法是使用类生成实例对象.类作为实例对象的模版,每个实例创建后,都将拥有类的所有属性和方法. 第二种用法是用类将多个函数(方法)打包封装在一起,让类中的方法相互配合.

  10. Java基础问题

    基础问题 谈谈你对面向对象的理解 -- 结合场景 为何要使用对象编程? 可重复利用,方便拓展 面向对象有三大特征:封装.继承和多态 封装:为什么要封装?可以使类的成员(数据和行为)有选择性的暴露,这里 ...