目录:

1.MM32F0140简介

2.初始化MM32F0140 UART1和NVIC中断

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

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

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

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

提要:

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

内容:

1、MM32F0140简介

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

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

  (3)多达64KB的Flash,8KB的SRAM;

  (4)1个I2C;

  (5)3个UART;

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

  (7)2个I2C或I2S;

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

  (9)1个FlexCAN接口;

  (10)1个IWDG和1个WWDG看门狗。

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

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

(1)使能GPIOA外设时钟;

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

(3)配置UARTx IO的管脚;

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

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

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

static void Bsp_UART1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //Enable GPIOA Clock
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); //PA9:UART1_TX
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct); //PA10:UART1_RX
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}

MM32F0140 UART1和NVIC中断优先级初始化,具体配置步骤,及其初始化如下所示:

(1)使能UART1外设时钟;

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

(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; //Enable UART1 Clock
RCC_APB2PeriphClockCmd(RCC_APB2ENR_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;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct); UART_Cmd(UART1, ENABLE);
}

3.编写MM32F0140 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)中定义,编写MM32F0140 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);
UART_ITConfig(Uart, UART_IT_TXIEN, ENABLE );
}

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

  MM32F0140 UART1中断接收和中断发送函数代码如下所示,当UART1中断发送完数据后需失能中断发送,当UART1中断发送数据时再次使能中断发送即可。

void UART1_IRQHandler(void)
{
u8 Recv; if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET)
{
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)
{
UART1_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.编写MM32F0140 UART1处理中断接收和UART1使能中断发送函数:

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

void Bsp_UART1_Recv_Task(void)
{
if(UART1_Rx_Flag == true)
{
UART1_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_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.MM32F0140 UART1中断发送UART1中断接收到的数据到上位机串口助手:

  当上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的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)
{
//Test UART1 RX TX
Bsp_UART1_Recv_Task();
}
}

                     图1

总结:

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

注意事项:

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

  (2)使能UART1外设时钟;

  (3)配置GPIOA的 PA9和PA10复用成UART1功能

  (4)使能UART1接收中断;

  (5)使能UART1 NVIC中断;

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

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

 

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

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

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

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

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

  3. MM32F0140 UART1空闲中断接收

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

  4. MM32F0020 UART1空闲中断接收

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

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

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

  6. MM32F0020 UART1中断接收

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

  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. 分子动力学模拟之基于自动微分的LINCS约束

    技术背景 在分子动力学模拟的过程中,考虑到运动过程实际上是遵守牛顿第二定律的.而牛顿第二定律告诉我们,粒子的动力学过程仅跟受到的力场有关系,但是在模拟的过程中,有一些参量我们是不希望他们被更新或者改变 ...

  2. 记录常见的问题:encodeURICompnent 解码过程中出现空格 以及 第三方app中使用schema 唤起app

    window.location.href 跳转的时候使用了encodeURIComponent编码了部分参数,但是在第三方app中出现了编码过后的参数换行和空格的情况(部分第三方应用或者java程序) ...

  3. 入门-k8s查看Pods/Nodes (四)

    目标 了解Kubernetes Pods(容器组) 了解Kubernetes Nodes(节点) 排查故障 Kubernetes Pods 在 部署第一个应用程序 中创建 Deployment 后,k ...

  4. UNIX系统上的抓包工具tcpdump常用命令说明

    tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才 ...

  5. 对已有的docker容器增加新的端口映射

    一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [contain ...

  6. Git修改提交历史中的作者及邮箱信息

    一.使用rebase 如图,红圈中提交的用户名及邮箱是需要改的,则需要复制需要改的提交记录的上一个记录hashcode,在本例中就是a0a891a48f92b51201042fccbe61ed1264 ...

  7. requests实现接口测试

    python+requests实现接口测试 - get与post请求基本使用方法 http://www.cnblogs.com/nizhihong/p/6567928.html   Requests ...

  8. mysql,数据类型与表操作

    一.mysql基本认知 创建用户 create host aa identified with mysql_native_password by ''; 修改用户权限 alter user root@ ...

  9. 为什么使用Mybatis对JDBC进行包装探究

    一.原生JDBC在实际生产中使用存在的影响性能的问题 首先分析使用JDBC的代码: Connection connection = null; PreparedStatement preparedSt ...

  10. 来自牛逼哥的阴间MD5(web)

    这个web题目是来自队里面牛逼哥的题目,审计源码, 看到这两个参数,前面的a和b就是直接输出数字,再看下面的,需要弱比较的输出一个c,要求应该是需要一个加密之前是一个0e开头的字符串,加密之后还是0e ...