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

news2024/9/24 21:27:08

作业要求:

代码效果图:

代码:

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));
 
    //LED2
    GPIOF_MODER &=(~(0X3<<20));//设置Pf10输出
    GPIOF_MODER |= (0X1<<20);
    //设置Pf10为推挽输出
    GPIOF_OTYPER &=(~(0x1<<10));
    //Pf10为低速输出
    GPIOF_OSPEEDR &= (~(0x3<<20));
    //设置无上拉下拉
    GPIOF_PUPDR &= (~(0x3<<20));
 
    //LED3
    GPIOE_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);//gpiob
    RCC->MP_AHB4ENSETR |= (0x1<<6);//gpiog
    RCC->MP_APB1ENSETR |= (0x1<<16);//uart4
    //2.设置PB2\PG11用于UART4的管脚复用
    //设置PG11
    GPIOG->MODER &= (~(0x3<<22));
    GPIOG->MODER |= (0x2<<22);
    GPIOG->AFRH &= (~(0xf<<12));
    GPIOG->AFRH |= (0x6<<12);
    //设置PB2
    GPIOB->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.设置波特率为115200
    USART4->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.coloradmin.cn/o/1334893.html

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

相关文章

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

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

如何使用PatchaPalooza对微软每月的安全更新进行全面深入的分析

关于PatchaPalooza PatchaPalooza是一款针对微软每月安全更新的强大分析工具&#xff0c;广大研究人员可以直接使用该工具来对微软每月定期推送的安全更新代码进行详细、全面且深入的安全分析。 PatchaPalooza使用了微软MSRC CVRF API的强大功能来获取、存储和分析安全更新数…

大语言模型说明书

在浩瀚的信息宇宙中&#xff0c;大语言模型如同一颗璀璨的星星正在熠熠生辉。21世纪以来&#xff0c;人工智能可谓是飞速发展&#xff0c;从简单的神经网络到大语言模型、生成式AI&#xff0c;这并非仅仅是一种技术的进步&#xff0c;更是人类智慧的飞跃。大语言模型不仅仅是语…

Wireshark网络工具来了

Wireshark是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包&#xff0c;并尝试显示包的尽可能详细的情况。 Wireshark是一个免费开源软件&#xff0c;不需要付费&#xff0c;免费使用&#xff0c;可以直接登陆到Wireshark的官网下载安装。 在windows环境中&#x…

【强化学习】PPO:近端策略优化算法

近端策略优化算法 《Proximal Policy Optimization Algorithms》 论文地址&#xff1a;https://arxiv.org/pdf/1707.06347.pdf 一、 置信域方法(Trust Region Methods) ​ 设 π θ o l d \pi_{\theta_{old}} πθold​​是先前参数为 θ o l d \theta_{old} θold​的策略网…

JavaScript:DOM-事件

JavaScript&#xff1a;DOM - 事件 事件监听什么是事件监听事件监听的方式事件类型点击事件鼠标事件键盘事件焦点事件文本框输入事件 事件对象什么是事件对象获取事件对象事件对象常用属性事件解绑 环境对象 this事件流事件捕获事件冒泡事件捕获与事件冒泡的影响阻止冒泡事件委…

CentOS7安装Java11

文章目录 Java11下载地址卸载OpenJDK查询原系统安装的 JDK根据原系统安装的 JDK 进行卸载命令修改 安装JDK生成JRE Java11下载地址 https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html 卸载OpenJDK 查询原系统安装的 JDK java -version yum l…

如何将本地websocket发布至公网并实现远程访问服务端

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

深入探讨多模态模型和计算机视觉

近年来&#xff0c;机器学习领域在从图像识别到自然语言处理的不同问题类型上取得了显着进展。然而&#xff0c;这些模型中的大多数都对来自单一模态的数据进行操作&#xff0c;例如图像、文本或语音。相比之下&#xff0c;现实世界的数据通常来自多种模态&#xff0c;例如图像…

前端---html 的介绍

1. 网页效果图 --CSDN 2. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是超文本标记语言。 标记&#xff1a;就是标签, <标签名称> </标签名称>, 比如: <html></html>、<h1></h1> 等&#xff0c;标签大多数都是…

Echarts随机生成颜色

Echarts生成随机颜色&#xff0c;并且不要黑色、灰色、棕色等难看的颜色&#xff0c;暖色系并且颜色亮丽&#xff0c; 可以通过修改saturation 和lightness 的随机数值&#xff0c;提高颜色饱和度和亮度 function generateWarmColor() {let hue Math.floor(Math.random() * 3…

【ctf】whireshark流量分析之tcp_杂篇

目录 简介 常考 图片类 提取png.pcap&#xff08;常规&#xff09; 异常的流量分析&#xff08;*&#xff0c;特殊&#xff09; john-in-the-middle&#xff08;特殊&#xff09; ​编辑 zip类 1.pcap&#xff08;常规&#xff09; 方法1&#xff08;常规提取压缩包&…

IAP在编程升级

以STM32F103ZET6为例讲解&#xff0c; FLASH 512KB,SRAM64KB. 让APP程序加载在FLASH里运行&#xff0c;在SRAM运行的先不讲解。 IAP执行流程 当加入 IAP 程序之后&#xff0c;程序运行流程如图。 APP程序的生成步骤 1.APP 程序起始地址设置方法 我们设置起始地址&#xff…

浮点数的转换--IEEE 754

IEEE754标准是一种浮点数表示标准&#xff0c;一般分为 单精度&#xff08;32位的二进制数&#xff09;&#xff1b;双精度&#xff08;64位的二进制数&#xff09; 根据国际标准IEEE754&#xff0c;任意一个二进制浮点数V可以表示为下面形式&#xff1a; V (-1)^s *&#…

JavaWeb后门(webshell)基础

0x00 基础 JSP JSP全称为JavaServer Pages&#xff0c;是一种用于开发支持动态内容的Web页面的技术。它有助于开发人员通过使用特殊的JSP标记在HTML页面中插入Java代码&#xff0c;其中大多数以<&#xff05;开头&#xff0c;以&#xff05;>结尾。Java是一种通用的计算…

互联网+建筑工地:技术革新引领建筑行业的未来

随着科技的飞速发展&#xff0c;互联网正日益渗透到建筑工地的方方面面。从设计、施工到管理&#xff0c;互联网建筑工地的深度融合不仅推动了建筑行业的数字化转型&#xff0c;还为工地管理、信息交流、安全监控等带来了全新的解决方案。本文将介绍互联网建筑工地的几个关键技…

【c++】入门2

函数重载 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理实现功能类似数据类型 不同的问题。 c区分重载函数是根据参数…

golang的jwt学习笔记

文章目录 初始化项目加密一步一步编写程序另一个参数--加密方式关于StandardClaims 解密解析出来的怎么用关于`MapClaims`上面使用结构体的全代码实战项目关于验证这个项目的前端初始化项目 自然第一步是暗转jwt-go的依赖啦 #go get github.com/golang-jwt/jwt/v5 go get githu…

AAAI 2024录用论文合集,包含图神经网络、时间序列、多模态、异常检测等热门研究方向

AAAI是国际顶级人工智能学术会议&#xff0c;属于CCF A类&#xff0c;在人工智能领域享有盛誉。今年的AAAI 会议投稿量突破了历史记录&#xff0c;共有12100篇投稿&#xff08;主赛道&#xff09;&#xff0c;最终录用2342篇&#xff0c;录用率为23.75%。对比前几年有了很大的提…

人工智能_机器学习073_SVM支持向量机_人脸识别模型建模_预测可视化_网格搜索交叉验证最优化参数对比---人工智能工作笔记0113

接着上一节来说,可以看到我们已经找到了合适的参数,然后 我们可以看一下这里 gc.best_params_ 就可以打印出最合适的参数 然后我们把最合适串按说填入到代码中,然后进行计算,看看得分 可以看到得分,训练数据是1.0 然后测试数据得分是0.7857...对吧