2023年12月25日:串口发出控制命令

代码

uart4.c

#include "uart4.h"

void uart4_config()
{
    //*****************************************
    //使能GPIOB|GPIOG|UART4外设时钟
    RCC->MP_AHB4ENSETR |=(0x1<<6);
    RCC->MP_AHB4ENSETR |=(0x1<<1);
    RCC->MP_APB1ENSETR |=(0x1<<16);
    RCC->MP_AHB4ENSETR |=(0x3<<4);
    
    //*****************************************
    //设置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);

    //*****************************************
    //设置数据位宽为8位
    USART4->CR1 &=(~(0x1<<28));
    USART4->CR1 &=(~(0x1<<12));

    //*****************************************
    //设置无奇偶校验位
    USART4->CR1 &=(~(0x1<<10));

    //*****************************************
    //设置16倍过采样
    USART4->CR1 &=(~(0x1<<15));

    //*****************************************
    //设置1位的停止位
    USART4->CR2 &=(~(0x1<<12));

    //*****************************************
    //设置波特率为115200
    USART4->BRR =0x22B;

    //*****************************************
    //使能发送器
    USART4->CR1 |=(0x1<<3);

    //*****************************************
    //使能接收器
    USART4->CR1 |=(0x1<<2);

    //*****************************************
    //使能串口
    USART4->CR1 |=0x1;

    //*****************************************
    //LED1的操作
   
    GPIOE->MODER &=(~(0x3<<20));//设置PE10输出
    GPIOE->MODER |=(0x1<<20);

    GPIOE->OTYPER &=(~(0x1<<10));//设置PE10为推挽输出
    GPIOE->OSPEEDR &=(~(0x3<<20));//设置低速输出
    GPIOE->PUPDR &=(~(0x3<<20));//设置无上拉下拉

    //*****************************************
    //LED2的操作
    GPIOF->MODER &=(~(0x3<<20));//设置PF10输出
    GPIOF->MODER |=(0x1<<20);

    GPIOF->OTYPER &=(~(0x1<<10));//设置PF10为推挽输出
    GPIOF->OSPEEDR &=(~(0x3<<20));//设置低速输出
    GPIOF->PUPDR &=(~(0x3<<20));//设置无上拉下拉

    //*****************************************
    //LED3的操作
    GPIOE->MODER &=(~(0x3<<16));//设置PE10输出
    GPIOE->MODER |=(0x1<<16);

    GPIOE->OTYPER &=(~(0x1<<8));//设置PE10为推挽输出
    GPIOE->OSPEEDR &=(~(0x3<<16));//设置低速输出
    GPIOE->PUPDR &=(~(0x3<<16));//设置无上拉下拉

}

//发送一个单字符
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 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++;
    }
    return 0;
}

main.c

//#include "gpio.h"

#include "uart4.h"

int main()

{

//	char a;

	char src[128];

	uart4_config();



	while(1)

	{

/*		

		//接受一个字符数据

		a=getchar();

		//发送接收到的字符+1

		putchar(a);

		putchar('\r');//回车,切换到下一行

		putchar('\n');//换行

*/		

		gets(src);

		puts(src);

		if(strcmp(src,"led1_on")==0)

		{

			GPIOE->ODR |=(0x1<<10);



		}

		else if(strcmp(src,"led1_off")==0)

		{

			GPIOE->ODR &=(~(0x1<<10));

		}

		else if(strcmp(src,"led2_on")==0)

		{

			GPIOF->ODR |=(0x1<<10);



		}

		else if(strcmp(src,"led2_off")==0)

		{

			GPIOF->ODR &=(~(0x1<<10));

		}

		else if(strcmp(src,"led3_on")==0)

		{

			GPIOE->ODR |=(0x1<<8);



		}

		else if(strcmp(src,"led3_off")==0)

		{

			GPIOE->ODR &=(~(0x1<<8));

		}



	}



	return 0;

}

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

#endif

效果图

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

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

相关文章

云计算:现代技术的基本要素

众所周知&#xff0c;在儿童教育的早期阶段&#xff0c;幼儿园都会传授塑造未来行为的一些基本准则。 今天&#xff0c;我们可以以类似的方式思考云计算&#xff1a;它已成为现代技术架构中的基本元素。云现在在数字交互、安全和基础设施开发中发挥着关键作用。云不仅仅是另一…

小狐狸GPT付费2.4.9 去除授权弹窗版

后台安装步骤&#xff1a; 1、在宝塔新建个站点&#xff0c;php版本使用7.2 、 7.3 或 7.4&#xff0c;把压缩包上传到站点根目录&#xff0c;运行目录设置为/public 2、导入数据库文件&#xff0c;数据库文件是 /db.sql 3、修改数据库连接配置&#xff0c;配置文件是/.env 4、…

LED驱动电源

LED驱动电源 常用电子元器件 TB62726AFG LED SOP-24 文章目录 LED驱动电源前言一、LED驱动电源是什么二、TB62726AFG LED SOP-24总结 前言 LED驱动电源可以根据应用需求采用不同的输入和输出电源类型、电源转换拓扑、调光方式等。常见的LED驱动电源类型包括恒流驱动电源、恒…

3分钟了解安全数据交换系统有什么用!

企业为了保护核心数据安全&#xff0c;都会采取一些措施&#xff0c;比如做网络隔离划分&#xff0c;分成了不同的安全级别网络&#xff0c;或者安全域&#xff0c;接下来就是需要建设跨网络、跨安全域的安全数据交换系统&#xff0c;将安全保障与数据交换功能有机整合在一起&a…

uni-app封装表格组件

组件代码&#xff1a; <template><view><uni-table class"tableBox" border stripe emptyText"暂无更多数据" ><!-- 表头行 --><uni-tr class"tableTr"><uni-th align"center" v-for"item in …

LNPMariadb数据库分离|web服务器集群

LNP&Mariadb数据库分离&#xff5c;web服务器集群 网站架构演变单机版LNMP独立数据库服务器web服务器集群与Session保持 LNP与数据库分离1. 准备一台独立的服务器&#xff0c;安装数据库软件包2. 将之前的LNMP网站中的数据库迁移到新的数据库服务器3. 修改wordpress网站配置…

共享和独享的区别是什么?有必要用独享IP吗?

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

【技术分享】单网口远程透传网关快速实现昆仑通态触摸屏程序远程上下载及监控

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接触摸屏一台昆仑通态触摸屏及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff0…

String 的特点是什么?它有哪些重要的方法?

几乎所有的 Java 面试都是以 String 开始的&#xff0c;如果第一个问题没有回答好&#xff0c;则会给面试官留下非常不好的第一印象&#xff0c;而糟糕的第一印象则会直接影响到自己的面试结果&#xff0c;就好像刚破壳的小鹅一样&#xff0c;会把第一眼看到的动物当成自己的母…

走进数字金融峰会,为金融科技数字化赋能

12月20—21日&#xff0c;FSIDigital数字金融峰会在上海圆满召开。本次峰会包含InsurDigital数字保险峰会和B&SDigital数字银行与证券峰会2场平行峰会&#xff1b;吸引了近600位来自保险、银行、证券以及金融科技等行业的领导者和专家齐聚一堂&#xff0c;共同探讨金融业数…

数据库01_增删改查

1、什么是数据&#xff1f;什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库&#xff1a;存放数据的仓库&#xff0c;数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

docker-compose部署kafka

docker-compose.yml配置 version: "3" services:kafka:image: bitnami/kafka:latestports:- 7050:7050environment:- KAFKA_ENABLE_KRAFTyes- KAFKA_CFG_PROCESS_ROLESbroker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER- KAFKA_CFG_LISTENERSPLAIN…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

【教程】从gitee或者github,下载单个文件或文件夹命令

1.打开git 2.初始化 git init 3.设置允许下载子目录 &#xff08;不需要修改任何&#xff0c;只要原样复制&#xff0c;需要按照个人状况修改的话我会标注&#xff09; git config core.sparseCheckout true 4. 选择要下载的单个文件夹的路径 这里单引号内部需要修改&…

Shell 脚本基础

Shell脚本 脚本以#!/bin/bash开头 执行方式 直接使用文件名执行&#xff1a;文件需要执行权限 以bash xxx.sh来执行, 本质上是bash解析器去执行, 文件作为一个输入, 因此可以不需要执行权限 变量 系统变量 自定义变量 定义变量 # 定义一个变量username, 注意不能有多余…

一体机定制_工控触控一体机安卓主板方案

工控一体机是一种集成化的硬件方案&#xff0c;采用了联发科MT8768八核芯片和12nm制程工艺。该芯片拥有2.0GHz的主频和IMG PowerVR GE8320图形处理GPU&#xff0c;具备强大的视频处理能力&#xff0c;并且兼容大部分的视频格式和解码能力。工控一体机搭载了Android 9.0操作系统…

学Java的第二天

一、常量 1.值不可以变化的量。 2. 分类&#xff1a; 字符串常量 用双引号括起来的多个字符&#xff0c;可以包含 0、1 或多个&#xff0c;例如 "a" 、 "abc" 、 " 中国 " 整数常量&#xff0c;例如&#xff1a; -10 、 0 、 88 小数常量&…

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法

目录 1. 概念2. getFields()方法2. getDeclaredFields()方法4. 总结 1. 概念 反射是Java中一种强大的机制&#xff0c;允许在运行时获取、检查和操作类、方法、字段等信息&#xff0c;而不需要在编译时知道这些信息。 其中字段&#xff08;Field&#xff09;在Java中是类中用…

【精选】vulnhub CTF5 NanoCMS漏洞 (青铜门笔记)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

微信小程序使用canvas制作海报并保存到本地相册(超级详细)

案例图 分析案例图都有哪些元素 1.渐变背景 2.圆形头像 3.文字 4.文字超出换行 5.图片居中 6.文字居中 7.单位适配 8.弹窗保存图片。因为一个个绘制图形太麻烦所以这里都采用了方法封装。 canvas api介绍 最后有全部代码&#xff0c;复制即用。 data数据 data() {return {myO…