华清远见嵌入式学习——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));
 
    //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();
				}			

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势 本章节主要参考书籍《Xilinx Zynq-7000 嵌入式系统设计与实现 基于ARM Cortex-A9双核处理器和Vivado的设计方法 (何宾&#xff0c;张艳辉编著&#xff09;》 本章节主要讲述FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势&#xff0c;学习笔…

Rancher小白学习之路

官网&#xff1a;http://docs.rancher.cn/docs/rancher1/rancher-service/load-balancer/_indexhttp://docs.rancher.cn/docs/rancher1/rancher-service/load-balancer/_indexRancher2.5集群搭建&K3S生产环境搭建手册 - 知乎 【rancher教程】十年运维大佬两小时带你搞定ran…

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结 测试一&#xff1a;没有添加 自动转化的配置&#xff0c;且domain中的属性名称和数据库的字段名称一致测试二&#xff1a;没有添加自动转化配置i&#xff0c;domain属性名userPassword和数据…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 &#xff0c;感觉大佬在矩阵转置那块介绍的还是有些简略&#xff0c;我自己又做了点动图加以补充理解。膜拜大佬&#xff01; Part A 先解决解析命令行参数的…

年龄相关的微环境变化突显了PDGF-C在ER+乳腺癌转移复发中的作用

今天给同学们分享一篇实验文章“Age-associated microenvironmental changes highlight the role of PDGF-C in ER breast cancer metastatic relapse”&#xff0c;这篇文章发表在Nat Cancer期刊上&#xff0c;影响因子为22.7。 结果解读&#xff1a; ER乳腺癌转移复发的同种…

LH7904D 太阳能警示灯 0.4W×2

应用范围: 可安装在电线杆&#xff0c;路灯&#xff0c;围挡&#xff0c;交 通护栏及各种杆式固体等场所起警示作用。 产品特点&#xff1a; 采用进口PS材质; 光控无开关&#xff0c;白天不闪&#xff0c;昏暗环境自动闪烁&#xff0c;无需手动操作&#xff0c;省时省事; …

cfa一级考生复习经验分享系列(十)

我的背景&#xff1a;我是在职备考CFA的&#xff0c;工作也是跟金融不相关的&#xff0c;工作日基本只有晚上能看最多2-3小时&#xff0c;主要靠周末大块时间复习。由于平时工作忙碌直到9月中才开始看各种资料。但是可能我复习策略比较有效率&#xff0c;所以最后4次官方mock平…

彻底搞懂MySQL的执行计划

欢迎关注微信公众号&#xff1a;互联网全栈架构 MySQL执行计划&#xff08;EXPLAIN&#xff09;可以提供SQL运行的一些信息&#xff0c;相当于模拟SQL的执行&#xff0c;从而让我们可以对SQL语句做更深入的分析和了解。在实际开发过程中&#xff0c;我们经常会使用执行计划来分…

编写fastapi接口服务

FastAPI是一个基于 Python 的后端框架&#xff0c;该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制&#xff0c;使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1&#xff1a;安装必要库 pip install fastapi uvicorn st…

FLStudio21中文版水果编曲软件好用吗?如何下载最新版本

FL Studio21版是一款在国内非常受欢迎的多功能音频处理软件&#xff0c;我们可以通过这款软件来对多种不同格式的音频文件来进行编辑处理。而且FL Studio 21版还为用户们准备了超多的音乐乐器伴奏&#xff0c;我们可以直接一键调取自己需要的音调。 FL Studio21版不仅拥有非常…

基于TM的遥感数据的叶面积指数估算解决方案

1.背景与技术路线 叶面积指数是重要的植被结构参数&#xff0c;反演叶面积指数是植被遥感的重要研究内容之一&#xff0c;其影响生态系统的物质和能量循环&#xff0c;成为作物生长、路面过程、水文和生态等模型的输入参数或状态变量。今年来&#xff0c;对也铭记指数的反演已…

vue-awesome-swiper轮播组件

安装版本&#xff1a;"swiper": "^6.0.0", 安装版本&#xff1a;"vue-awesome-swiper": "^4.1.1", <div class"swiper_conter"><swiper class"swiper" :options"swiperOption" ref"mySw…

Windows系统配置pytorch环境,Jupyter notebook编辑器安装使用(深度学习本地篇)

如今现在好一点的笔记本都自带英伟达独立显卡&#xff0c;对于一些简单的深度学习项目&#xff0c;是不需要连接服务器的&#xff0c;甚至数据量不大的话&#xff0c;cpu也足够进行训练学习。我把电脑上一些以前的笔记整理一下&#xff0c;记录起来&#xff0c;方便自己35岁事业…

快速构建空间场景轻应用的一次体验分享

零&#xff1a;前言 最近虚竹哥发现一款基于Web端打造的轻量化工具创作平台&#xff0c;用于快速构建空间场景轻应用&#xff0c;它就是Mapmost Alpha。内置丰富且多样化风格的三维场景、三维模型、数据服务、POI数据、图片、视频、网页等资源&#xff0c;通过拖拉拽的方式&am…

YOLOv8改进 | 主干篇 | RevColV1可逆列网络(特征解耦助力小目标检测)

一、本文介绍 本文给大家带来的是主干网络RevColV1&#xff0c;翻译过来就是可逆列网络去发表于ICLR2022&#xff0c;其是一种新型的神经网络设计(和以前的网络结构的传播方式不太一样)&#xff0c;由多个子网络&#xff08;列&#xff09;通过多级可逆连接组成。这种设计允许…

JavaScript进阶(事件+获取元素+操作元素)

目录 事件基础 事件组成 执行事件的步骤 获取元素 根据ID获取元素 根据标签名获取元素 获取ol中的小li 类选择器&#xff08;html5新增的I9以上支持&#xff09; 获取body和html 操作元素 innerText和innerHtml 表单标签 样式属性操作 操作元素总结 事件基础 事…

铁山靠之——HarmonyOS组件 - 2.0

HarmonyOS学习第二章 一、HarmonyOS基础组件的使用1.1 组件介绍1.2 Text1.2.1 文本样式1.2.2 设置文本对齐方式1.2.3 设置文本超长显示1.2.4 设置文本装饰线 1.3 Image1.3.1 设置缩放类型1.3.2 加载网络图片 1.4 TextInput1.4.1 设置输入提示文本1.4.2 设置输入类型1.4.3 设置光…

关于Python里xlwings库对Excel表格的操作(十八)

这篇小笔记主要记录如何【设置单元格数据的对齐方式】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下…

MySQL递归公用表表达式

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;MySQL知识 &…