四、UART_阻塞发送中断接收

1、开发环境

(1)Keil MDK: V5.38.0.0

(2)MCU: mm320163D7P

2、实验目的&原理图

2.1、实验目的

(1)上位机串口助手给MCU发送信息,MCU串口通过通过串口助手接收后,将接收到的内容通过串口助手发送到上位机。

(2)串口在whil循环中每隔1秒发送一次 hello world.\r\n

2.2、原理图

3、Keil 工程的创建

(1)打开Keil MDK。

(2)点击“Project”→“New μVision Project...”。

(3)选择工程保存地址及工程文件名,然后点击确定。

(4)选择相应的单片机型号,然后点击“OK”即可。

(5)弹出“管理运行时环境”对话框,保持默认,点击OK即可。

3、移植库文件

参考文章  三、LED闪烁-CSDN博客

4、编写代码

4.1、UART相关函数

(1)UART2引脚初始化

补充:

  • 根据个人实际开发经验,串口Rx引脚浮空输入和上拉输入都能接收到数据。
  • 参考网友建议配置为上拉输入。如果配置成浮空时会存在一定收到杂乱数据情况。
  • 参考地址:stm32 串口RX上拉还是浮空_串口 上拉-CSDN博客
/*
 *功能:UART2引脚初始化
 *参数:无
 *返回值:无
 */
static void UART2_GPIO_Init(void)
{
	// 定义一个GPIO结构体,用于配置GPIO参数
    GPIO_InitTypeDef GPIO_InitStruct;
	// 使能GPIOA时钟
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
	
	/*
	 * #define GPIO_AF_0       (0x00U)     ///< Alternative function 0  内部振荡器
	 * #define GPIO_AF_1       (0x01U)     ///< Alternative function 1  UART(通用异步收发器)
     * #define GPIO_AF_2       (0x02U)     ///< Alternative function 2  SPI(串行外设接口)
     * #define GPIO_AF_3       (0x03U)     ///< Alternative function 3  I2C(双向串行总线)
     * #define GPIO_AF_4       (0x04U)     ///< Alternative function 4  ADC(模数转换器)
     * #define GPIO_AF_5       (0x05U)     ///< Alternative function 5  DAC(数模转换器)
     * #define GPIO_AF_6       (0x06U)     ///< Alternative function 6  PWM(脉宽调制)
     * #define GPIO_AF_7       (0x07U)     ///< Alternative function 7  定时器/计数器
	 */
	
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);  // 复用功能
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);  // 复用功能

    //UART2_TX   GPIOA.2
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;    // 推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//UART2_RX    GPIOA.3
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
//	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_FLOATING; // 浮空输入
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;      // 上拉输入,接收引脚配置为该模式也可以
	GPIO_Init(GPIOA, &GPIO_InitStruct);  
}

(2)UART2初始化配置

/*
 *功能:串口2初始化配置
 *参数:波特率
 *返回值:无
 */
void UART2_Init(u32 baudrate)
{
    UART_InitTypeDef UART_InitStruct;  // 定义一个UART结构体,用于配置UART参数 
	NVIC_InitTypeDef NVIC_InitStruct;  // 定义一个中断控制器结构体,用于配置串口中断
	
	RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART2, ENABLE);  // 使能时钟
    UART_StructInit(&UART_InitStruct);                  // 初始化UART结构体
	
    UART_InitStruct.BaudRate = baudrate;                     // 设置波特率
    UART_InitStruct.WordLength = UART_WordLength_8b;         // 8位数据位
    UART_InitStruct.StopBits = UART_StopBits_1;              // 1位停止位
    UART_InitStruct.Parity = UART_Parity_No;                 // 无校验位
    UART_InitStruct.HWFlowControl = UART_HWFlowControl_None; // 不使用硬件流控制
    UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx;      // 设置UART模式为接收和发送  
    UART_Init(UART2, &UART_InitStruct);                      // 根据上述配置初始化UART2
	
	// 对GPIO进行初始化
    UART2_GPIO_Init();   
	
    //UART2 NVIC(中断控制器)
    NVIC_InitStruct.NVIC_IRQChannel = UART2_IRQn;  // 中断通道为UART2
    NVIC_InitStruct.NVIC_IRQChannelPriority = 1;   // 中断优先级为1
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;   // 使能中断通道
    NVIC_Init(&NVIC_InitStruct);                   // 根据上述配置初始化NVIC
	
	UART_ITConfig(UART2, UART_IT_RXIEN, ENABLE);   // 使能串口接收中断
    UART_Cmd(UART2, ENABLE);  // 使能UART2
}

 (3)prinf重定义函数

  • #include "stdio.h"
  • 勾选包含微库

/*
 *功能:重定义fput函数
 *参数:x
 *返回值:x
 */
int fputc(int ch, FILE *f)
{
    UART_SendData(UART2, (uint8_t)ch);

    while (RESET == UART_GetFlagStatus(UART2, UART_FLAG_TXEPT));
//	while((UART2->CSR & UART_IT_TXIEN) == 0);                    // 和上面一句等效

    return (ch);
}

(4)UART2中断接收函数

/*
 *功能:串口2中断函数
 *参数:无
 *返回值:无
 */
void UART2_IRQHandler(void)
{
    uint8_t RxData = 0;
	// 检查指定的串口中断是否发生:接收数据中断
    if (RESET != UART_GetITStatus(UART2, UART_IT_RXIEN))
    {
        RxData = UART_ReceiveData(UART2);              // 接收数据
		printf("%c",RxData);                           // 打印接收到的数据
        UART_ClearITPendingBit(UART2, UART_IT_RXIEN);  // 清空中断挂起标志位	
    }
}

(4)main函数

int main(void)
{
	SysTick_InitDelay();
	UART2_Init(115200);
	
    while (1)
    {
		printf("hello world.\r\n");
		SysTick_DelayMS(1000);	
    }
//	return 0;
}

4.2、总结:串口配置流程

(1)串口GPIO初始化配置

(2)串口结构体初始化配置

(3)串口中断控制配置

(4)使能串口中断

(5)使能串口

4.3、完整工程下载地址

(1)完整工程存储在码云。

(2)MM32: 灵动微电子mm32单片机CSDN对应示例程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制作自己的 Docker 容器

软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户必须保证操作系统的设置&#xff0c;各种库和组件的安装&#xff0c;只有它们都正确&#xff0c;软件才能运行。docker从根本上解决问题&#xff0c;软件安装的时候&#xff0c;把原始环境一模一样地复制过来。 以 koa-…

Python 序列之列表

系列文章目录 Python序列之元组 Python序列之列表 系列文章目录[TOC](Python序列之列表) 前言一、序列是什么&#xff1f;二、列表1.列表简介2.列表创建&#xff08;1&#xff09;[]创建&#xff08;2&#xff09;list创建&#xff08;3&#xff09;range()创建整数列表&#…

VS2010推荐字体设置

fixedsys excelsior是VS2010推荐字体。下载地址为 链接&#xff1a;https://pan.baidu.com/s/16OFbjBEF35zRfQe04Jfuag 提取码&#xff1a;wzjj下载成功后将ttf文件复制粘贴到C盘Windows中的font文件夹中自动安装指定字体&#xff0c;此时就可以在VS2010的工具&#xff0c;选…

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | …

下定决心了,从字节跳动离职

今天在脉脉上看到这么一条内容&#xff1a; 看完感触很深&#xff0c;想起了我在帝都上班的那几年时光。 我记得我去帝都上班的时候&#xff0c;第一次坐帝都的地铁&#xff0c;那时候是找工作面试&#xff0c;在地铁里第一次感受到了大城市的上班速度&#xff0c;每个人都急匆…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码&#xff1a; 4.RS-232 receiver…

Dijkstra(迪杰斯特拉)算法总结

知识概览 Dijkstra算法适用于解决所有边权都是正数的最短路问题。Dijkstra算法分为朴素的Dijkstra算法和堆优化版的Dijkstra算法。朴素的Dijkstra算法时间复杂度为&#xff0c;适用于稠密图。堆优化版的Dijkstra算法时间复杂度为&#xff0c;适用于稀疏图。稠密图的边数m和是一…

tensorboard可视化——No dashboards are active for the current data set.

No dashboards are active for the current data set. 出现问题的原因是事件的路径未用绝对路径&#xff0c;tensorboard --logdir./runs --port6007 改为tensorboard --logdirD:\Code\Python\Study\CL\hat-master\hat-master\run s\one --port6007就好了

浅谈Dubbo核心概念及架构流程

浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言&#xff0c;我们学习Dubbo应该学的是什么&#xff1f; 笔者是一名业务开发&#xff0c;认为一切目的都要为我们的目标服务&#xff0c;即日常工作有帮…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义&#xff0c;这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的&#xff0c;以及如何关联起来的。&#xff08;我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S 2023/12/23 14:14 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件&#xff1a; PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

大一C语言查缺补漏 12.24

遗留问题&#xff1a; 6-1 1 在C语言中&#xff0c;如果要保留小数的话&#xff0c;一定要除以2.0&#xff0c;而不是2。 设整型变量m,n,a,b的值均为1&#xff0c;执行表达式&#xff08;m a>b&#xff09;||(n a<b)后&#xff0c;表达式的值以及变量m和n的值是&#…

redis怎么查看bigkey

通过docker-compose启动一个redis服务器 docker-compose.yml文件的内容如下&#xff1a; version: 3 services:redis:image: redisports:- 6379:6379docker-compose up -d 启动redis容器 在服务器上安装redis-cli工具 这里我是ubuntu服务器&#xff0c;centos用yum代替apt安…

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试&#xff08;非常重要&#xff09; 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计&#xff0c;第一个摆在我们面前的就说四肢的朝向问题&#xff0c;如下图&#xff0c;我们是…

C++类的继承

目录 什么是继承&#xff1f; 父类与子类对象的赋值转换 继承中的作用域问题 子类的默认成员函数问题 如何使一个类不能被继承&#xff1f; 父类的友元和静态成员变量 多重继承与菱形继承 继承和组合 什么是继承&#xff1f; 继承 (inheritance) 机制是面向对象程序设…

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《redi…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过&#xff0c;如果没有&#xff0c;推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》&#xff0c;课程目录如下&#xff1a; Ubuntu22安装Vscode 下载&#xff1a;https://code.visualstudio.com/Download 安装命令&#…