ARM day6

2.串口发送指令控制硬件工作

结果:

uart.h

#ifndef  __UART_H__
#define __UART_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h" 
#include "stm32mp1xx_uart.h"void myuart4_init();
void myputchar(char i);
char mygetchar();
char *mygets();
void myputs(char *s);
void all_led_init();
void led1_on();
void led2_on();
void led3_on();
void led1_off();
void led2_off();
void led3_off();int mystrcmp(char *ptr,char *str);
#endif

uart.c


#include "myuart.h"
char buf[100]={0};//串口数据初始化
void myuart4_init()
{//1.UART4和GPIOB\GPIOG的时钟使能RCC->MP_AHB4ENSETR |= (0x1<<1);//使能GPIOB时钟RCC->MP_AHB4ENSETR |= (0x1<<6);//使能GPIOG时钟RCC->MP_APB1ENSETR |= (0X1<<16);//使能UART4时钟//2.设置PB2和PG11的管脚复用GPIOB->MODER&= (~(0x3<<4));GPIOB->MODER|= (0x2<<4); //设置复用GPIOB->AFRL &= (~(0XF<<8));GPIOB->AFRL |= (0X8<<8);//设置uart4功能复用GPIOG->MODER&= (~(0x3<<22));GPIOG->MODER|= (0x2<<22); //设置复用GPIOG->AFRH &= (~(0XF<<12));GPIOG->AFRH |= (0X6<<12);//设置uart4功能复用//3.先去设置串口禁用,方便设置数据格式USART4->CR1 &= (~0X1);//4.设置8位数据位USART4->CR1 &=(~(0x1<<12));USART4->CR1 &=(~(0x1<<28));//5.设置没有奇偶校验USART4->CR1 &=(~(0x1<<10));//6.设置16倍采样    USART4->CR1 &=(~(0x1<<15));//7.设置1位停止位USART4->CR2 &=(~(0x3<<12));//8.设置1分频USART4->PRESC&=(~0xf);//9.设置波特率为115200bpsUSART4->BRR=0x22B;//10.发送器、接收器使能USART4->CR1|=(0X1<<3);USART4->CR1|=(0X1<<2);//11.串口使能USART4->CR1|=(0X1);}
//封装函数发送一个字符数据void myputchar(char i)
{//1.判断TDR寄存器是否为空,如果为空,向TDR寄存器写入数据while(((USART4->ISR)&(0x1<<7))==0);USART4->TDR=i;//2.阻塞等待数据传输完成,函数返回while(((USART4->ISR)&(0x1<<6))==0);}char mygetchar()
{//判断RDR寄存器是否有就绪的数据,如果有就读取,否则等待char a;while(((USART4->ISR)&(0x1<<5))==0);a=USART4->RDR;return a;
}void myputs(char *s)
{while(*s){myputchar(*s);s++;}myputchar('\n');//切换到下一行myputchar('\r');//切换到一行的开头
}char *mygets()
{unsigned int i=0;for(i=0;i<100;i++){buf[i]=mygetchar();myputchar(buf[i]);if(buf[i]=='\r')break;}buf[i]='\0';myputchar('\n');return buf;
}void all_led_init()
{//1.使能外设时钟
RCC->MP_AHB4ENSETR |= (0x3<<4);//2.设置PF10 PE10 PE8为输出输出GPIOE->MODER&= (~(0x3<<20));GPIOE->MODER|= (0x1<<20);GPIOF->MODER&= (~(0x3<<20));GPIOF->MODER|= (0x1<<20);
GPIOE->MODER &= (~(0x3<<16));
GPIOE->MODER|= (0x1<<16);//3.设置推挽输出
GPIOE->OTYPER &= (~(0x1<<10));
GPIOF->OTYPER &= (~(0x1<<10));GPIOE->OTYPER &= (~(0x1<<8));//4.设置输出速度为低速
GPIOE->OSPEEDR &= (~(0x3<<20));
GPIOF->OSPEEDR &= (~(0x3<<20));GPIOE->OSPEEDR &= (~(0x3<<16));
//5.设置无上拉下拉
GPIOE->PUPDR &= (~(0x3<<20));
GPIOF->PUPDR &= (~(0x3<<20));
GPIOE->PUPDR &= (~(0x3<<16));
}void led1_on()
{GPIOE->ODR |= (0x1<<10);}
void led2_on()
{
GPIOF->ODR |= (0x1<<10);}
void led3_on()
{GPIOE->ODR |= (0x1<<8);}void led1_off()
{
GPIOE->ODR&= (~(0x1<<10));}
void led2_off()
{GPIOF->ODR &= (~(0x1<<10));}
void led3_off()
{GPIOE->ODR &= (~(0x1<<8));}int mystrcmp(char *ptr,char *str)
{while(*ptr){if(*ptr!=*str)return -1;ptr++;str++;}return 0;
}

main.c

 #include "myuart.h"int main(){myuart4_init();all_led_init();char *buf;while(1){	myputchar('\n');myputchar('\r');buf=mygets();if(mystrcmp(buf,"led1_on")==0)led1_on();else if(mystrcmp(buf,"led1_off")==0)led1_off();else if(!mystrcmp(buf,"led2_on"))led2_on();	else	if(!mystrcmp(buf,"led2_off"))led2_off();else if(mystrcmp(buf,"led3_on")==0)led3_on();else if(mystrcmp(buf,"led3_off")==0)led3_off();}return 0;}

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

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

相关文章

element-ui基本使用

基本使用&#xff1a;npm i element-uimain.js&#xff1a;/*** 该文件是整个项目的入口文件*/ import Vue from vue; import App from ./App.vue; import ElementUI from element-ui; // 引入Element全部样式 import element-ui/lib/theme-chalk/index.css;// 关闭vue的生产提…

C++ this指针

通常情况下&#xff0c;类的成员函数都只涉及一个对象&#xff0c;即调用它的对象。但有时候方法可能涉及到两个对象&#xff0c;在这种情况就需要使用到C的this指针。 class Stock { private: ... double total_val; ... public: double total() const {return total_val;} }…

【Linux】进程周边002之进程状态

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.什么是状态&#xff1f; …

ChatGLM 手记

ChatGLM-6B&#xff1a;GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型 ChatGLM3&#xff1a; GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 chatglm.cpp&…

利用开源工具Chartmuseum,搭建私有helm chart仓库

1、ChartMuseum是什么? ChartMuseum 是一个用 Go 语言写的开源的 Helm Chart Repository 服务器,有多种 API 来完成对 Helm Chart Repository、Chart 以及 Server 的操作。所有可用的 API 以及使用方法可查看GitHub Repo。 2、ChartMuseum的安装 ChartMuseum安装可参考官网…

Python中的魔力编程:掌握面向对象之道

Python中的面向对象编程 背景&#xff1a; ​ 最近在看一些代码的时候&#xff0c;对类中的一些内置方法不是很懂&#xff0c;因此出一篇文章来细说一下&#xff0c;希望大家看完后对Python中类有一个清楚的认识。 基础铺垫&#xff1a; ​ 面向对象的三个特点&#xff1a;…

C语言中的成员访问:普通变量与指针变量的区别与使用

C语言中的成员访问 在C语言中&#xff0c;我们可以通过变量来访问它们的成员。根据变量的类型&#xff0c;我们使用不同的成员访问符&#xff1a;.和->。本文将详细介绍这两个成员访问符的使用。 目录 普通变量的成员访问指针变量的成员访问示例代码总结 普通变量的成员…

深入探索 Spring Boot:简化开发,加速部署的全方位利器

目录 导言 1. 自动配置&#xff08;Auto-Configuration&#xff09; 2. 起步依赖&#xff08;Starter Dependencies&#xff09; 3. 嵌入式 Web 服务器 4. Actuator 5. 外部化配置 6. 简化的安全性配置 7. Spring Boot CLI 8. Spring Boot DevTools 导言 在当今软件开…

java基础之抽象的概念(全网最详细)

一.抽象的概念 如下图所示&#xff1a; 如上图所示&#xff0c;一个父类为图形&#xff0c;计算图形的面积方法&#xff0c;那么就会有疑问&#xff0c;计算哪个图形的面积呢&#xff1f;所以这个计算图形的面积方法就称为抽象方法&#xff1b; 二.抽象方法和抽象类的格式 …

3、Kafka 线上集群部署方案怎么做?

文章目录 1、操作系统的选择1.1、I/O 模型的使用1.2、数据网络传输效率1.3、社区支持度 2、磁盘的选择3、磁盘容量的规划3.1、举例思考本问题&#xff1a;3.2、计算一下&#xff1a;3.3、规划磁盘容量时你需要考虑下面这几个元素&#xff1a; 4、带宽规划4.1、计算 总结 1、操作…

电商淘宝爬虫API与淘宝官方开放平台API的区别以及如何选择适合自己的API接口

随着数字化时代的到来&#xff0c;数据已经成为企业竞争力的重要因素。为了获取数据&#xff0c;企业或个人常常需要使用API接口。常见的API接口包括爬虫API和官方开放平台API。本文将详细介绍这两种API接口的区别以及如何选择适合自己的API接口。 一、爬虫API与官方开放平台A…

如何使用GaussDB创建外表(FOREIGN TABLE)

目录 一、前言 二、创建外表的特点 二、GaussDB创建外表访问外部数据库表&#xff08;示例&#xff09; 1、创建外表 2、FAQ&#xff1a;CREATE USER MAPPING错误 三、GaussDB创建外表映射数据文件&#xff08;示例&#xff09; 1、创建数据文件 2、创建外表 3、FAQ&a…

Java之时间类2(JDK8新增)

一、Date类 &#xff08;一&#xff09;、ZoneId&#xff1a;时区 1、概述 ZoneId是Java 8中处理时区的类。它用于表示时区标识符&#xff0c;例如“America/New_York”或“Asia/Tokyo”。一共有600个时区。 2、常用方法: static Set<String> getAvailableZoneIds()获…

C++基础知识

目录 前言&#xff1a; 命名空间 命名空间的定义 命名空间的使用 c输入与输出 缺省参数 函数重载 引用 引用的特性 常引用 引用的使用场景 引用做参数 引用做返回值 引用与指针的区别 内联函数 内联函数的特性 前言&#xff1a; C 语言是结构化和模块化的语言&…

VS CODE 出错 XHR failed

重新下载过去的版本&#xff0c;可能由于最近版本更新导致 Visual Studio Code September 2023

谈谈MYSQL主从复制原理

目录 概述 要点binlog日志 主从复制过程 总结 概述 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。 MySQL 默认采用异步复制方式。从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0…

Volatility3内存取证工具安装及入门在Linux下的安装教程

1-1. Volatility3简介 Volatility 是一个完全开源的工具&#xff0c;用于从内存 (RAM) 样本中提取数字工件。支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多类型操作系统系统的内存取证。 针对竞赛这块&#xff08;CTF、技能大赛等&#xff09;基本上都…

websocket vue操作

let websocket: WebSocket; /** websocket测试 */ function connectWebsocket() {if (typeof WebSocket "undefined") {console.log("您的浏览器不支持WebSocket");return;}// let ip window.location.hostname ":8080";let ip "10.192…

瑞萨RZ/G2L核心板Linux Log目录文件详解

为了排除系统问题&#xff0c;监控系统健康状况以及了解系统与应用程序的交互方式&#xff0c;我们需要了解各log文件的作用&#xff0c;以G2L中yocto文件系统为例&#xff0c;在系统/var/log/目录下会存放记录系统中各个部分的log文件作用如下&#xff1a; 1. 文件详情 下图…

Ubuntu系统部署Inis博客并使用内网穿透发布到公网随时随地远程访问

目录 前言 推荐 1. Inis博客网站搭建 1.1. Inis博客网站下载和安装 1.2 Inis博客网站测试 1.3 cpolar的安装和注册 2. 本地网页发布 2.1 Cpolar临时数据隧道 2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09; 2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09;…