12.25

news2025/2/6 18:05:22

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));
}

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 GPIOF_OSPEEDR     (*(unsigned int *)0x50007008)
#define GPIOE_OSPEEDR     (*(unsigned int *)0x50006008)
#define GPIOF_PUPDR      (*(unsigned int *)0x5000700C)
#define GPIOE_PUPDR     (*(unsigned int *)0x5000600C)
#define GPIOE_ODR     (*(unsigned int *)0x50007014)
#define GPIOF_ODR     (*(unsigned int *)0x50006014)

void led1_on();
void led2_on();
void led3_on();
void led1_off();
void led2_off();
void led3_off();
 void delay(int ms);
 void all_led_init();
#endif

uart4.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();
int cmp(char  *s1,char *s2);
void puts(char *s);
void gets(char *s);
#endif
#include"uart4.h"

#include "led.h"





int main()

{

	char st[100];



	all_led_init();

	uart4_config();



	

	while(1)

	{

		gets(st);

		puts(st);

		if(cmp(st,"open")==0)

		{

				led1_on();

				led2_on();

				led3_on();

		}

		if(cmp(st,"close")==0)

		{

				led1_off();

				led2_off();

				led3_off();

		}

	}

	

	return 0;

	

	

}

main.c

uart4.c

#include "uart4.h"
void uart4_config()
{
    //使能GPIOB/GPIOG/UART4外设时钟
    RCC->MP_AHB4ENSETR |=(0x1<<1);
    RCC->MP_AHB4ENSETR |=(0x1<<6);
    RCC->MP_APB1ENSETR |=(0x1<<16);
    //设置PB2/PG11用于UART4为复用功能
GPIOB->MODER &=(~(0X3<<4));
GPIOB->MODER |=(0X2<<4);
GPIOB->AFRL &=(~(0Xf<<8));
//原来没有移动,下面也是
GPIOB->AFRL |=(0x8<<8);
 //pg11
GPIOG->MODER  &=(~(0X3<<22));
//这一整块都移动错误
GPIOG->MODER |=(0X2<<22); 
GPIOG->AFRH &=(~(0Xf<<12));
//最后一个写成L
GPIOG->AFRH |=(0x6<<12);
 //串口禁用
USART4->CR1 &=(~0x1);
// UART4->CR1 |=(0x1)
//设置数据位宽为8位
USART4->CR1 &=(~(0x1<<12));
USART4->CR1 &=(~(0x1<<28));
//?

//设置无奇偶校验位
USART4->CR1 &=(~(0x1<<10));
//设置16倍过采样
USART4->CR1 &=(~(0x1<<15));
//设置1位停止位
USART4->CR2 &=(~(0x3<<12));
//设置不分频
USART4->PRESC &=(~(0xf));
//设置波特率为115200
 USART4->BRR =0X22B;
//使能发送器
USART4->CR1 |=(0X1<<3);
//使能接收器
USART4->CR1 |=(0X1<<2); 
//使能串口
USART4->CR1 |=(0X1);

}
void putchar(char a )
{
  //判断是发送器否为空,不为空等待
while(!(USART4->ISR &(0X1<<7))); 

//向发送寄存器写入数据
   USART4->TDR=a ;
//等待发送完成
    while(!(USART4->ISR &(0x1<<6)));
}
char getchar()
{
//判断接收器是否有准好的数据,没有就等待
char a;

while(!(USART4->ISR &(0X1<<5)));
//读取数据
 a=USART4->RDR;
 //返回
 return a;
}

void gets(char *s)
{
    while(1)
    {
        *s=getchar();
        if(*s=='\r')
        {
            break;
        }
        s++;
    }
    *s='0';

}
void puts(char *s)
{
    while(1)
    {
        putchar(*s);
        s++;
    }
    putchar('\r');
    putchar('\n');

}
int cmp(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;			
	}

}

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

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

相关文章

关于“Python”的核心知识点整理大全43

目录 ​编辑 15.2.3 使2散点图并设置其样式 scatter_squares.py 15.2.4 使用 scatter()绘制一系列点 scatter_squares.py 15.2.5 自动计算数据 scatter_squares.py 15.2.6 删除数据点的轮廓 15.2.7 自定义颜色 15.2.8 使用颜色映射 scatter_squares.py 注意 15.2.9…

C# Winform教程(二):基础窗口程序

1、介绍 winform应用程序是一种智能客户端技术&#xff0c;我们可以使用winform应用程序帮助我们获得信息或者传输信息等。 2、常用属性 Name&#xff1a;在后台要获得前台的控件对象&#xff0c;需要使用Name属性。 Visible&#xff1a;指示一个控件是否可见、 Enable&…

超声系统前端理论与模拟仿真-续

作者&#xff1a;蒋志强 本人同意他人对我的文章引用&#xff0c;但请在引用时注明出处&#xff0c;谢谢&#xff0e;作者&#xff1a;蒋志强 前言 近期整理了一下彩超前端及波束合成相关的内容&#xff0c;很早以前已经有过一次&#xff0c;这次把其它的内容总结一下&#xf…

前端canvas项目实战——简历制作网站(一)——左侧工具栏

目录 前言一、效果展示二、实现步骤1. 拆分旧代码&#xff0c;优化项目结构2. 左侧工具栏3. 组合代码 三、Show u the code后记 前言 在fabric基础系列博文中&#xff0c;我们通过代码向画布canvas中添加矩形、圆形等对象。对于用户&#xff0c;我们不能指望他们可以理解代码&…

改变命运第一法

不与事争&#xff0c;你争不过因果&#xff1b;不与人争&#xff0c;会伤了感情&#xff1b;不与己争&#xff0c;会让人心累。平静淡泊、守望平和&#xff0c;不指责&#xff0c;不抱怨&#xff0c;不计较&#xff0c;永远做个善良清澈的自己&#xff0c;以善为本&#xff0c;…

Linux OpenEuler(欧拉系统)无公网ip实现SSH远程连接

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

【MySQL】一文看懂MySQL所有常见问题

MySQL作为一款开源关系型数据库&#xff0c;如今绝对是占据关系型数据库的主导地位&#xff0c;不仅是面试中的常客&#xff0c;也是日常工作中最主要接触的数据库。因此&#xff0c;无论是背面试八股&#xff0c;还是工作使用&#xff0c;都是一定要深度掌握的一个知识点。今天…

云上安全责任共担模型

对于传统自建物理服务器模式&#xff0c;用户需要承担所有的安全责任&#xff0c;负责从物理基础设施到上层应用的所有层面的安全体系构建。 云服务器的安全责任确实与物理服务器不同&#xff0c;云上的安全性是一种责任共担模式&#xff0c;其中云服务器ECS的安全责任需要你&…

算法通关村第十关—归并排序(黄金)

归并排序 一、归并排序原理 归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干个比较小的数组&#xff0c;分成几个比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分就是将问题分(divide)成一些小的问题分…

阶段性复习(二)

阶段性复习第二弹&#xff01; 一.操作符 继上期复习了一部分&#xff0c;我们继续复习操作符&#xff0c;今天着重复习双目操作符 有一类题&#xff0c;通过结果分析反推求过程中的表达式 从这道题可以看出&#xff0c;t是4的时候&#xff0c;s要是2&#xff0c;所以a&…

飞天使-k8s知识点7-kubernetes升级

文章目录 验证新版本有没有问题需要安装的版本微微 1.20.6.0kubeadm upgrade plan 验证新版本有没有问题 查看可用版本的包 现有的状态 查看版本 yum list kubeadm --showduplicates |grep 1.20 yum list kubelet --showduplicates |grep 1.20 yum list kubectl --showduplic…

云渲染UE4像素流送搭建(winows、ubuntu单实例与多实例像素流送)

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

推荐3款高效又免费的MP4转MP3格式转换工具

在日常生活和工作中&#xff0c;我们经常会遇到需要将MP4视频文件转换成MP3音频文件的情况&#xff0c;以便在其他设备上播放或享受音频内容。如果你正在寻找一款高效又免费的MP4转MP3格式转换工具&#xff0c;那么你来对地方了&#xff01;本文将为你推荐3款最佳工具&#xff…

STM32使用printf重定向到USART

配置你想要重映射的串口&#xff0c;这里用串口1举例子&#xff0c;你完全可以定义成其他串口。 波特率和位数格式完全按照需要定义&#xff0c;这里不要开启dma和中断。 这里建议使用单独生成.c和.h&#xff0c;当然你不生成也完全可以。 /* USER CODE BEGIN 0 */ int __io_p…

重装系统后桌面图标没有了,“此电脑”怎么添加?

重装电脑系统对于使用电脑的用户来说是一种很常见的操作。但是有时在重装系统之后&#xff0c;我们会发现电脑桌面图标不见了&#xff0c;那么这时该怎么办呢&#xff1f;“此电脑”该怎么添加呢&#xff1f; 解决方法&#xff1a; 1.在桌面空白处单击鼠标右键&#xff0c;选择…

九州金榜|家庭教育中注意孩子早起抑郁症征兆

在现代社会&#xff0c;心理健康问题越来越受到关注和重视。尤其是青少年&#xff0c;由于学业、人际关系等因素&#xff0c;可能会面临抑郁症的困扰。然而&#xff0c;很多家长对孩子的心理状况缺乏了解&#xff0c;未能及时发现他们心中的烦恼。以下是一些关于抑郁症早期征兆…

anaconda prompt进入虚拟环境 打开spyder

目录 1.查看有多少虚拟环境 2.conda create 指令创建新的虚拟环境 3.进入虚拟环境 4.spyder进入虚拟环境 5.退出虚拟环境 6.删除虚拟环境 1.查看有多少虚拟环境 打开anaconda prompt&#xff0c;输入 conda env list 2.conda create 指令创建新的虚拟环境 conda cre…

免费高清无水印视频素材在哪里下?

剪辑是一门创意工作&#xff0c;但很多初学者常常感到困惑&#xff0c;原因并不是因为他们不懂剪辑&#xff0c;而是因为他们不知道从哪里找到合适的素材。今天&#xff0c;我们将为大家盘点一些超全的剪辑素材资源&#xff0c;包括视频素材、音乐素材和图片素材等&#xff0c;…

Vue axios 拦截器

正常情况下打开浏览器前端页面向后端发起请求使用的是axios&#xff0c;无论是原生的axios还是自己封装的axios都看成是axios。发起请求之后后端去数据库里面拿数据&#xff0c;然后返回给前端。 发起请求的地方是axios&#xff0c;并且你能够封装这个axios&#xff0c;那么你…

R语言的极值统计学及其在相关领域中的实践技术应用

受到气候变化、温室效应以及人类活动等因素的影响&#xff0c;自然界中极端高温、极端环境污染、大洪水和大暴雨等现象的发生日益频繁&#xff1b;在人类社会中&#xff0c;股市崩溃、金融危机等极端情况也时有发生&#xff1b;今年的新冠疫情就是非常典型的极端现象。研究此类…