12月25日作业

串口发送控制命令,实现一些外设LED 风扇

uart4.c

#include "uart4.h"

void uart4_config()
{
  //1.使能GPIOB\GPIOG\UART4外设时钟
  RCC->MP_AHB4ENSETR |= (0x1 << 1);
  RCC->MP_AHB4ENSETR |= (0x1 << 6);
  RCC->MP_APB1ENSETR |= (0x1 << 16);

  
//===============================================
  //led时钟使能
  RCC->MP_AHB4ENSETR |= (0x3 << 4);
  //设置PE10输出
  GPIOE->MODER &= (~(0x3<<20));
  GPIOE->MODER |= (0x1<<20);
  //设置PE10为推晚输出
  GPIOE->OTYPER &= (~(0x1<<10));
  //PE10为低速输出 
  GPIOE->OSPEEDR &= (~(0x1<<10));
  //设置无上拉下拉
  GPIOE->PUPDR &= (~(0x3<<20));
//===============================================
  //设置PE9输出
  GPIOE->MODER &= (~(0x3<<18));
  GPIOE->MODER |= (0x1<<18);
  //设置PE10为推晚输出
  GPIOE->OTYPER &= (~(0x1<<18));
  //PE9为低速输出 
  GPIOE->OSPEEDR &= (~(0x1<<18));
  //设置无上拉下拉
  GPIOE->PUPDR &= (~(0x3<<18));
//===============================================

  //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 |= (0x1<<11);
  
  //3.0串口禁用
  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.设置不分频
  USART4->PRESC &= (~0xf);
  //9.设置波特率为115200
  USART4->BRR = 0x22B;
  //10.使能发送器
  USART4->CR1 |= (0x1<<3);
  //11.使能接收器
  USART4->CR1 |= (0x1<<2);
  //12.使能串口
  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';
    putchar('\n');

}

int strcmp(char *src,char *dst)  //指令比较
{
  while(*src != '\0' && *dst != '\0')
  {
    if(*src != *dst)
    {
      return *src - *dst;
    }
    src++;
    dst++;
  }
  if(*src == *dst)
  {
    return 0;
  }
  else if(*src == '\0')
  {
    return *dst;
  }
  else if(*dst == '\0')
  {
    return *src;
  }

}

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();
void puts(char *s);
void gets(char *s);
int strcmp(char *src,char *dst);

#endif

main.c

#include"uart4.h"

int main()
{
    //char a;
    char buf[128];
    uart4_config();
    while(1)
    {
        /*
        //接收一个字符数据
         a = getchar();
         //发送 接收的字符+1
         putchar(a+1); 
         putchar('\r');//回车,切换到一行开头
         putchar('\n');//切换到下一行   
         */
        puts("please enter order");
        gets(buf);
        if(strcmp(buf,"led_on") == 0)
        {
            GPIOE->ODR |= (0x1<<10);
        }
        else if(strcmp(buf,"led_off") == 0)
        {
            GPIOE->ODR &= (~(0x1<<10));
        }
        else if(strcmp(buf,"fen_on") == 0)
        {
            GPIOE->ODR |= (0x1<<9);
        }
        else if(strcmp(buf,"fen_off") == 0)
        {
            GPIOE->ODR &= (~(0x1<<9));
        }
        else
        {
            puts("puts error\n\r");
        }
        //puts(buf);  
    }
}

效果演示

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

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

相关文章

深入剖析LinkedList:揭秘底层原理

文章目录 一、 概述LinkedList1.1 LinkedList简介1.2 LinkedList的优点和缺点 二、 LinkedList数据结构分析2.1 Node节点结构体解析2.2 LinkedList实现了双向链表的原因2.3 LinkedList如何实现了链表的基本操作&#xff08;增删改查&#xff09;2.4 LinkedList的遍历方式 三、 …

静态HTTP的未来:探讨新技术趋势

在Web的世界里&#xff0c;静态HTTP一直是个不可或缺的角色。它就像一个尽职尽责的邮递员&#xff0c;确保数据安全、准确地送达目的地。但随着时代的发展&#xff0c;邮递员也需要跟上潮流&#xff0c;不断学习和进步。那么&#xff0c;静态HTTP的未来会是怎样的呢&#xff1f…

CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

从流星雨启程:Python和Pygame下载与安装全过程

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

C++的面向对象学习(6):运算符的重载

文章目录 前言&#xff1a;什么是运算符重载&#xff1f;针对自定义的类与对象类型。一、加号的运算符重载1.引入背景2.所以运算符重载的作用&#xff1a;3.实现对象间的相加代码&#xff1a;号运算符重载①在类中实现加号运算符重载②设计全局函数实现加号运算符重载③改写函数…

基于QListWidget的多段曲线展示器

目录 1 开发背景 2 创建程序 3 更改main window函数 4 测试构造函数 5 文件打开函数 6 拖放的实现 1 开发背景 由于视图控件的拖放逻辑比较难&#xff0c;需要同时子类化视图和模型&#xff0c;那么对于小数据而言&#xff0c;不如使用便捷类。因此&#xff0c;决定对多…

JavaOOP篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、什么是成员内部类二、Static Nested Class 和 Inner Class的不同三、什么时候用assert四、Java有没有goto前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…

探索音乐创作的新境界——PreSonus Studio One Pro 6

音乐是人类情感的表达方式之一&#xff0c;而音乐制作编曲软件则是让人们将创意转化为音乐作品的重要工具之一。在众多软件中&#xff0c;PreSonus Studio One Pro 6凭借其强大的功能和出色的用户体验&#xff0c;成为了许多音乐制作人的首选。 首先&#xff0c;PreSonus Stud…

App应用如何在应用市场获得更多下载量?

App的转化率至关重要&#xff0c;App如何获得更多用户&#xff0c;提高应用的下载量&#xff1f; 据 Apple 称&#xff0c;每周有 6.5亿访问者访问应用商店&#xff0c;77%的应用下载来自 iOS 应用商店的自然搜索。随着 Apple 默认关闭了IDFA&#xff0c;自然搜索比以往任何时…

git之UGit可视化工具使用

一、下载安装UGit 链接&#xff1a;https://pan.baidu.com/s/1KGJvWkFL91neI6vAxjGAag?pwdsyq1 提取码&#xff1a;syq1 二 、使用SSH进行远程仓库连接 1.生成SSH密钥 由于我们的本地 git仓库和 gitee仓库之间的传输是通过SSH加密的&#xff0c;所以我们需要配置SSH公钥。才…

结合教学经验谈计量经济学与Stata软件的学习

1.经济金融专业学生计量学习之痛 教学实践中&#xff0c;很多学生跟我抱怨计量经济学难学的问题&#xff0c;也有很多研0的同学感觉本科阶段没学好&#xff0c;或者跨专业考研的同学&#xff0c;在知道了计量经济学的重要性之后&#xff0c;对于经济金融领域的“无计量、不科研…

Kind创建k8s - JAVA操作控制

kind 简介kind 架构安装 Kind (必备工具)docker官网kubectl官网kind官网校验安装结果 关于kind 命令 安装一个集群查看当前 Kubernetes 集群中的节点信息。查看当前命名空间下中的Pod&#xff08;容器实例&#xff09;的信息。使用 kind create cluster 安装&#xff0c;关于安…

智能优化算法应用:基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.浣熊算法4.实验参数设定5.算法结果6.参考文献7.MA…

中后缀表达式

一、利用后缀表达式进行计算 1&#xff09;解题思路 如果当前字符串是操作数&#xff0c;就将该操作数入栈&#xff1b;如果当前字符串是操作符&#xff0c;就取栈顶的两个操作数进行运算&#xff08;注意&#xff1a;第一个出栈的数为计算时的右操作数&#xff1b;第二个出栈…

继电器负载的使用方法有哪些?

继电器是通过电磁效应或电热效应实现电路的自动开关。继电器负载是指继电器所控制的负载&#xff0c;通常包括电机、灯泡、加热器等。正确使用继电器负载可以确保设备的正常运行和安全。以下是一些使用继电器负载的方法&#xff1a; 选择合适的继电器&#xff1a;根据负载的类型…

基于java+控件台+mysql的学生信息管理系统(含演示视频)

基于java控件台mysql的学生信息管理系统_含演示视频 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库4.登录系统5.新增学生6.查询学生7.修改学生8.删除学生9.退出系统 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java SE项目&#xff08;控制…

大数据开发之Sqoop详细介绍

测试环境 CDH 6.3.1 Sqoop 1.4.7 一.Sqoop概述 Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下&#xff0c;轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&…

Java经典框架之Spring MVC

Spring MVC Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring MVC 入门案例 2. 基…

Github 2023-12-23 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目6C项目2C项目1Jupyter Notebook项目1HTML项目1Go项目1非开发语言项目1 免费API集体清单 创建周期…

【中小型企业网络实战案例 二】配置网络互连互通

​【中小型企业网络实战案例 一】规划、需求和基本配置-CSDN博客 热门IT技术视频教程&#xff1a;https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 配置接入层交换机 1.以接入交换机ACC1为例&#xff0c;创建ACC1的业务VLAN 10和20。 <…