四、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.2GPIO_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.3GPIO_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;  // 中断通道为UART2NVIC_InitStruct.NVIC_IRQChannelPriority = 1;   // 中断优先级为1NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;   // 使能中断通道NVIC_Init(&NVIC_InitStruct);                   // 根据上述配置初始化NVICUART_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.mzph.cn/news/241900.shtml

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

相关文章

Java中如何优雅地根治null值引起的Bug问题

1. Java对象为null会引发的问题 NullPointerException&#xff1a;当你尝试调用或访问一个null对象的属性或方法时&#xff0c;Java会抛出NullPointerException异常。例如&#xff0c;如果你有一个名为person的变量&#xff0c;它被设置为null&#xff0c;然后你尝试调用perso…

【大语言模型】Transformer原理以及运行机制

目录 参考资料 Transformer 是一种序列到序列&#xff08;Sequence-to-Sequence&#xff09;的模型&#xff0c;用于处理自然语言处理任务。它是由谷歌公司提出的一种基于注意力机制的神经网络模型&#xff0c;被广泛应用于机器翻译、问答系统、文本摘要、对话生成等任务。 T…

蓝桥杯2020年5月青少组Python程序设计国赛真题

1、 上边是一个算法流程图,最后输出的b的值是() A.377 B.987 C.1597 D.2584 2、 3、如果整个整数X本身是完全平方数,同时它的每一位数字也都是完全平方数我们就称X 是完美平方数。前几个完美平方数是0、1、4、9、49、100、144......即第1个完美平方数是0,第2个是 1,第3个…

Hadoop入门学习笔记——一、VMware准备Linux虚拟机

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 一、VMware准备Linux虚拟机1.1. VMware安装Linux虚拟机1.…

连续执行函数和alert与focus死循环事件

1.innerText value的值会根据输入的改变而改变DOM树&#xff0c;但是innerHTML和innerText有一种效果就是赋值的时候是标签下所有替代了&#xff0c;但是取值的时候还是html文件下&#xff0c;标签下的所有。如果赋值就是标签子都被这个代替。内部变量就是这个&#xff0c;没赋…

WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理 那么 本文 我们来具体说说它能做的其他事 我们先将基础代码改成这样 import ./style.css import * as THREE from "three"; //引入lil-gui import { GUI } fro…

安装Kubernetes1.23、kubesphere3.4、若依项目自动打包部署到K8S记录

1.安装kubernetes1.23详细教程 kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎 2.安装rancher动态存储 kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml3.安装kubesphere3.4 准备工作 您…

UE和Android互相调用

ue和android互调 这两种方式都是在UE打包的Android工程之上进行的。 一、首先是UE打包Android&#xff0c;勾选下面这项 如果有多个场景需要添加场景 工程文件在这个路径下 然后可以通过Android Studio打开&#xff0c;选择gradle打开 先运行一下&#xff0c;看看是否可以发布…

360勒索病毒:了解最新变种.360,以及如何保护您的数据

导言&#xff1a; 随着科技的飞速发展&#xff0c;网络安全威胁也在不断演变&#xff0c;.360 勒索病毒成为近期备受关注的一种恶意软件。本文91数据恢复将介绍如何恢复被.360 勒索病毒加密的数据文件&#xff0c;并提供一些建议&#xff0c;帮助你预防这种威胁。 如果您在面对…

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 基本定时器知识 这节开始学习一下TIM定时器功能&#xff0c;从字面意思上理解&#xff0c;定时器的基本功能就是用来定时&#xff0c;与定时器相结合&#xff0c;可以实现一些周期性的数据发送、采集等功能&#…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比&#xff0c;这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是&#xff0c;DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

阿里云公有云平台

1. 请简要介绍一下公有云平台的基本概念和特点。 公有云是一种云计算模型&#xff0c;其中服务器、网络和存储资源等IT基础架构以虚拟资源的形式提供&#xff0c;并且可以通过互联网进行访问。这些资源是由第三方提供商共享并提供给用户的&#xff0c;包括计算、存储、网络等。…

并发和并行的区别

并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;是计算机领域中两个重要的概念&#xff0c;它们描述了任务执行的不同方式。以下是它们的区别&#xff1a; 并发&#xff1a;并发是指多个任务在同一时间段内交替执行。虽然这些任务可能同时存…

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】&#xff1a;小杨的幸运数 【问题描述】 小杨认为&#xff0c;所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运数。自然地&#xff0c;小杨的所有超级幸运数也都是幸运数。 对于一个…

MongoDB安装部署

二、安装部署 2.1 下载 下载地址&#xff1a;MongoDB Enterprise Server Download | MongoDB 当前最新版本6.0.9&#xff0c;5.0.9对Mac m1需要centos 8.2版本。选择docker安装。 2.2 docker-ce安装 # 安装docker # 默认repo源没有docker-ce安装包&#xff0c;需要新的rep…

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

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

Spring框架@RequestMapping完整指南

Spring Boot 提供了一组新的 REST 请求注释&#xff0c;可以简化构建 RESTful Web 服务的过程。 在Spring 4.3之前&#xff0c;我们使用RequestMapping注解来实现RESTful的URL映射&#xff1a; RequestMapping(value "/hello", method RequestMethod.GET) public…

ObjectMapper的常用方法 (对象和JSON数据之间的转换)

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> <!-- 请根据实际情况选择合适的版本 --> </dependency> ObjectMapper类是Ja…

免费更新UltraNews v2.8.0 已注册 – Laravel报纸,博客多语言系统,支持AI作家,内容生成器脚本

UltraNews v2.8.0 已注册 – Laravel报纸&#xff0c;博客多语言系统&#xff0c;支持AI作家&#xff0c;内容生成器脚本 一、概述 在网络内容创作与管理领域&#xff0c;UltraNews v2.8.0以其高度现代化和多功能性而独树一帜。这是一个基于Laravel框架构建的报纸、博客多语言…

实习课知识整理4:点击某个商品如何跳转到并展示出商品详情页

项目情景&#xff1a;当我们点击某个商品时&#xff0c;我们需要查看商品的具体的信息并进行购买的操作 简单理解以下就是&#xff0c;当我们点击一个url链接时&#xff0c;该链接需要携带一个参数到后端&#xff0c;一般设为商品的Id&#xff0c;然后后端通过Id从数据库中查找…