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

main.c

#include "uart4.h"int main(){char a;char buf[128];uart4_config();while (1){/* //接收一个字符数据a=getchar();//发送接收的字符+1putchar(a+1);putchar('\r');putchar('\n');     */gets(buf); // 读取字符串//puts(buf); // 输出字符串if(strcmp(buf,"led1_on")==0)led1_on();if(strcmp(buf,"led1_off")==0)led1_off();if(strcmp(buf,"led2_on")==0)led2_on();if(strcmp(buf,"led2_off")==0)led2_off();if(strcmp(buf,"led3_on")==0)led3_on();if(strcmp(buf,"led3_off")==0)led3_off();if(strcmp(buf,"fen_on")==0)fen_on();if(strcmp(buf,"fen_off")==0)fen_off();if(strcmp(buf,"md_on")==0)md_on();if(strcmp(buf,"md_off")==0)md_off();if(strcmp(buf,"fmq_on")==0)fmq_on();if(strcmp(buf,"fmq_off")==0)fmq_off();}}

uart4.c

#include"uart4.h"void uart4_config()
{//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR |= (0x1<<1);//gpiobRCC->MP_AHB4ENSETR |= (0x1<<6);//gpiogRCC->MP_APB1ENSETR |= (0x1<<16);//uart4//2.设置PB2\PG11用于UART4的管脚复用//设置PG11GPIOG->moder &= (~(0x3<<22));GPIOG->moder |= (0x2<<22);GPIOG->afrh &= (~(0xf<<12));GPIOG->afrh |= (0x6<<12);//设置PB2GPIOB->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.设置波特率为115200USART4->BRR=0X22B;//9.使能发送器USART4->CR1 |= (0x1<<3);//10.使能接收器USART4->CR1 |= (0x1<<2);//11.使能串口USART4->CR1 |= (0x1);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));//LED2GPIOF->moder &=(~(0X3<<20));//设置Pf10输出GPIOF->moder |= (0X1<<20);//设置Pf10为推挽输出GPIOF->otyper &=(~(0x1<<10));//Pf10为低速输出GPIOF->ospeedr &= (~(0x3<<20));//设置无上拉下拉GPIOF->pupdr &= (~(0x3<<20));//LED3GPIOE->moder&=(~(0X3<<16));//设置PE8输出GPIOE->moder |= (0X1<<16);//设置PE8为推挽输出GPIOE->otyper &=(~(0x1<<8));//PE8为低速输出GPIOE->ospeedr &= (~(0x3<16));//设置无上拉下拉GPIOE->pupdr &= (~(0x3<<16));//风扇GPIOE->moder &=(~(0X3<<18));//设置PE9输出GPIOE->moder |= (0X1<<18);//设置PE9为推挽输出GPIOE->otyper &=(~(0x1<<9));//PE9为低速输出GPIOE->ospeedr &= (~(0x3<18));//设置无上拉下拉GPIOE->pupdr &= (~(0x3<<18));//蜂鸣器GPIOB->moder &=(~(0X3<<12));//设置PB6输出GPIOB->moder |= (0X1<<12);//设置PE9为推挽输出GPIOB->otyper &=(~(0x1<<6));//PE9为低速输出GPIOB->ospeedr &= (~(0x3<12));//设置无上拉下拉GPIOB->pupdr &= (~(0x3<<12));//马达GPIOF->moder &=(~(0X3<<12));//设置PF6输出GPIOF->moder |= (0X1<<12);//设置PE9为推挽输出GPIOF->otyper &=(~(0x1<<6));//PE9为低速输出GPIOF->ospeedr &= (~(0x3<12));//设置无上拉下拉GPIOF->pupdr &= (~(0x3<<12));
}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 *a,char *b)
{while(*a!='\0'){if(*a != *b){return -1;}a++;b++;}return 0;
}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));
}void fen_on()
{GPIOE->odr |= (0x1<<9);
}
void fen_off()
{GPIOE->odr &= (~(0x1<<9));}void md_on()
{GPIOF->odr |= (0x1<<6);
}
void md_off()
{GPIOF->odr &= (~(0x1<<6));
}void fmq_on()
{GPIOB->odr |= (0x1<<6);
}
void fmq_off()
{GPIOF->odr &= (~(0x1<<6));
}

uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include"stm32mp1xx_rcc.h"
//#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_uart.h"typedef struct{unsigned int moder;unsigned int otyper;unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr;unsigned int bsrr;unsigned int afrh;unsigned int afrl;
}gpio_t;
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
#define GPIOG ((gpio_t*)0x50008000)
#define GPIOB ((gpio_t*)0x50003000)
#define RCC_GPIO (*(unsigned int*)0x50000a28)void all_led_init();
void led1_on();
void led1_off();
void led2_on();
void led2_off();
void led3_on();
void led3_off();
void fen_on();
void fen_off();
void md_on();
void md_off();
void fmq_on();
void fmq_off();void uart4_config();
void putchar(char a);
char getchar();
void gets(char *s);
void puts(char *s);
int strcmp(char *a,char *b);
#endif

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

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

相关文章

linux无法访问共享目录,ls hgfs失败

刚在新买的华为电脑上安装ubuntu20&#xff0c;共享文件出现各种问题&#xff1a; dlubuntu:/mnt$ ls ls: cannot access hgfs: Permission denied hgfs 解决方法&#xff1a; 1.首先输入vmware-hgfsclient&#xff0c;看看是否共享文件夹已经建立&#xff0c;没有的话去参考…

在Vue3中使用qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现二、toDataURL()方法三、toCanvas()方法四、create()方法五、QRCodeRenderersOptions()方法 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode…

支付平台在选择服务器租用时要注意什么?

如果要建设一个支付平台的话要进行服务器租用&#xff0c;一旦涉及到钱的方面就必须要顾虑到多方面&#xff0c;这样才能保证安全性&#xff0c;今天小编就给大家讲一讲要注意什么呢&#xff1f; 1、带宽:带宽是业务稳定性的直接因素&#xff0c;只有带宽充足&#xff0c;这样…

kafka发送大消息

1 kafka消息压缩 kafka关于消息压缩的定义&#xff08;来源于官网&#xff09;&#xff1a; 此为 Kafka 中端到端的块压缩功能。如果启用&#xff0c;数据将由 producer 压缩&#xff0c;以压缩格式写入服务器&#xff0c;并由 consumer 解压缩。压缩将提高 consumer 的吞吐量…

使用 pytest.ini 文件控制输出 log 日志

一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…

c# OpenCvSharp透视矫正六步实现透视矫正(八)

透视矫正,引用文档拍照扫描&#xff0c;相片矫正这块。 读取图像Cv2.ImRead();预处理&#xff08;灰度化&#xff0c;高斯滤波、边缘检测&#xff09;轮廓检测&#xff08;获取到最大轮廓&#xff09;获取最大面积轮廓的四个顶点标识最小矩形坐标透视矫正显示 完整代码 // 1、…

Linux系统安装及管理

目录 一、Linux应用程序基础 1.1应用程序与系统命令的关系 1.2典型应用程序的目录结构 1.3常见的软件包装类型 二、RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 2,1查看已安装的软件包格式 2.2查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂…

web前端项目-七彩夜空烟花【附源码】

web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML&#xff0c;代码简单&#xff0c;实现效果绚丽&#xff0c;且本项目代码直接运行即可实现&#xff0c;无需图片素材&#xff0c;接下来让我们一起实现一场美丽的烟花秀叭 运行效果&#xff1a;鼠标点击和移动可控制…

理解SpringMVC的工作流程

组件 前置控制器 DispatcherServlet。 映射控制器 HandlerMapping。 处理器 Controller。 模型和视图 ModelAndView。 视图解析器 ViewResolver。 工作流程 spring mvc 先将请求发送给 DispatcherServlet。 DispatcherServlet 查询一个或多个 HandlerMapping&#xff0c;找到…

vc 用MySQL Connector/C++

1 下载 MySQL :: Download Connector/C 2 vc配置 添加路径 2.1 右击项目 -> 属性 2.2 配置属性-> vc目录 -> 包含目录 -> 添加 D:\mysql-connector-c-8.2.0-winx64\include\jdbc 具体目录在mysql-connector-c的文件夹中搜索 mysql_driver.h文件 然后把这个文件…

jmeter-set up先登录获取token,再测试

一、何为setup 一种特殊类型的线程组&#xff0c;可用于执行预测试操作&#xff1b;简单来讲就是执行测试线程组前&#xff0c;先执行setup 作用 例如前面&#xff0c;我们说到的&#xff0c;压测之前只用JMeter调用业务接口造数或者通过JDBC操作数据库造数&#xff0c;可以放…

Spring中BeanFactoryPostProcessors的使用和原理

Spring中的BeanFactoryPostProcessor是在Spring容器实例化Bean之后&#xff0c;初始化之前执行的一个扩展机制。它允许开发者在Bean的实例化和初始化之前对BeanDefinition进行修改和处理&#xff0c;从而对Bean的创建过程进行干预和定制化。 BeanFactoryPostProcessor接口定义…

信息网络协议基础-接入网技术

文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…

网络安全法规和模型

基础 ISO信息安全&#xff1a;为数据处理系统建立和采取技术、管理的安全保护&#xff0c;保护计算机硬件、软件、数据不因偶然的或恶意的原因而受到破坏、更改、泄露 信息安全属性&#xff1a; CIA三元组&#xff1a;保密性、完整性、可用性 其他属性&#xff1a;真实性、不…

sql查询分数排名

编写一个 sql 查询来实现分数排名。 如果两个分数相同&#xff0c;则两个分数排名&#xff08;rank&#xff09;相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔”。 ----------- | id | score | ---------…

前端---表格标签

1. 表格的结构 表格是由行和列组成&#xff0c;好比一个excel文件 2. 表格标签 <table>标签&#xff1a;表示一个表格 <tr>标签&#xff1a;表示表格中的一行 <td>标签&#xff1a;表示表格中的列<th>标签&#xff1a;表示表格中的表头 示例代码: &l…

鸿蒙开发中的坑(持续更新……)

最近在使用鸿蒙开发时&#xff0c;碰到了一些坑&#xff0c;特做记录&#xff0c;如&#xff1a;鸿蒙的preview不能预览&#xff0c;轮播图组件Swiper使用时的问题&#xff0c;console.log() 打印的内容 一、鸿蒙的preview不能预览 首先&#xff0c;只有 ets文件才能预览。 其…

Spring系列学习二、Spring框架的环境配置

Spring框架的环境配置 一、Java环境配置二、 Spring框架的安装与配置三、Maven与Gradle环境的配置四、IDE环境配置&#xff08;Eclipse与IntelliJ IDEA&#xff09;五、结语 一、Java环境配置 所有编程旅程总是得从基础开始&#xff0c;如同乐高积木大作的基座&#xff0c;首先…

嵌入式——RTC闹钟Alarm

开发流程 配置RTC时钟设置RTC闹钟配置RTC闹钟中断实现中断函数RTC闹钟初始化 // 闹钟外部中断 exti_flag_clear(EXTI_17); exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);// 重置闹钟 rtc_alarm_disable(RTC_ALARM0);rtc_alarm_struct ras; ras.alarm_mask = RTC_ALARM…

408数据结构错题知识点拾遗

408相关&#xff1a; 408数据结构错题知识点拾遗 408计算机网络错题知识点拾遗 对于数据结构的学习&#xff0c;个人认为要对概念性的东西进行理解&#xff0c;特别是树的性质、图的相关性质和考察的相应算法。应用题强化的话&#xff0c;对于每一章节尾的应用小节&#xff0c…