华清远见嵌入式学习——ARM——作业3

作业要求:

代码效果图:

代码:

led.h

#ifndef __LED_H__
#define __LED_H__#define RCC_GPIO (*(unsigned int *)0x50000a28)
#define GPIOE_MODER (*(unsigned int *)0x50006000)
#define GPIOF_MODER (*(unsigned int *)0x50007000)
#define GPIOE_OTYPER (*(unsigned int *)0x50006004)
#define GPIOF_OTYPER (*(unsigned int *)0x50007004)
#define GPIOE_OSPEEDR (*(unsigned int *)0x50006008)
#define GPIOF_OSPEEDR (*(unsigned int *)0x50007008)
#define GPIOE_PUPDR (*(unsigned int *)0x5000600C)
#define GPIOF_PUPDR (*(unsigned int *)0x5000700c)
#define GPIOE_ODR (*(unsigned int *)0x50006014)
#define GPIOF_ODR (*(unsigned int *)0x50007014)void all_led_init();
void led1_on();
void led1_off();
void led2_on();
void led2_off();
void led3_on();
void led3_off();#endif

led.c

#include "led.h"
void all_led_init()
{RCC_GPIO |= (0X3<<4);//时钟使能GPIOE_MODER &=(~(0X3<<20));//设置PE10输出GPIOE_MODER |= (0X1<<20);//设置PE10为推挽输出GPIOE_OTYPER &=(~(0x1<<10));//PE10为低速输出GPIOE_OSPEEDR &= (~(0x3<<20));//设置无上拉下拉GPIOE_PUPDR &= (~(0x3<<20));//LED2GPIOF_MODER &=(~(0X3<<20));//设置Pf10输出GPIOF_MODER |= (0X1<<20);//设置Pf10为推挽输出GPIOF_OTYPER &=(~(0x1<<10));//Pf10为低速输出GPIOF_OSPEEDR &= (~(0x3<<20));//设置无上拉下拉GPIOF_PUPDR &= (~(0x3<<20));//LED3GPIOE_MODER &=(~(0X3<<16));//设置PE8输出GPIOE_MODER |= (0X1<<16);//设置PE8为推挽输出GPIOE_OTYPER &=(~(0x1<<8));//PE8为低速输出GPIOE_OSPEEDR &= (~(0x3<16));//设置无上拉下拉GPIOE_PUPDR &= (~(0x3<<16));
}
void led1_on()
{GPIOE_ODR |= (0x1<<10);
}void led1_off()
{GPIOE_ODR &= (~(0x1<<10));
}
void led2_on()
{GPIOF_ODR |= (0x1<<10);
}void led2_off()
{GPIOF_ODR &= (~(0x1<<10));
}
void led3_on()
{GPIOE_ODR |= (0x1<<8);
}void led3_off()
{GPIOE_ODR &= (~(0x1<<8));
}

uart.h

#ifndef __UART4_H__
#define __UART4_H__
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_uart.h"void uart4_config();
void putchar(char a);
char getchar();
void gets(char *s);
void puts(char *s);
int strcmp(char *s1,char *s2);
#endif

uart.c

#include"uart4.h"//uart4的相关配置
void uart4_config()
{//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR |= (0x1<<1);//gpiobRCC->MP_AHB4ENSETR |= (0x1<<6);//gpiogRCC->MP_APB1ENSETR |= (0x1<<16);//uart4//2.设置PB2\PG11用于UART4的管脚复用//设置PG11GPIOG->MODER &= (~(0x3<<22));GPIOG->MODER |= (0x2<<22);GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//设置PB2GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0x2<<4);GPIOB->AFRL &= (~(0xF<<8));GPIOB->AFRL |= (0x8<<8);//禁用串口USART4->CR1 &= (~0x1);//3.设置数据位宽为8位USART4->CR1 &= (~(0x1<<12));USART4->CR1 &= (~(0x1<<28));//4.设置无奇偶校验位USART4->CR1 &= (~(0x1<<10));//5.设置16倍过采样USART4->CR1 &= (~(0x1<<15));//6.设置1位停止位USART4->CR2 &= (~(0x3<<12));//7.设置不分频USART4->PRESC &= (~0xf);//8.设置波特率为115200USART4->BRR=0X22B;//9.使能发送器USART4->CR1 |= (0x1<<3);//10.使能接收器USART4->CR1 |= (0x1<<2);//11.使能串口USART4->CR1 |= (0x1);
}void putchar(char a)
{//1.先判断发送器是否为空,不为空等待while(!(USART4->ISR &(0x1<<7)));//2.向发送寄存器写入数据USART4->TDR=a;//3.等待发送完成while(!(USART4->ISR &(0x1<<6)));
}char getchar()
{char a;//1.判断接收器是否有准备好的数据,没有就等待while(!(USART4->ISR &(0x1<<5)));//2.读取数据a=USART4->RDR;//3.返回return a;
}//发送一个字符串
void puts(char *s)
{while(*s){putchar(*s);s++;}putchar('\r');putchar('\n');
}//接收一个字符串
void gets(char *s)
{while(1){*s=getchar();putchar(*s);//键盘输入的内容在串口上回显if(*s=='\r')break;s++;}*s='\0';}//实现字符串比较
int strcmp(char *s1,char *s2)
{int i = 0;while(((*(s1+i))==(*(s2+i)))){i++;if( (*(s1+i)=='\0')){break;}}int sub = ((*(s1+i))-(*(s2+i)));if(sub>0){return sub;}else if(sub<0){return sub;}else{return 0;			}
}

main.c

#include "uart4.h"
#include "led.h"int main()
{char buf[128];char *ledon1 = "led1on";char *ledon2 = "led2on";char *ledon3 = "led3on";char *ledoff1 = "led1off";char *ledoff2 = "led2off";char *ledoff3 = "led3off";uart4_config();all_led_init();while (1){gets(buf); // 读取字符串puts(buf); // 打印字符串//判断字符串,确定灯的亮与灭if((strcmp(buf,ledon1) == 0))    //一号灯亮{led1_on();}else if((strcmp(buf,ledoff1) == 0))    //一号灯灭{led1_off();}else if((strcmp(buf,ledon2) == 0))    //二号灯亮{led2_on();}else if((strcmp(buf,ledoff2) == 0))    //二号灯灭{led2_off();}else if((strcmp(buf,ledon3) == 0))    //三号灯亮{led3_on();}else if((strcmp(buf,ledoff3) == 0))    //三号灯灭{led3_off();}			}
}

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

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

相关文章

使用 Amazon CodeCatalyst 中的生成式 AI 助手 Amazon Q 提高开发人员的工作效率(预览版)

今天&#xff0c;我很荣幸能够向各位介绍 Amazon CodeCatalyst 中可用的新型生成式 AI 助手 Amazon Q&#xff0c; 主要用于加速软件分发。 加速软件功能开发 – Amazon Q 的这项功能开发技术可以帮助您快速地完成软件开发任务&#xff0c;例如添加注释和 README、优化问题描述…

TensorFlow 模型中的回调函数与损失函数

回调函数 tf.keras 的回调函数实际上是一个类&#xff0c;一般是在 model.fit 时作为参数指定&#xff0c;用于控制在训练过程开始或者在训练过程结束&#xff0c;在每个 epoch 训练开始或者训练结束&#xff0c;在每个 batch 训练开始或者训练结束时执行一些操作&#xff0c;…

GIT 不同仓库之间合并代码

合并两个不同仓库的代码通常需要以下步骤。这里以合并两个远程仓库为例&#xff1a; 添加远程仓库&#xff1a; 在本地仓库中&#xff0c;使用以下命令添加第二个远程仓库&#xff1a; git remote add <远程仓库名> <远程仓库URL>例如&#xff1a; git remote add …

国内厉害的游戏开发公司有哪些?

中懿游游戏软件开发,中国有许多厉害的游戏开发公司&#xff0c;其中一些在国际上也享有盛誉。以下是一些在中国游戏开发领域中备受关注的公司&#xff1a; 腾讯游戏&#xff08;Tencent Games&#xff09;&#xff1a; 作为中国最大的互联网公司之一&#xff0c;腾讯的游戏分支…

视觉学习(6) —— 接收事件规则列表

条件&#xff1a; 两个地址 绑定地址1&#xff0c;条件是值为1才执行流程 &#xff08;1&#xff09;字节起止位置为 0-0 向100写入值1&#xff0c;流程次数是否会增加 答案是不会&#xff0c;字节0是在哪里 所以当写入值1 而因为字节起止位置是0 0 &#xff0c;所以只读字…

前端项目重构的深度思考和复盘

摘要&#xff1a; 项目重构是每一家稳定发展的互联企业的必经之路, 就像一个产品的诞生, 会经历产品试错和产品迭代 一样, 随着业务或新技术的不断发展, 已有架构已无法满足更多业务扩展的需求, 所以只有通过重构来让产品“进化”, 才能跟上飞速发展的时代浪潮. 技术因素 早期…

W5500-EVB-Pico评估版介绍

文章目录 1 概述2 板载资源2.1 硬件规格2.2 硬件规格2.3 工作条件 3 参考资料3.2 原理图3.3 尺寸图 (单位 : mm)3.4 参考例程 4 硬件协议栈优势 1 概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同&#xff0c;但…

【MATLAB库函数系列】线性调频Z(Chirp-Z,CZT)的MATLAB源码和C语言实现

在上一篇博客 【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解 已经详细介绍了CZT变换的应用背景和原理,先回顾一下: 回顾CZT算法 采用 FFT 算法可以很快计算出全部 N N N点 DFT 值,即Z变换 X ( z ) X(z) <

220v电源转换12v和24v用什么芯片

问&#xff1a;将220V电源转换为12V和24V - 使用什么芯片&#xff1f; 答&#xff1a;常用于将220V电源转换为12V和24V的芯片是AH8669和AH8665。 问&#xff1a;AH8669芯片提供了什么特点&#xff1f; 答&#xff1a;AH8669芯片适用于最大电流为700mA的应用。它内置了MOSFET…

01-黑马程序员大数据开发

一. Hadoop概述 1. 什么是大数据 &#xfeff;狭义上&#xff1a;对海量数据进行处理的软件技术体系&#xfeff;广义上&#xff1a;数字化、信息化时代的基础支撑&#xff0c;以数据为生活赋 2. 大数据的核心工作&#xff1a; &#xfeff;存储&#xff1a;妥善保存海量待…

5g消息-5G时代短信升级-富媒体智能交互-互联网新入口

在5G时代&#xff0c;运营商和各大手机厂商都在积极推进5G消息的商用&#xff0c;基于短信入口的富媒体消息应用在近两年得到快速发展&#xff0c;并在企业端形成了广泛应用。 作为5G时代的数字原生应用&#xff0c;5G消息支持用户通过文字、图片、音频、视频、位置等富媒体方式…

【算法题】链表重排(js)

力扣链接&#xff1a;https://leetcode.cn/problems/LGjMqU/description/ /*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode…

C++11(上):新特性讲解

C11新特性讲解 前言1.列表初始化1.1{ }初始化1.2std::initializer_list 2.类型推导2.1 auto2.2 typeid2.3 decltype 3.范围for4.STL的变化4.1新容器4.2容器的新方法 5.右值引用和移动语义5.1 左值引用和右值引用5.2 左值引用与右值引用比较5.3 右值引用的使用场景5.4 右值、左值…

浙江大唐乌沙山电厂选择ZStack Cloud打造新一代云基础设施

浙江大唐乌沙山电厂选择云轴科技ZStack Cloud云平台为其提供高性能、高可用的云主机、云存储和云网络&#xff0c;构建了简单、稳定、安全、高效的云基础设施&#xff1b;通过ZStackCloud为其提供可视化服务编排、多租户自服务等模块&#xff0c;帮助电厂提高IT资源利用率&…

解决FTP传输慢的问题(ftp传输慢为什么)

在企业运营中&#xff0c;使用FTP进行文件或数据传输是相当普遍的做法。尽管FTP是一种传统的文件传输工具&#xff0c;但在实际应用中&#xff0c;我们可能会面临传输速度缓慢的问题&#xff0c;这不仅影响工作效率&#xff0c;还浪费时间。为了解决这一问题&#xff0c;我们可…

泛微OA xmlrpcServlet接口任意文件读取漏洞(CNVD-2022-43245)

CNVD-2022-43245 泛微e-cology XmlRpcServlet接口处存在任意文件读取漏洞&#xff0c;攻击者可利用漏洞获取敏感信息。 1.漏洞级别 中危 2.影响范围 e-office < 9.5 202201133.漏洞搜索 fofa 搜索 app"泛微-OA&#xff08;e-cology&#xff09;"4.漏洞复现 …

vue 项目/备案网页/ip网页打包成 apk 安装到平板/手机(含vue项目跨域代理打包成apk后无法访问接口的解决方案)

下载安装HBuilder X编辑器 https://www.dcloud.io/hbuilderx.html 新建 5APP 项目 打开 HBuilder X&#xff0c;新建项目 此处项目名以 ‘test’ 为例 含跨域代理的vue项目改造 若 vue 项目中含跨域代理&#xff0c;如 vue.config.js module.exports {publicPath: "./&…

【C++】开源:FTXUI终端界面库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍FTXUI终端界面库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

【文本处理】正则表达式

一、简介 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&…

苹果发布了一个Ferret(雪貂)多模态大模型,在一个无人问津的角落被一位博主捞起来

苹果12月14日释放了一个名为Ferret的多模态大语言模型&#xff0c;有的翻译是雪貂&#xff0c;有的是法学硕士&#xff0c;要我说&#xff0c;还是叫雪貂吧&#xff0c;接地气亲民&#xff0c;将来犯蠢的时候出来发张雪貂的可爱表情包作公关就完事了&#xff0c;你个法学硕士到…