12.11

1.q,w,e亮led1,2,3;

    a,s,d灭led1,2,3;

main.c

#include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}}int main(){//1.串口的初始化uart4_init();//LED初始化all_led_init();char a;//现象是发送一个a串口工具打印一个bwhile(1){//2.从串口读取一个字符a=mygetchar();//3.将读取到的字符+1发送回去myputchar(a);switch (a){case 'q': led1_on();break;case 'w': led2_on();break;case 'e': led3_on();break;case 'a': led1_off();break;case 's': led2_off();break;case 'd': led3_off(); break;   }}return 0;}

led.h

#ifndef __LED_H__
#define __LED_H__typedef struct
{unsigned int moder;unsigned int otyper;unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr;unsigned int bsrr;
} gpio_t1;#define GPIOE1 ((gpio_t1 *)0X50006000)
#define GPIOF1 ((gpio_t1 *)0X50007000)
#define RCC_MP_AHB4ENSETR (*(unsigned int *)0X50000a28)
void all_led_init();
void led1_on();
void led2_on();
void led3_on();
void led1_off();
void led2_off();
void led3_off();#endif

uar1.h

#ifndef __UART_H__
#define __UART_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
void uart4_init();
void myputchar(char i);
char mygetchar();
#endif

led.c

#include "led.h"
void all_led_init()
{// 1.使能外设时钟RCC_MP_AHB4ENSETR |= (0x3 << 4);// 2.设置PF10 PE10 PE8为输出输出GPIOE1->moder &= (~(0x3 << 20));GPIOE1->moder |= (0x1 << 20);GPIOF1->moder &= (~(0x3 << 20));GPIOF1->moder |= (0x1 << 20);GPIOE1->moder &= (~(0x3 << 16));GPIOE1->moder |= (0x1 << 16);// 3.设置推挽输出GPIOE1->otyper &= (~(0x1 << 10));GPIOF1->otyper &= (~(0x1 << 10));GPIOE1->otyper &= (~(0x1 << 8));// 4.设置输出速度为低速GPIOE1->ospeedr &= (~(0x3 << 20));GPIOF1->ospeedr &= (~(0x3 << 20));GPIOE1->ospeedr &= (~(0x3 << 16));// 5.设置无上拉下拉GPIOE1->pupdr &= (~(0x3 << 20));GPIOF1->pupdr &= (~(0x3 << 20));GPIOE1->pupdr &= (~(0x3 << 16));
}void led1_on()
{GPIOE1->odr |= (0x1 << 10);
}
void led2_on()
{GPIOF1->odr |= (0x1 << 10);
}
void led3_on()
{GPIOE1->odr |= (0x1 << 8);
}void led1_off()
{GPIOE1->odr &= (~(0x1 << 10));
}
void led2_off()
{GPIOF1->odr &= (~(0x1 << 10));
}
void led3_off()
{GPIOE1->odr &= (~(0x1 << 8));
}

uar1.c

#include"uar1.h"//串口数据初始化
void uart4_init()
{//设置UART4的RCc时钟使能//RCC_MP_APB1ENSETR[16]->1RCC->MP_APB1ENSETR |= (0x1<<16);//设置GPIOB和GPIOG的时钟使能//RCC_MP_AHB4ENSETR[6]->1//RCC_MP_AHB4ENSETR[1]->1RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0X1<<6);//设置PG11和PB2功能复用为UART4功能//PG11//GPIOG_MODER[23:22]->10GPIOG->MODER &= (~(0X3<<22));GPIOG->MODER |= (0X2<<22);//GPIOG_AFRH[15:12]->0110    GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//PB2//GPIOB_MODER[5:4]->10//GPIOB_AFRL[11:8]->1000GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0X2<<4);GPIOB->AFRL &= (~(0xF<<8));GPIOB->AFRL |= (0x8<<8);//禁用串口USART4->CR1 &=(~0x1);//设置数据8个数据位 CR1[28]->0  CR1[12]-》0USART4->CR1 &= (~(0X1<<28));USART4->CR1 &= (~(0X1<<12));//设置没有校验位CR1[10]->0USART4->CR1 &= (~(0X1<<10));//设置1个停止位CR2[13:12]->00USART4->CR2 &= (~(0x3<<12));//设置16倍采样 CR1[15]->0USART4->CR1 &= (~(0X1<<15));//设置波特率为115200 BRR=0X22BUSART4->BRR |= 0X22B;//设置1分频 PRESC[3:0]->0000USART4->PRESC &= (~(0XF));//使能发送器 CR1[3]->1USART4->CR1 |= (0X1<<3);//使能接收器 CR1[2]->1USART4->CR1 |= (0X1<<2);//使能串口 CR1[0]->1USART4->CR1 |= (0X1);
}
//封装函数发送一个字符数据
void myputchar(char c)
{//判断发送数据寄存器有没有数据,没有数据时可以发送while(!(USART4->ISR&(0X1<<7)));USART4->TDR=c;//将要发送的数据保存在发送寄存器中while(!(USART4->ISR&(0X1<<6)));//数据传输完成,函数结束
}
char mygetchar()
{char c;//判断是否有数据准备好while(!(USART4->ISR&(0X1<<5)));//数据传输完成,函数结束c=USART4->RDR;return c;}

2.字符串点亮

uar1.c

#include"uar1.h"
#include"led.h"
char buf[51]={0};
//串口数据初始化
void uart4_init()
{//设置UART4的RCc时钟使能//RCC_MP_APB1ENSETR[16]->1RCC->MP_APB1ENSETR |= (0x1<<16);//设置GPIOB和GPIOG的时钟使能//RCC_MP_AHB4ENSETR[6]->1//RCC_MP_AHB4ENSETR[1]->1RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0X1<<6);//设置PG11和PB2功能复用为UART4功能//PG11//GPIOG_MODER[23:22]->10GPIOG->MODER &= (~(0X3<<22));GPIOG->MODER |= (0X2<<22);//GPIOG_AFRH[15:12]->0110    GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//PB2//GPIOB_MODER[5:4]->10//GPIOB_AFRL[11:8]->1000GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0X2<<4);GPIOB->AFRL &= (~(0xF<<8));GPIOB->AFRL |= (0x8<<8);//禁用串口USART4->CR1 &=(~0x1);//设置数据8个数据位 CR1[28]->0  CR1[12]-》0USART4->CR1 &= (~(0X1<<28));USART4->CR1 &= (~(0X1<<12));//设置没有校验位CR1[10]->0USART4->CR1 &= (~(0X1<<10));//设置1个停止位CR2[13:12]->00USART4->CR2 &= (~(0x3<<12));//设置16倍采样 CR1[15]->0USART4->CR1 &= (~(0X1<<15));//设置波特率为115200 BRR=0X22BUSART4->BRR |= 0X22B;//设置1分频 PRESC[3:0]->0000USART4->PRESC &= (~(0XF));//使能发送器 CR1[3]->1USART4->CR1 |= (0X1<<3);//使能接收器 CR1[2]->1USART4->CR1 |= (0X1<<2);//使能串口 CR1[0]->1USART4->CR1 |= (0X1);
}
//封装函数发送一个字符数据
void myputchar(char c)
{//判断发送数据寄存器有没有数据,没有数据时可以发送while(!(USART4->ISR&(0X1<<7)));USART4->TDR=c;//将要发送的数据保存在发送寄存器中while(!(USART4->ISR&(0X1<<6)));//数据传输完成,函数结束
}
char mygetchar()
{char c;//判断是否有数据准备好while(!(USART4->ISR&(0X1<<5)));//数据传输完成,函数结束c=USART4->RDR;return c;}//输出一个字符串
void puts(char *s)
{while(*s){myputchar(*s);s++;}myputchar('\n');//切换到下一行myputchar('\r');//切换到一行的开头
}//读取一个字符串
char *gets()
{unsigned int i;for(i=0;i<50;i++){buf[i]=mygetchar();//接受字符串myputchar(buf[i]);//回显if(buf[i]=='\r')break;}buf[i]='\0';myputchar('\n');//换行return buf;
}
//字符串比较
int strcmp(char *str,char *dst)
{while(*str){if(*str != *dst){return 1;}   str++;dst++;          }return 0;
}
void deal(char*str)
{if(strcmp(str,"led1_on")==0){led1_on();}else if(strcmp(str,"led1_off")==0){led1_off();}else if(strcmp(str,"led2_on")==0){led2_on();}else if(strcmp(str,"led2_off")==0){led2_off();}else if(strcmp(str,"led3_on")==0){led3_on();}else if(strcmp(str,"led3_off")==0){led3_off();}
}

 main.c

#include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}}int main(){all_led_init();//1.串口的初始化uart4_init();char a;char *str;//现象是发送一个a串口工具打印一个bwhile(1){myputchar('\n');//切换到下一行myputchar('\r');//切换到一行的开头//2.从串口读取一个字符//a=mygetchar();//3.将读取到的字符+1发送回去//myputchar(a+1);str=gets();// puts(str);deal(str);}return 0;}

 

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

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

相关文章

「CocoaPods」Podfile文件模板

前言&#xff1a;在iOS项目中&#xff0c;通常会使用到CocoaPods作为一个第三方库的依赖管理工具&#xff0c;可以简化对组件的依赖、更新的过程&#xff0c;本文将介绍在iOS项目中多Target企业级项目的Podfile文件编写格式 一、podfile介绍 先简单介绍一下podfile文件&#…

基于mdadm创建与管理软raid

环境 VMware workstation 17pro CentOS Linux release 7.9.2009 (Core) ——内存8G&#xff0c;16core ——硬盘系统盘100G ——四块20G硬盘 注意事项 1、在没有操作系统的情况下&#xff0c;可以在装系统时将磁盘做软raid&#xff0c;然后使用软raid作为系统盘 2、在重构时&a…

虚幻商城 道具汇总

文章目录 载具Vehicle Variety Pack(车辆品种包)Vehicle Variety Pack Volume 2(车辆品种包第 2 卷)家具Free Furniture Pack(免费家具包)Old West - VOL 1 - Interior Furniture(旧西部 - 第1卷 - 家具包)Old West VOL.3 - Travel Supplies and Goods(旧西部 - 第3卷…

容器及容器调度(云)

在云计算中&#xff0c;容器是一种轻量级、可执行的软件包&#xff0c;它包含应用程序及其全部依赖项&#xff0c;包括库、二进制文件、配置文件等。容器与虚拟机不同&#xff0c;因为它们不需要包含完整的操作系统&#xff1b;相反&#xff0c;所有容器都共享主机操作系统的内…

SQL中的三值逻辑:TRUE、FALSE 和 UNKNOWN。

在SQL中&#xff0c;通常采用三值逻辑处理条件表达式的真值。这种逻辑是基于三种可能的真值状态&#xff1a;TRUE、FALSE 和 UNKNOWN。 TRUE&#xff08;真&#xff09;&#xff1a; 表示条件为真或成立。 FALSE&#xff08;假&#xff09;&#xff1a; 表示条件为假或不成立。…

7 Linux 内核移植

一、编译 ST 的 Linux 系统 1. 压缩源码 首先先下载 ST 官方源码&#xff0c;之前章节已经下载过了&#xff0c;直接输入以下命令&#xff1a; cd linux/atk-mpl/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/ 然…

【Python】np.hstack()和np.vstack函数详解和示例

本文通过函数原理和运行示例&#xff0c;对np.hstack()和np.vstack函数进行详解&#xff0c;以帮助大家理解和使用。 更多Numpy函数详解和示例&#xff0c;可参考 【Python】Numpy库近50个常用函数详解和示例&#xff0c;可作为工具手册使用 目录 np.hstack()函数解析运行示例…

EasyExcel使用模板导出复杂Excel

1&#xff09;添加easyexlce的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.0-beta1</version> </dependency>2&#xff09;添加excel模板文件 实现的效果&#xff1a;…

打包less

接HTML和css之后对less进行打包 1.在之前的文件夹里的src文件夹创建一个less文件 2.打开webpack——>中文文档——>Loader——>less—loader 3.复制下图代码到终端 4.复制下图内容到webpack.config.js脚本 5.在src里的js文件年引入less文件 6.在终端运行 npm run te…

助力工业生产质检,基于轻量级yolov5-seg开发构建工业场景下滚珠丝杠传动表面缺陷分割检测系统

AI赋能工业生产是一个强有力的方式&#xff0c;在我们之前的系列博文中也有很多相应的开发实践&#xff0c;感兴趣的胡都可以自行移步阅读&#xff0c;本文的核心思想就是想要基于轻量级的实例分割模型来开发构建工业场景下的滚珠丝杠传动表面缺陷分割检测系统&#xff0c;首先…

STM32-固件打包部署

STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件输出 工程上使用Keil开发STM32软件&#xff1b;在调试过程中&#xff0c;可直接编译下载&#xff1b;例如bootloader和APP&#xff0c;在调试时&#xff0c;可以直接下载2次&#xff1b;但是工程上&#xff0c;需要大…

力扣经典面试题——合并区间

合并区间 https://leetcode.cn/problems/merge-intervals/description/?envTypestudy-plan-v2&envIdtop-interview-150 这题思维量一般但比较考察API的使用。 1、数组的自定义排序 2、数组的初始化定义 3、Arrays转int 通过重写Comparator的compare方法来自定义排序规则…

nvm动态管理node.js

nvm 安装 nvm介绍 &#xff08;1&#xff09;nvm(Node.js version manager) 是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 &#xff08;2&#xff09;有时候&#xff0c;我们可能同时在进行多个项目开发&#xff0c;而多…

Spring Boot监听redis过期的key

Redis支持过期监听&#xff0c;可以实现监听过期数据&#xff0c;实现过程如下 1、pom依赖 <!-- Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></depend…

Django讲课笔记02:Django环境搭建

文章目录 一、学习目标二、相关概念&#xff08;一&#xff09;Python&#xff08;二&#xff09;Django 三、环境搭建&#xff08;一&#xff09;安装Python1. 从官方网站下载最新版本的Python2. 运行安装程序并按照安装向导进行操作3. 勾选添加到路径复选框4. 完成安装过程5.…

【计算机网络】UDP报文详解

目录 一. UDP协议概述 二. UDP报文格式 首部 三. UDP的缓冲区 一. UDP协议概述 UDP——用户数据报协议&#xff0c;是传输层的一个重要协议 基于UDP的应用层协议有&#xff1a;DNS&#xff0c;TFTP&#xff0c;SNMP&#xff0c;NTP 协议全称默认端口号DNSDomain Name Se…

开源框架Apache NiFi调研

开源框架Apache NiFi调研 NiFi背景介绍一、什么是NiFi1.1 Apache NiFi特点&#xff1a;流管理、易用性、安全性、可扩展的体系结构和灵活的伸缩模型。1.2 Apache NiFi特性1.2 Apache NiFi核心概念1.3架构 二、NiFi的诞生&#xff0c;要致力于解决的问题有哪些&#xff1f;三、为…

SQL 存储过程触发器

单个SQL语句 实现不了复杂的实际应用&#xff0c;需要一组SQL语句来实现&#xff0c;创建函数&#xff0c;以方便应用。 存储过程 可编程的函数&#xff0c;完成特定功能编写的SQL语句&控制语句的预编译的集合&#xff0c;再次调用时不再编译。 优点&#xff1a; 允许标…

软件开发经常出现的bug原因有哪些

软件开发中出现bug的原因是多方面的&#xff0c;这些原因可能涉及到开发流程、人为因素、设计问题以及其他一系列因素。以下是一些常见的导致bug的原因&#xff1a; 1. 错误的需求分析&#xff1a; 不正确、不完整或者模糊的需求分析可能导致开发人员误解客户的需求&#xff0…

AICore 带来了 Android 专属的 AI 能力,它要解决什么?采用什么架构思路?

前言 Google 最近发布的 Gemini 模型在全球引起了巨大反响&#xff0c;其在多模态领域的 Video demo 无比震撼。对于 Android 开发者而言&#xff0c;其中最振奋人心的消息莫过于 Gemini Nano 模型将内置到 Android 系统当中&#xff0c;并开放给开发者使用。 事实上&#xf…