四、UART_阻塞发送中断接收

news2024/9/28 23:36:12

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对应示例程序

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么使用jupter notebook并配置环境变量

有的时候需要使用Jupyter Notebook运行代码&#xff0c;Jupyter Notebook的主要特点&#xff1a; ① 编程时具有语法高亮、缩进、tab补全的功能。 ② 可直接通过浏览器运行代码&#xff0c;同时在代码块下方展示运行结果。 ③ 以富媒体格式展示计算结果。富媒体格式包括&…

社会人士可以考英语四六级吗?怎么考四六级

目录 一、社会人士能考英语四六级吗二、社会人士可以参加哪些英语等级考试第一.考个商务英语类证书第二.社会上比较认可的还有翻译证书第三.出国常用的英语凭证第四.职称英语.第五.PETS. 大学英语四六级是为提高我国大学英语课程的教学质量服务。那么社会人士能不能报考英语四六…

【UML】第12篇 序列图(1/2)——基本概念和构成

目录 一、什么是序列图&#xff08;Sequence Diagram&#xff09; 1.1 定义 1.2 主要用途 1.3 序列图和BPMN的区别和联系 二、序列图的构成 2.1 对象 2.2 生命线 2.3 消息 2.4 激活 序列图&#xff0c;是我个人认为的用处最多的一种图。产品和研发的同学&#xff0c;都…

java实现深度优先搜索 (DFS) 算法

度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;算法是一种用于遍历或搜索图或树的算法。这种算法从一个节点开始&#xff0c;沿着一条路径尽可能深地搜索&#xff0c;直到遇到不能继续前进的节点时返回上一个节点&#xff0c;然后继续搜索其他路径。具体…

网络通信协议

WebSocket通信 WebSocket是一种基于TCP的网络通信协议&#xff0c;提供了浏览器和服务器之间的全双工通信&#xff08;full-duplex&#xff09;能力。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff…

算法通关村-番外篇排序算法

大家好我是苏麟 , 今天带来番外篇 . 冒泡排序 BubbleSort 最基本的排序算法&#xff0c;最常用的排序算法 . 我们以关键字序列{26,53,48,11,13,48,32,15}看一下排序过程: 动画演示 : 代码如下 : (基础版) class Solution {public int[] sortArray(int[] nums) {for(int i …

ArkUI - 状态管理

目录 一、State装饰器 二、自定义组件 三、Prop和Link、Provide和Consume 四、Observed和ObjectLink 五、页面路由 跳转模式 实例模式 使用步骤 一、State装饰器 这里涉及到两个概念 状态 和 视图 状态&#xff08;State&#xff09;&#xff1a;指驱动视图更新的数…

【附三菱 MX OPC Server 6.04的安装包】MX-OPC下载以及用GX Works2和组态王进行仿真连接

使用MX-OPC来完成三菱和组态王的仿真连接。 文章目录 目录 文章目录 软件下载 1.OPC设置 2.GX Works 2 设置 3.GX Works 2 和OPC 连接测试 4.和组态王进行仿真连接 5.安装OPC后&#xff0c;GX Works2 无法打开 提示堆栈不足 6.收尾&#xff08;组态王变量的删除&#xff0…

如何使用java来实现windows系统关机

可以使用Java代码来调用操作系统的命令行来实现Windows关机操作。具体步骤如下&#xff1a; import java.io.IOException;public class ShutdownWindows {public static void main(String[] args) {try {// 调用命令行执行关机命令Process process Runtime.getRuntime().exec…

Python - 深夜数据结构与算法之 Graph

目录 一.引言 二.图的简介 1.Graph 图 2.Undirected graph 无向图 3.Directed Graph 有向图 4.DFS / BFS 遍历 三.经典算法实战 1.Num-Islands [200] 2.Land-Perimeter [463] 3.Largest-Island [827] 四.总结 一.引言 Graph 无论是应用还是算法题目在日常生活中比较…

股市中的Santa Claus Rally (圣诞节行情)

圣诞节行情 Santa Claus Rally Santa Claus Rally 是指 12 月 25 日圣诞节前后股市的持续上涨这样一个现象。《股票交易员年鉴》的创始人 Yale Hirsch 于 1972 年创造了这个定义&#xff0c;他将当年最后五个交易日和次年前两个交易日的时间范围定义为反弹日期。 根据 CFRA Re…

OpenAI科学家Hyung Won Chung演讲精华版

文章目录 第一个观点&#xff1a;涌现第二个观点&#xff1a;如何扩大规模1、标记化2、嵌入3、计算4、评估&#xff08;损失函数&#xff09;5、反向传播 最近从Google跳槽到OpenAI的AI科学家 Hyung Won Chung 比较拗口&#xff0c;我就简称尚哥了 他最近做了一个技术演讲 …

GPU性能实时监测的实用工具

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…

Unity-Shader-渲染队列

Unity-Shader-渲染队列 渲染简介Unity中的几种渲染队列Background (1000)最早被渲染的物体的队列。Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染&#xff0c;也就是Unity Shader中默认的渲染队列。AlphaTest (2450) 有透明通道&#xff0c;需要进…

Python画皮卡丘

代码&#xff1a; import turtledef getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensize(3)t.speed(9)t.ondrag(getPosition)def noTrace_goto(self, x, y):self.t.penup()self.t.goto(…

Python - 深夜数据结构与算法之 Heap Binary Heap

目录 一.引言 二.堆与二叉堆介绍 1.Heap 堆 2.Binary Heap 二叉堆 3.HeapifyUp 添加节点 4.HeapifyDown 删除节点 5.Heap 时间复杂度 6.Insert & Delete 代码实现 三.经典算法实战 1.Smallest-K [M14] 2.Sliding-Window-Max [239] 3.Ugly-Number [264] 4.Top-…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作&#xff08;大数据处理&#xff09;主要是.split和re.findall和glob.glob运用。 读取文件的路径&#xff08;为了获得文件内容&#xff09;和提取文件路径中感兴趣的东西(标签) 1&#xff0c;“glob.glob”用于读取文件路径 2&#xff0c;“.…

靠谱免费的MAC苹果电脑杀毒软件CleanMyMac X2024

您是否曾经为Mac电脑的性能下降、存储空间不足而烦恼&#xff1f;是否希望有一个简单而高效的解决方案来优化您的Mac系统&#xff1f;那么&#xff0c;我向您介绍一款非常出色的工具&#xff1a;CleanMyMac X。它能够轻松处理这些问题&#xff0c;并让您的Mac恢复到最佳状态。 …

新版IDEA中Git的使用(三)

说明&#xff1a;前面介绍了在新版IDEA中Git的基本操作、分支操作&#xff0c;本文介绍一下在新版IDEA中&#xff0c;如何回滚代码&#xff1b; 分以下三个阶段来介绍&#xff1a; 未Commit的文件&#xff1b; 已经Commit&#xff0c;但未Push的文件&#xff1b; 已经Push的…