目录:

1.MM32F0020简介

2.初始化MM32F0020 UART1和NVIC中断

3.编写MM32F0020 UART1使能中断发送函数

4.编写MM32F0020 UART1中断接收和中断发送函数

5.编写MM32F0020 UART1处理中断接收和UART1使能中断发送函数

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

提要:

  学习MM32F0020 UART1中断接收和UART1中断发送数据,通过上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0020的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1中断发送函数,把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并使能UART1,则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 Tx Buffer
u8 gUART1_Tx_Buf[UART1_TXD_LEN] = {0x00};
//UART1 Tx Lenth
u8 gUART1_Tx_Lenth = 0;
//UART1 Tx Count
u8 gUART1_Tx_Real_Cnt = 0;
//UART1 Tx OK Flag
u8 gUART1_Tx_OK_Flag = 0;

(2)根据以上步骤(1)中定义,编写MM32F0020 UART1使能中断发送函数,代码如下所示:

void Bsp_UART1_Interrupt_Send_Data(UART_TypeDef* Uart, u8 *pBuf,u8 data_lenth)
{
gUART1_Tx_Real_Cnt = 0;
gUART1_Tx_Lenth = data_lenth;
memcpy(gUART1_Tx_Buf,pBuf,data_lenth);
//Enable UART Interrupt send
UART_ITConfig(Uart, UART_IT_TXIEN, ENABLE );
}

4.编写MM32F0020 UART1中断接收和中断发送函数:

  MM32F0020 UART1中断接收和中断发送函数代码如下所示,当UART1中断发送完数据后需失能中断发送,当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;
}
}
if(UART_GetITStatus(UART1, UART_IT_TXIEN) != RESET)
{
UART_ClearITPendingBit(UART1, UART_IT_TXIEN); if(gUART1_Tx_Real_Cnt < gUART1_Tx_Lenth)
{
UART_SendData(UART1,(u8)gUART1_Tx_Buf[gUART1_Tx_Real_Cnt]);
gUART1_Tx_Real_Cnt++;
}
else
{
UART_ITConfig(UART1, UART_IT_TXIEN,DISABLE);
gUART1_Tx_OK_Flag = 1;
}
}
}

5.编写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使能中断发送函数,原样发送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))
{
LED4_TOGGLE();
Bsp_UART1_Interrupt_Send_Data(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使能中断发送函数,采用UART1中断发送函数原样发送UART1中断接收到的数据到串口助手显示。

(1)在main函数中调用UART1 NVIC初始化函数;

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

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

                    图1

总结:

  学习MM32F0020 UART1中断接收和UART1中断发送数据,通过上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0020的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1中断发送函数,把UART1中断接收到的数据原样发送到串口助手显示出来。数据发送和接收的数据帧长度用户可根据实际应用自行编写应用逻辑。

注意事项:

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

  (2)使能UART1外设时钟;

  (3)使能UART1接收中断;

  (4)使能UART1 NVIC中断;

  (5)使用UART1中断发送时,需使能UART1中断发送,数据发送完成需失能UART1中断发送,表示一帧数据发送完成,当UART1需再次中断发送数据时使能UART1中断发送即可。

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

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

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

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

  2. MM32F0020 UART1空闲中断接收

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

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

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

  4. MM32F0140 UART1空闲中断接收

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

  5. MM32F0020 UART1中断接收

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

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

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

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

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

  8. ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收

    串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) { OS_ERR err; CPU_INT08U isTheFirstCh; O ...

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

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

随机推荐

  1. SuperPoint: Self-Supervised Interest Point Detection and Description 论文笔记

    Introduction 这篇文章设计了一种自监督网络框架,能够同时提取特征点的位置以及描述子.相比于patch-based方法,本文提出的算法能够在原始图像提取到像素级精度的特征点的位置及其描述子. ...

  2. CSS之常见布局|常用单位|水平垂直居中

    常见布局: 1. 流式布局:百分比布局,宽高.margin.pinding都是百分比 2. 固定布局:盒子的宽高固定,如:margin.padding等 3. 浮动布局:float 4. 弹性布局:f ...

  3. ApacheCN jQuery 译文集 20211121 更新

    创建 jQueryMobile 移动应用 零.序言 一.jQueryMobile 原型制作 二.jQuery Mobile 网站 三.分析.长表单和前端验证 四.QR 码.地理位置.谷歌地图 API ...

  4. ApacheCN 大数据译文集(二) 20211206 更新

    Hadoop3 大数据分析 零.前言 一.Hadoop 简介 二.大数据分析概述 三.MapReduce 大数据处理 四.基于 Python 和 Hadoop 的科学计算和大数据分析 五.基于 R 和 ...

  5. 如何生成Java文档注释(Java Doc Comments)

    在我们的Java SDK中已经提供了javadoc工具来生成我们的文档. 所以我们可以手动调用javadoc工具来生成文档,或者通过IDE生成.当然IDE也是调用javadoc,不过更快更省事. 注释 ...

  6. bom案例2-弹出层

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. 关于setInterval方法中function的定义方法

    使用window对象的setInterval方法,作为第一个参数传递的function必须在全局作用域中定义,否则会出现报错而无法执行. 具体如下: 在下面的代码中,试用jQuery方式在回调函数中使 ...

  8. 关于Java多线程-interrupt()、interrupted()、isInterrupted()解释

    多线程先明白一个术语"中断状态",中断状态为true,线程中断. interrupt():就是通知中止线程的,使"中断状态"为true. isInterrupt ...

  9. atc工具模拟网络

    通过Facebook开源的atc工具,进行模拟不同的网络情况,如图: 目前不支持python3 相关网址: ATC http://facebook.github.io/augmented-traffi ...

  10. 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...