ARM_day6:串口通信

1.实现字符串数据收发函数的封装

头文件:

#ifndef __UART4_H__
#define __UART4_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"void uart4_config();
void putchar(char dat);
char getchar();
void puts(char *s);
void gets(char *s);void led_init();
void LED1_CTRL(int flag);
void LED2_CTRL(int flag);
void LED3_CTRL(int flag);int Strcmp(const char *dest,const char *src);#endif

源文件:

#include "uart4.h"void uart4_config()
{//使能GPIOB\GPIOG\UART4的外设时钟RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0x1<<6);RCC->MP_APB1ENSETR |= (0x1<<16);//设置PG11和PB2为管脚复用功能//PG11GPIOG->MODER &= (~(0x3<<22));GPIOG->MODER |= (0x2<<22);//PB2GPIOG->MODER &= (~(0x3<<4));GPIOG->MODER |= (0x2<<4);//设置PG11为UART4_TX功能GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//设置PB2为UART4_RX功能GPIOB->AFRL &= (~(0xf<<8));GPIOB->AFRL |= (0x8<<8);//设置串口不使能USART4->CR1 &= (~0x1);//设置8位数据位USART4->CR1 &= (~(0x1<<12));USART4->CR1 &= (~(0x1<<28));//设置没有校验位USART4->CR1 &= (~(0x1<<10));//设置时钟频率不分频USART4->PRESC &= (~0xf);//设置16倍采样USART4->CR1 &= (~(0x1<<15));//设置1位停止位USART4->CR2 &= (~(0x3<<12));//设置波特率为115200USART4->BRR = 0x22b;//使能发送器USART4->CR1 |= (0x1<<3);//使能接收器USART4->CR1 |= (0x1<<2);//使能串口USART4->CR1 |= 0x1;
}//发送单个字符
void putchar(char dat)
{//当发送寄存器中有数据时就一直阻塞while(!(USART4->ISR & (0x1<<7)));//反之没有数据则发送数据USART4->TDR = dat;//当发送的数据完成后结束发送while(!(USART4->ISR & (0x1<<6)));
}//接收单个字符
char getchar()
{//当接收寄存器中没有数据时就一直阻塞while(!(USART4->ISR & (0x1<<5)));//有数据就返回return USART4->RDR;}//发送字符串
void puts(char *s)
{while(1){if(*s=='\0'){break;}putchar(*s);s++;}//发送一个回车putchar('\n');putchar('\r');}//接收字符串
void gets(char *s)
{while(1){//循环接收单个字符*s = getchar();//当检测到回车键‘\r’被按下,结束if(*s == '\r'){break;}putchar(*s);s++;}//在接收的字符串最后补上一个'\0'*s = '\0';//发送一个'\n'表示在串口工具下一行进行显示putchar('\n');
}int Strcmp(const char *dest,const char *src)
{int i=0;while(*(dest+i) == *(src+i)){if(*(dest+i)=='\0'){break;}i++;}if(*(dest+i) - *(src+i) > 0){return *(dest+i) - *(src+i);}else if(*(dest+i) - *(src+i) < 0){return *(dest+i) - *(src+i);}else if(*(dest+i) - *(src+i) == 0){return 0;}
}
#include "uart4.h"
void led_init()
{//使能外设时钟RCC->MP_AHB4ENSETR |= (0x3<<4);RCC->MP_APB2ENSETR |= 0x1;//设置PE10为输出GPIOE->MODER &= (~(0x3<<20));GPIOE->MODER |= (0x1<<20);//设置PF10为输出GPIOF->MODER &= (~(0x3<<20));GPIOF->MODER |= (0x1<<20);//设置PE8为输出GPIOE->MODER &= (~(0x3<<16));GPIOE->MODER |= (0x1<<16);//设置PE9为输出GPIOE->MODER &= (~(0x3<<18));GPIOE->MODER |= (0x1<<18);//设置PE10为推挽输出GPIOE->OTYPER &= (~(0x1<<10));//设置PF10为推挽输出GPIOF->OTYPER &= (~(0x1<<10));//设置PE8为推挽输出GPIOE->OTYPER &= (~(0x1<<8));//设置PE9为推挽输出GPIOE->OTYPER &= (~(0x1<<9));//设置PE10为低速输出GPIOE->OSPEEDR &= (~(0x3<<20));//设置PF10为低速输出GPIOF->OSPEEDR &= (~(0x3<<20));//设置PE8为低速输出GPIOE->OSPEEDR &= (~(0x3<<16));//设置PE9为低速输出GPIOE->OSPEEDR &= (~(0x3<<18));//设置PE10没有上拉下拉电阻GPIOE->PUPDR &= (~(0x3<<20));//设置PF10没有上拉下拉电阻GPIOF->PUPDR &= (~(0x3<<20));//设置PE8没有上拉下拉电阻GPIOE->PUPDR &= (~(0x3<<16));//设置PE9没有上拉下拉电阻GPIOE->PUPDR &= (~(0x3<<18));//默认三盏灯为熄灭状态GPIOE->ODR &= (~(0x1<<10));GPIOF->ODR &= (~(0x1<<10));GPIOE->ODR &= (~(0x1<<8));//风扇GPIOE->ODR &= (~(0x1<<9));}
void LED1_CTRL(int flag)
{if(flag == 1)//亮灯{GPIOE->ODR |= (0x1<<10);}else if(flag == 0)//灭灯{GPIOE->ODR &= (~(0x1<<10));}}
void LED2_CTRL(int flag)
{if(flag == 1)//亮灯{GPIOF->ODR |= (0x1<<10);}else if(flag == 0)//灭灯{GPIOF->ODR &= (~(0x1<<10));}}
void LED3_CTRL(int flag)
{if(flag == 1)//亮灯{GPIOE->ODR |= (0x1<<8);}else if(flag == 0)//灭灯{GPIOE->ODR &= (~(0x1<<8));}}
void CH1_CTRL(int flag)
{if(flag == 1)//亮灯{GPIOE->ODR |= (0x1<<9);}else if(flag == 0)//灭灯{GPIOE->ODR &= (~(0x1<<9));}
}

 

主函数:

#include "uart4.h"//手动封装一个延时函数
void delay(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++){}}}
int main()
{//uart4的初始化uart4_config();led_init();//存储单个字符的容器//char a;//存储字符串的容器char buf[128];while(1){/*a = getchar();	//接收一个字符putchar(a+1);	//发送一个字符,eg:发送a,输出bputchar('\r');putchar('\n');*//*gets(buf);//接收字符串puts(buf);//发送字符串*//*串口发送指令,使得LED灯/风扇工作*/gets(buf);if(Strcmp(buf,"LED1_ON") == 0){LED1_CTRL(1);}else if(Strcmp(buf,"LED1_OFF") == 0){LED1_CTRL(0);}else if(Strcmp(buf,"LED2_ON") == 0){LED2_CTRL(1);}else if(Strcmp(buf,"LED2_OFF") == 0){LED2_CTRL(0);}else if(Strcmp(buf,"LED3_ON") == 0){LED3_CTRL(1);}else if(Strcmp(buf,"LED3_OFF") == 0){LED3_CTRL(0);}else if(Strcmp(buf,"CH1_ON") == 0){CH1_CTRL(1);}else if(Strcmp(buf,"CH1_OFF") == 0){CH1_CTRL(0);}puts(buf);}return 0;
}

 

2.通过串口发送指令,控制LED\风扇等外设工作

#include "uart4.h"//手动封装一个延时函数
void delay(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++){}}}
int main()
{//uart4的初始化uart4_config();led_init();//存储单个字符的容器//char a;//存储字符串的容器char buf[128];while(1){/*a = getchar();	//接收一个字符putchar(a+1);	//发送一个字符,eg:发送a,输出bputchar('\r');putchar('\n');*//*gets(buf);//接收字符串puts(buf);//发送字符串*//*串口发送指令,使得LED灯/风扇工作*/gets(buf);if(Strcmp(buf,"LED1_ON") == 0){LED1_CTRL(1);}else if(Strcmp(buf,"LED1_OFF") == 0){LED1_CTRL(0);}else if(Strcmp(buf,"LED2_ON") == 0){LED2_CTRL(1);}else if(Strcmp(buf,"LED2_OFF") == 0){LED2_CTRL(0);}else if(Strcmp(buf,"LED3_ON") == 0){LED3_CTRL(1);}else if(Strcmp(buf,"LED3_OFF") == 0){LED3_CTRL(0);}else if(Strcmp(buf,"CH1_ON") == 0){CH1_CTRL(1);}else if(Strcmp(buf,"CH1_OFF") == 0){CH1_CTRL(0);}puts(buf);}return 0;
}

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

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

相关文章

janus部署

配置和运行janus 1. 配置nginx 安装nginx&#xff0c;主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

Unity AR开发环境搭建

在上一篇文章中&#xff0c;我定义了各种类型的扩展现实 (XR)。 在其中&#xff0c;我将增强现实 (AR) 定义为&#xff1a;增强现实 (AR) 将数字对象置于物理世界中。 通常&#xff0c;该设备将配备某种类型的相机&#xff08;例如智能手机&#xff09;&#xff0c;可以实时提供…

Spring Task 定时任务调度

一、概念 Spring Task 是 Spring 框架的一个组件&#xff0c;它为任务调度提供了支持&#xff0c;使得开发者能够创建后台任务或定期执行的任务。通过 Spring Task&#xff0c;您可以方便地在 Java 应用程序中实现定时任务&#xff0c;比如每天凌晨进行数据同步、每小时执行一…

如何使用React.js从头开始构建TODO应用

如果你是React.js的新手&#xff0c;并且渴望投身应用程序开发&#xff0c;那么你来对地方了&#xff01; 跟着我一起通过这个教程&#xff0c;从头开始构建一个基本的TODO应用程序。 &#xff08;本文视频讲解&#xff1a;java567.com&#xff09; TODO应用对初学者的重要性…

webSocket + springboot+vue3用法

领导安排个任务&#xff0c;大屏显示数据&#xff0c;要与后台数据一致&#xff0c;所以用到了websocket&#xff0c;涉及的前后端代码整理如下&#xff0c;希望对大家有所帮助。 后端代码 pom文件添加依赖 <!--websocket依赖--> <dependency><groupId>or…

jeecg-boot安装

我看大家都挺关注&#xff0c;所以集中上传了下代码和相关工具&#xff0c;方便大家快速完成 链接&#xff1a;https://pan.baidu.com/s/1-Y9yHVZ-4DQFDjPBWUk4-A 提取码&#xff1a;op1r 1. 下载代码 下载地址 : JEECG官方网站 - 基于BPM的低代码开发平台(低代码平台_零代…

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多个…

冯诺依曼结构理解

冯诺依曼结构 存储器&#xff1a;内存 数据是要在计算机的体系结构中进行流动的&#xff0c;在流动过程中对数据加工处理 从一个设备到另一个设备&#xff0c;本质是一种拷贝 CPU的计算速度是很快的&#xff0c;所以数据设备间的拷贝效率&#xff0c;决定了计算机整体的基本效率…

常见Spring相关工具报错-源码分析

常见Spring相关工具报错-源码分析 1. Resouce Bundle 国际化 yml 配置不生效 1. Resouce Bundle 国际化 yml 配置不生效 1️⃣ 配置yml 2️⃣ 报错信息 2024-04-15 15:13:57.828 [http-nio-8090-exec-1] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [doResolveHan…

Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘

注意&#xff1a;本文下载的资源&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 Python数据挖掘项目开发实战&#xff1a;使用朴素贝叶斯进行社会媒体挖掘 一、项目背景与目标 在社交媒体时代&…

Spring Boot | SpringBoot对 “SpringMVC“的 “整合支持“、SpringMVC“功能拓展实现“

目录: SpringMVC 的 “整合支持” ( 引入"Web依赖启动器"&#xff0c;几乎可以在无任何额外的配置的情况下进行"Web开发")1.SpringMVC "自动配置" 介绍 ( 引入Web依赖启动器"后&#xff0c;SpringBoot会自动进行一些“自动配置”&#xff0…

51单片机-LED模块

文章目录 1.点亮一个LED灯2.LED闪烁3.LED流水灯 1.点亮一个LED灯 #include <REGX52.H> void main() {P20xFE; //1111 1110while(1){} }2.LED闪烁 增加延时&#xff0c;控制LED的亮灭间隙 延时函数的添加依靠STC-ISP软件的延时函数功能代码自动生成&#xff0c;如图 #i…

Linux 使用C语言来加载和卸载内核模块

文章目录 一、insmod/rmmod1.1 insmod1.2 rmmod 二、C语言示例2.1 syscall2.2 dmeo 一、insmod/rmmod 1.1 insmod Linux 使用insmod来加载内核模块&#xff1a; NAMEinsmod - Simple program to insert a module into the Linux Kernel使用strace来追踪其过程&#xff1a; …

React中useEffect与useLayoutEffect有什么区别?

React中useEffect与useLayoutEffect有什么区别&#xff1f; 1. useEffect2. useLayoutEffect3. useEffect与useLayoutEffect的区别3.1 何时使用useLayoutEffect&#xff1f; 在React中&#xff0c;useEffect和useLayoutEffect都是用来处理副作用的Hook&#xff0c;例如数据获取…

童话里都是骗人的,靠可视化大屏升职加薪,除非老板脑子秀逗了。

可视化大屏有没有价值&#xff0c;肯定是有的&#xff0c;靠着可视化大屏升职加薪靠谱吗&#xff1f;不靠谱。 童话故事中的情节和元素往往是夸张和不现实的&#xff0c;不能完全应用于现实生活中。在现实世界中&#xff0c;升职加薪通常需要通过实际的工作表现、专业技能的提…

数据库练习(一)

完成以下SQL语句的编写&#xff1a; student表: score 表&#xff1a; 查询student表的所有记录 Select * from student; 查询student表的第2条到4条记录 select * from student LIMIT 1,3; 从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;n…

Java虚拟机——内存的分配详解

内存区域划分 对于大多数的程序员来说&#xff0c;Java 内存比较流行的说法便是堆和栈&#xff0c;这其实是非常粗略的一种划分&#xff0c;这种划分的“堆”对应内存模型的 Java 堆&#xff0c;“栈”是指虚拟机栈&#xff0c;然而 Java 内存模型远比这更复杂&#xff0c;想深…

react结合Redux实现全局状态管理

React与Redux结合使用&#xff0c;可以为React应用提供集中式的状态管理和复杂的业务逻辑处理能力。以下是React中使用Redux的基本步骤和关键概念&#xff1a; 安装所需库 确保已经安装了React和ReactDOM。然后安装Redux及其配套库&#xff1a; npm install redux react-redu…

基于云端部署,支持超大规模会议的召开,同时实现就近接入的功能

随着信息技术的飞速发展&#xff0c;云视频产品已成为企业沟通协作的重要工具。中国联通作为通信行业的领军企业&#xff0c;其云视频产品凭借多项技术优势&#xff0c;在市场中脱颖而出&#xff0c;成为众多企业的首选。 中国联通的云视频产品采用了先进的互联网高清技术&…

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…