当前位置: 首页 > news >正文

25.1.3 UART串口通信

1.FSMP1A开发板进行串口通信实验:

功能:电脑输入LED_ON点亮扩展版LED灯,输入LED_OFF熄灭扩展版LED灯

代码实现:

uart4.c

#include "uart4.h"
//串口初始化
void uart4_init(){//使能UART4外设时钟RCC->MP_APB1ENSETR |=(0X1<<16);//使能GPIOB/GPIOG外设时钟RCC->MP_AHB4ENSETR |=(0X1<<1);RCC->MP_AHB4ENSETR |=(0X1<<6);//设置PB2/PG11复用为UART4功能//PB2GPIOB->MODER &=(~(0X3<<4));//先清零GPIOB->MODER |=(0X2<<4);//设置成复用模式GPIOB->AFRL &=(~(0XF<<8));//先清零GPIOB->AFRL |=(0X8<<8);//设置成UART4-RX模式//PG11GPIOG->MODER &=(~(0X3<<22));//先清零GPIOG->MODER |=(0X2<<22);//设置成复用模式GPIOG->AFRH &=(~(0xF<<12));//先清零GPIOG->AFRH |=(0X6<<12);//设置成UART4-TX模式//禁用串口UE=0,因为其他相关设置是在UE=0情况下设置的USART4->CR1 &=(~(0X1<<0));//设置8bit数据位USART4->CR1 &=(~(0X1<<12));USART4->CR1 &=(~(0X1<<28));//设置没有校验位USART4->CR1 &=(~(0X1<<10));//设置不分频USART4->PRESC &=(~(0XF<<0));//设置16倍过采样USART4->CR1 &=(~(0X1<<15));//设置1bit停止位USART4->CR2 &=(~(0X3<<12));//设置115200波特率USART4->BRR=0X22B;//使能发送器USART4->CR1 |=(0X1<<3);//使能接收器USART4->CR1 |=(0X1<<2);//使能串口USART4->CR1 |=0X1;
}//封装单个字符发送函数
void putchar(char ch){//判断发送数据寄存器是否为空,不为空则等待while(!(USART4->ISR&(0X1<<7)));//为空,向发送数据寄存器写入数据USART4->TDR=ch;//等待发送完成while(!(USART4->ISR&(0x1<<6)));
}//单个字符的接收
char getchar(){//判断接收数据寄存器是否有数据//没有数据则等待while(!(USART4->ISR&(0X1<<5)));//有数据就将数据读取返回放置内存中变量return USART4->RDR;
}//封装字符串的输入
void gets(char *s)
{//循环调用单个字符接收//等待读取到回车键\r,字符串接收while(1){*s=getchar();if((*s)=='\r'){break;}putchar(*s);//让输入的字符串回显到电脑串口工具s++;}*s='\0';putchar('\n');putchar('\r');
}//字符串输出
void puts(char *s)
{//循环调用单个字符的发送//直到遇到\0结束while(*s){putchar(*s);s++;}putchar('\0');//最后末尾发送一个换行一个回车putchar('\n');putchar('\r');
}//自定义strcmp函数
int my_strcmp(const char *des,const char *src){while(*des==*src){if(*des=='\0'||*src=='\0'){break;}des++;src++;}return *des-*src;
}

uart.h

#ifndef __UART4__H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
void uart4_init();
void putchar(char ch);
char getchar();
void gets(char *s);
void puts(char *s);
int my_strcmp(const char *des,const char *src);#endif

led.c

#include "led.h"
//初始化LED1-3所对应的GPIO引脚以及使能
void led_init(){//GPIO初始化//将RCC_MP_AHB4ENSETR寄存器第[5:4]位设置为1,使能GPIOE和F外设时钟RCC->MP_AHB4ENSETR |=(0X3<<4);//1.GPIOE_MODER[21:20]设置为01,PE10管教为输出模式GPIOE->MODER &=(~(0x3<<20));//先清零GPIOE->MODER |=(0x1<<20); //再置位//1.GPIOF_MODER[21:20]设置为01,PF10管教为输出模式GPIOF->MODER &=(~(0x3<<20));//先清零GPIOF->MODER |=(0x1<<20); //再置位//1.GPIOE_MODER[17:16]设置为01,PE8管教为输出模式GPIOE->MODER &=(~(0x3<<16));//先清零GPIOE->MODER |=(0x1<<16); //再置位//2.GPIOE_OTYPER[10]设置为0,PE10管脚推挽输出GPIOE->OTYPER &=(~(0x1<<10));//先清零//2.GPIOF_OTYPER[10]设置为0,PF10管脚推挽输出GPIOF->OTYPER &=(~(0x1<<10));//先清零//2.GPIOE_OTYPER[8]设置为0,PE8管脚推挽输出GPIOE->OTYPER &=(~(0x1<<8));//先清零//3.GPIOE_OSPEEDR[21:20]设置为00,PE10管脚为低速输出GPIOE->OSPEEDR &=(~(0x3<<20));//先清零//3.GPIOF_OSPEEDR[21:20]设置为00,PF10管脚为低速输出GPIOF->OSPEEDR &=(~(0x3<<20));//先清零//3.GPIOE_OSPEEDR[17:16]设置为00,PE8管脚为低速输出GPIOE->OSPEEDR &=(~(0x3<<16));//先清零//4.GPIOE_PUPDR[21:20]设置为00,PE10管脚无上拉下拉电阻GPIOE->PUPDR &=(~(0x3<<20));//先清零//4.GPIOF_PUPDR[21:20]设置为00,PF10管脚无上拉下拉电阻GPIOF->PUPDR &=(~(0x3<<20));//先清零//4.GPIOE_PUPDR[17:16]设置为00,PE8管脚无上拉下拉电阻GPIOE->PUPDR &=(~(0x3<<16));//先清零}
//对引脚和哪盏灯控制,参数1:确定哪盏灯,参数2:确定开灯为1,关灯为0
void led_ctl(int which,int cmd){switch(which){case 1:if(cmd==0)//关灯GPIOE->ODR &=(~(0x1<<10));else if(cmd==1)//开灯GPIOE->ODR |=(0x1<<10); break;case 2:if(cmd==0)//关灯GPIOF->ODR &=(~(0x1<<10));else if(cmd==1)//开灯GPIOF->ODR |=(0x1<<10); break;case 3:if(cmd==0)//关灯GPIOE->ODR &=(~(0x1<<8));else if(cmd==1)//开灯GPIOE->ODR |=(0x1<<8); break;}
}

led.h

#ifndef __LED__
#define __LED__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
/* typedef struct{ */
/*     unsigned int MODER; */
/*     unsigned int OTYPER; */
/*     unsigned int OSPEEDR; */
/*     unsigned int PUPDR; */
/*     unsigned int IDR; */
/*     unsigned int ODR; */
/*     unsigned int BSRR; */
/* }gpio_t; */
/*  */
/* #define GPIOE (*(gpio_t*)0x50006000) */
/* #define GPIOF (*(gpio_t*)0x50007000) */
/* #define RCC (*(unsigned int*)0x50000A28) */void led_init();void led_ctl(int which,int cmd);#endif

main.c

#include "uart4.h"
#include "led.h"int main()
{uart4_init();//uart4串口初始化led_init();//led1-3初始化/* char ch; *//* //电脑端发送数据,接收数据 *//* while(1){ *//* 	//读取电脑发送的字符 *//* 	ch=getchar(); *//* 	//将字符+1后返回给电脑 *//* 	putchar(ch+1); *//* 	putchar('\n');//换行 *//* 	putchar('\r');//回车 *//* 	 *//* } */char buf[128];//定义一个字符数组while(1){gets(buf);puts(buf);if(my_strcmp(buf,"LED1_ON")==0){led_ctl(1,1);}if(my_strcmp(buf,"LED1_OFF")==0){led_ctl(1,0);	}if(my_strcmp(buf,"LED2_ON")==0){led_ctl(2,1);}if(my_strcmp(buf,"LED2_OFF")==0){led_ctl(2,0);	}if(my_strcmp(buf,"LED3_ON")==0){led_ctl(3,1);}if(my_strcmp(buf,"LED3_OFF")==0){led_ctl(3,0);	}}return 0;
}

2.stm32U5开发板进行串口通信实验:

功能:电脑输入LED_ON点亮扩展版LED灯,输入LED_OFF熄灭扩展版LED灯

 main.c

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* Configure the System Power */SystemPower_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ICACHE_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */char buf[32];//保存串口数据收发的容器while (1){memset(buf,0,sizeof(buf));//进行数组清空HAL_UART_Receive(&huart1,(uint8_t *)buf,30,10000); //阻塞接收 if(strcmp(buf,"LED1_ON")==0){//打开led1HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);}if(strcmp(buf,"LED3_ON")==0){//打开led3HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);}if(strcmp(buf,"LED_CYTLE_ON")==0){//循环打开HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);HAL_Delay(1000);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);HAL_Delay(1000);}if(strcmp(buf,"LED1_OFF")==0){//关闭led1HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);}if(strcmp(buf,"LED3_OFF")==0){//关闭led3HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);}if(strcmp(buf,"LED_CYTLE_OFF")==0){//关闭循环HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);}if(strcmp(buf,"FAN_ON")==0){//打开风扇HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);}if(strcmp(buf,"FAN_OFF")==0){//关闭风扇HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);}if(strcmp(buf,"FENGMING_ON")==0){//打开蜂鸣器HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);}if(strcmp(buf,"FENGMING_OFF")==0){//关闭蜂鸣器HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);}HAL_UART_Transmit(&huart1,(uint8_t *)buf,sizeof(buf),5);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

相关文章:

25.1.3 UART串口通信

1.FSMP1A开发板进行串口通信实验&#xff1a; 功能&#xff1a;电脑输入LED_ON点亮扩展版LED灯&#xff0c;输入LED_OFF熄灭扩展版LED灯 代码实现&#xff1a; uart4.c #include "uart4.h" //串口初始化 void uart4_init(){//使能UART4外设时钟RCC->MP_APB1ENSE…...

如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构

前言 将从如何使用脚手架工具开始&#xff0c;快速搭建一个 Express 项目的基础架构。接着&#xff0c;文章将详细讲解 Express 中间件的概念、分类以及如何有效地使用中间件来增强应用的功能和性能。最后&#xff0c;我们将讨论如何制定合理的接口规范&#xff0c;以确保 API …...

防止密码爆破debian系统

防止密码爆破 可以通过 fail2ban 工具来实现当 SSH 登录密码错误 3 次后&#xff0c;禁止该 IP 5 分钟内重新登录。以下是具体步骤&#xff1a; 注意此脚本针对ssh是22端口的有效 wget https://s.pscc.js.cn:8888/baopo/fbp.sh chmod x fbp.sh ./fbp.sh注意此脚本针对ssh是6…...

高阶知识库搭建实战六、(向量数据库Faiss安装)(练习推荐)

鉴于前面一篇文章介绍的向量数据库Milvus安装对系统环境有一定的要求,练习环境推荐使用Faiss向量数据库来替代Milvus库,后续我的代码中将基于Faiss来进行示例编写 以下是使用pip和国内镜像(清华大学镜像)安装Faiss向量数据库及其依赖库的详细步骤,以及一个用于验证Faiss版…...

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…...

代码随想录算法训练营第七十天 | 拓扑排序精讲,Dijkstra(朴素版)精讲,Dijkstra(堆优化版)精讲

拓扑排序精讲 题目讲解&#xff1a;代码随想录 重点&#xff1a; 1. 思路&#xff1a; 1. Dijkstra&#xff08;朴素版&#xff09;精讲 题目讲解&#xff1a;代码随想录 重点&#xff1a; 1. 思路&#xff1a; 1. Dijkstra&#xff08;堆优化版&#xff09;精讲 题目讲解&…...

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接&#xff0c;至于代码美不美观&#xff0c;写的好不好&#xff0c;统统不考虑&#xff0c;我只能说&#xff0c;能跑就不错了&#xff0c;上学压根没学过python好吧&#xff0c;基本上是crtlc&ctrlv丝滑小…...

Excel 打印时-预览界面内容显示不全

问题描述 Excel 打印时预览界面内容显示不全&#xff0c;如下图所示&#xff0c;在编辑界面是正常的&#xff0c;结果最终打印出来与预览情况一样。 编辑界面 预览界面 解决办法 此时我的字体是宋体&#xff0c;将字体改为等线&#xff0c;问题得到解决。 打印预览界面...

nginx-限流(请求/并发量)

一. 简述&#xff1a; 在做日常的web运维工作中&#xff0c;难免会遇到服务器流量异常&#xff0c;负载过大等情况。恶意攻击访问/爬虫等非正常性请求&#xff0c;会带来带宽的浪费&#xff0c;服务器压力增大&#xff0c;影响业务质量。 二. 限流方案&#xff1a; 对于这种情…...

Vue——使用html2pdf插件,下载pdf文档到本地

1.安装 html2pdf官网地址 npm install html2pdf.js pnpm add html2pdf.js2.引入 import html2pdf from html2pdf.js3.我的项目是使用的原生avascript&#xff0c;table tr td画表格然后通过html2pdf插件下载pdf。 问题&#xff1a;下载pdf时内容被截断&#xff0c;如下图所示…...

每日一题:BM1 反转链表

文章目录 [toc]问题描述数据范围示例 C代码实现使用栈实现&#xff08;不符合要求&#xff0c;仅作为思路&#xff09; 解题思路 - 原地反转链表步骤 C语言代码实现 以前只用过C刷过代码题目&#xff0c;现在试着用C语言刷下 问题描述 给定一个单链表的头结点 pHead&#xff…...

CSS 实现字体颜色渐变

在 CSS 中&#xff0c;可以通过 background-clip 和 text-fill-color 等属性来实现字体颜色渐变。以下是实现字体颜色渐变的基本步骤和示例代码&#xff1a; 示例代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8" /&…...

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒&#xff1b; 3. 宏病毒可以感染后缀为.xls的文件&#xff1b;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…...

JS数组转字符串(3种方法)

JavaScript 允许数组与字符串之间相互转换。其中 Array 方法对象定义了 3 个方法&#xff0c;可以把数组转换为字符串&#xff0c;如表所示。 Array 对象的数组与字符串相互转换方法 数组方法 说明 toString() 将数组转换成一个字符串 toLocalString() 把数组转换成本地约定的…...

云计算安全需求分析与安全防护工程

23.1 概念与威胁分析 1&#xff09;概念 在传统计算环境下&#xff0c;用户构建一个新的应用系统&#xff0c;需要做大量繁杂的工作&#xff0c;如采购硬件设备、安装软件包、编写软件&#xff0c;同时计算资源与业务发展难以灵活匹配&#xff0c;信息系统项目建设周期长。随…...

C/C++的printf会调用malloc()

排查内存问题&#xff08;或相关的疑难杂症&#xff09;时&#xff0c;可能一句printf就能让bug出现&#xff0c;或者赶走bug。你可能觉得很神奇&#xff0c;但这并不神奇。 至少我们可以在 Linux-x64 下&#xff0c;通过 malloc hook&#xff0c;来验证当前的编译环境下&…...

spring mvc源码学习笔记之五

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...

3272 小蓝的漆房

将devc设置支持编译就能用新的遍历方式 for(auto &x : s)//遍历容器s&#xff0c;变量为x /* 多循环的嵌套&#xff1a; 计数是否需要重置为0; 是否因为ans定义成全局变量导致ans在比较多时候会出现错误*/ /* 1.对于一个标准色&#xff0c;对目标数组遍历&#xff0c; 如…...

MySQL使用触发器进行备份

触发器脚本备份 实现方案&#xff1a; 1.配置mysql调用外部脚本的插件mysqludf 链接&#xff1a;https://pan.baidu.com/s/1MCrf1u_SRWwcZoxM9JDNiw 提取码&#xff1a;kgt0 解压 2.解压后放进&#xff1a; mysql安装路径/lib/plugin/ 3.在mysql执行命令创建自定义函数&…...

数据结构与算法-顺序表

数据结构 顺序表 基本概念 顺序表&#xff1a;顺序存储的线性表链式表&#xff1a;链式存储的线性表&#xff0c;简称链表 顺序存储就是将数据存储到一片连续的内存中&#xff0c;在C语言环境下&#xff0c;可以是具名的栈数组&#xff0c;也可以是匿名的堆数组。 存储方式…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...