点灯yes,关灯no

main.c

#include"led.h"
//手动封装一个延时函数
void delay_ms(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++){}}
}
int strcmp(char *s1,char *s2)
{while(*s1&&(*s1==*s2)){*s1++;*s2++;}return *s1-*s2;
}
int main()
{//使能GPIO的外设时钟*((unsigned int *)0X50000A28) |= (0X3<<4);led1_init();// led2_init();//  led3_init();uart4_config();char a;char buf[32];char auf[32]="yes";char cuf[32]="no";while(1){/*a=getchar();//读取一个字符putchar(a+1);//将读取到的字符+1返回   win下换行符是'\n',回车键对应的字符是'\r'putchar('\n');putchar('\r');*/gets(buf);//读取字符串if (strcmp(buf,auf)==0){led1_ctl(1);}else if(strcmp(buf,cuf)==0){led1_ctl(0);}puts(buf);}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;
}gpio1_t;#define  GPIOE ((gpio1_t *)0x50006000)
#define  GPIOF ((gpio1_t *)0x50007000)void led1_init();
//void led2_init();
//void led3_init();
void led1_ctl(int flag);
#endif#ifndef __UART4_H__
#define __UART4_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
void uart4_config();
void putchar(char c);
char getchar();
void puts(char *s);
void gets(char *s);#endif

led.c

#include "led.h"void led1_init()
{// 设置PE10为输出模式GPIOE->MODER &= (~(0x3 << 20));GPIOE->MODER |= (0x1 << 20);// 设置PE10为推挽输出GPIOE->OTYPER &= (~(0x1 << 10));// 设置PE10为低速输出GPIOE->OSPEEDR &= (~(0x3 << 20));// 设置PE10无上拉下拉GPIOE->PUPDR &= (~(0x3 << 20));
}
/*void led2_init()
{// 设置Pf10为输出模式GPIOF->MODER &= (~(0x3 << 20));GPIOF->MODER |= (0x1 << 20);// 设置PF10为推挽输出GPIOF->OTYPER &= (~(0x1 << 10)); // 设置PF10为低速输出GPIOF->OSPEEDR &= (~(0x3 << 20));// 设置PF10无上拉下拉GPIOF->PUPDR &= (~(0x3 << 20));
}*/
/*void led3_init()
{// 设置PE8为输出模式GPIOE->MODER &= (~(0x3 << 16));GPIOE->MODER |= (0x1 << 16);// 设置PE8为推挽输出GPIOE->OTYPER &= (~(0x1 << 8));// 设置PE8为低速输出GPIOE->OSPEEDR &= (~(0x3 << 16));// 设置PE8无上拉下拉GPIOE->PUPDR &= (~(0x3 << 16));
}*/
//LED1控制
void led1_ctl(int flag)
{if(flag==1){GPIOE->ODR |= (0x1<<10);}else if(flag==0){GPIOE->ODR &= (~(0x1<<10));}
}
//LED2控制
/*void led2_ctl(int flag)
{if(flag==1){GPIOF->ODR |= (0x1<<10);}else if(flag==0){GPIOF->ODR &= (~(0x1<<10));}
}*/
//LED3控制
/*void led3_ctl(int flag)
{if(flag==1){GPIOE->ODR |= (0x1<<8);}else if(flag==0){GPIOE->ODR &= (~(0x1<<8));}*/
//
void uart4_config()
{//使能UART4、GPIOG\GPIOB的外设时钟RCC->MP_APB1ENSETR |= (0x1<<16);RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0x1<<6);//设置PB2为复用功能GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= ((0x2<<4));//设置PB2为UART_RX复用功能GPIOB->AFRL &= (~(0xf<<8));GPIOB->AFRL |= (0x8<<8);//设置PG11为复用功能GPIOG->MODER &= (~(0x3<<22));GPIOG->MODER |= ((0x2<<22));//设置PG11为UART_TX复用功能GPIOB->AFRL &= (~(0xf<<12));GPIOB->AFRL |= (0x6<<12);//禁用串口,UE=0USART4->CR1 &=(~0x1);//设置8位数据位USART4->CR1 &= (~(0x1<<12));USART4->CR1 &= (~(0x1<<28));//设置无奇偶校验USART4->CR1 &= (~(0x1<<10));//设置1位停止位USART4->CR2 &= (~(0x3<<12));//设置波特率为115200USART4->BRR=0x22b;//设置频率不分频USART4->PRESC &= (~(0XF));//设置16倍过采样倍数USART4->CR1 &= (~(0X1<<15));//使能发送器USART4->CR1 |= (0x1<<3);//使能接收器USART4->CR1 |= (0x1<<2);//使能串口USART4->CR1 |= (0x1);}//封装单个字符发送函数
void putchar(char c)
{//判断发送数据寄存器是否为空,不为空则阻塞等待while(!(USART4->ISR&(0X1<<7)));//当为空时将数据写入到数据发送寄存器USART4->TDR=c;//阻塞等待数据发送完毕,函数结束while(!(USART4->ISR&(0X1<<6)));
}//封装单个字符接收的函数
char getchar()
{//判断接收数据寄存器中有没有有效数据。如果没有就阻塞等待,如果有直接读取while(!(USART4->ISR&(0X1<<5)));//将读取的数据返回return USART4->RDR;
}//发送一个字符串
void puts(char *s)
{while(*s){putchar(*s);s++;}//发送完字符串让光标显示在下一行最开头putchar('\n');putchar('\r');
}//接收字符串
void gets(char *s)
{while(1){*s=getchar();putchar(*s);//将读取到的字符回显到串口if(*s=='\r'){break;}s++;}*s='\0';//手动补上一个'\0'putchar('\n');//让光标显示在下一行
}

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

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

相关文章

(delphi11最新学习资料) Object Pascal 学习笔记---第13章

第13章 对象和内存 ​ 本章关注 Object Pascal 语言中一项非常具体且相当重要的主题—内存管理。Object Pascal 语言及其运行时环境提供了一种独特的解决方案&#xff0c;介于 C 风格的手动内存管理和 Java 或 C# 风格的自动垃圾回收之间。 ​ 采用这种介于两者之间的方式在于…

2024-05-23 vscode + clang + clangd 解锁 modules

点击 <C 语言编程核心突破> 快速C语言入门 vscode clang clangd 解锁 modules 前言一、准备二、使用备注: 总结 前言 要解决问题: 昨天解锁VS使用modules, 但是不完美, 没有代码提示和补全了, 今天用 vscode clang clangd 解锁 modules, 同时还有代码补全及提示. …

js中的 map 方法遍历

map方法// map 方法不改变原本的数组 所以要将map之后的值赋值给一个新的变量 // ...item 的作用是 // 将调用 map 函数的数组里的所有数据 都复制到新的&#xff0c;接收map之后的数组中 // 在此基础上 再覆盖或者添加新的数据&#xff0c;如 outpatient 和 recommended 属性/…

​​​【收录 Hello 算法】9.4 小结

目录 9.4 小结 1. 重点回顾 2. Q & A 9.4 小结 1. 重点回顾 图由顶点和边组成&#xff0c;可以表示为一组顶点和一组边构成的集合。相较于线性关系&#xff08;链表&#xff09;和分治关系&#xff08;树&#xff09;&#xff0c;网络关系&#xff08;图&am…

Defog发布Llama-3-SQLCoder-8B,文本转SQL模型,性能比肩GPT-4,准确率超90%,消费级硬件可运行

前言 在计算语言学领域&#xff0c;将自然语言转化为可执行的SQL查询是一个重要的研究方向。这对于让那些没有编程或SQL语法知识的用户也能轻松访问数据库信息至关重要。Defog团队近日发布了基于Llama-3的SQLCoder-8B模型&#xff0c;它在文本转SQL模型领域取得了显著突破&…

2024.05.23 学习记录

1、 react hooks 面经复习 2、xiaolin coding 计算机网络 复习 3、组件库 subMenu、test测试、tabs组件初步开发完成 4、代码随想录刷题&#xff1a;动态规划 01背包 all

MyBatisPlus标准分页功能制作,以及设置分页拦截器,selectPage(new Page<>(current,size),null)

目录 1、设置分页拦截器 2、创建数据库及表 3、pom.xml 4、添加MP的相关配置信息 application.yml 5、根据数据库表创建实体类 User 6、创建 UserDao 接口 7、编写引导类 8、编写测试类 9、Run的运行结果 1、设置分页拦截器 package com.example.config; import com.baomidou.m…

Linux: network: send 失败的时候要不要close socket?

最近遇到一个例子&#xff0c;说有zerowindow出现&#xff1b;出现的原因是接收方的CPU被其他程序吃光&#xff0c;导致socket的read函数处理非常慢。说明接收端的接收缓存不够用。发送端自然而然的要停止发送。 但是如果在接收方的recv buff&#xff0c;以及发送方的send buf…

探索移动云:我的ES与Kibana之旅

目录 引言&#xff1a; 如何免费体验移动云产品 登录并完成实名认证 选择试用ECS云主机 安全组配置 安装Elasticsearch和Kibana 安装Elasticsearch ​编辑安装kibana 测试结果 使用感觉 引言&#xff1a; 移动云技术产品的发展已经取得了巨大的进步。云数融合、A1、大…

解决vite打包只生成了一个css和js文件问题

文章目录 1. 打包遇到的问题2. 问题原因及修改3. 调整后再次打包&#x1f197; 1. 打包遇到的问题 今天整了一个项目&#xff0c;试了下打包&#xff0c;发下打包后只生成了一个css文件&#xff0c;和一个js文件&#xff0c; 这样肯定是不行的&#xff0c;因为这样这个文件的包…

Windows:iHasher-v0.2安装报错Windows 功能 .NET Framework 3.5

一、情景描述 我们从MSDN下载了镜像文件&#xff0c;一般要验证下载文件的HASH值是否与MSDN上发布的一致&#xff0c;确保传出过程中iso文件没有损坏。 MSDN地址&#xff1a;https://msdn.itellyou.cn/ 我从MSDN下载了Hasher工具&#xff0c;进行校验。 但是&#xff0c;安装…

Marker可以快速且准确地将PDF转换为markdown格式。

Marker Marker可以快速且准确地将PDF转换为markdown格式。 支持多种文档类型&#xff08;针对书籍和科学论文进行了优化&#xff09;支持所有语言移除页眉/页脚/其他杂质格式化表格和代码块提取并保存图像以及markdown将大多数方程转换为latex支持在GPU、CPU或MPS上运行 工作…

智慧社区管理系统:打造便捷、安全、和谐的新型社区生态

项目背景 在信息化、智能化浪潮席卷全球的今天&#xff0c;人们对于生活品质的需求日益提升&#xff0c;期待居住环境能与科技深度融合&#xff0c;实现高效、舒适、安全的生活体验。在此背景下&#xff0c;智慧社区管理系统应运而生&#xff0c;旨在借助现代信息技术手段&…

[机缘参悟-185] - 《道家-水木然人间清醒1》读书笔记 - 真相本质 -8- 认知觉醒 - 逻辑谬误、认知偏差:幸存者偏差

目录 前言&#xff1a; 一、幸存者偏差 二、幸存者偏差在现实中的应用 第一个故事&#xff1a; 第二个故事&#xff1a; 三、生活中的幸存者偏差 四、迷恋成功者经验的原因&#xff1a;鸡汤、幻想、传奇、希望 备注&#xff1a; 前言&#xff1a; 幸存者偏差&#xff0…

从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)

你是否被K8S的强大而吸引&#xff0c;我相信一部分人是被那复杂的配置和各种专业知识而劝退&#xff0c;应该还有一部分人是因为K8S太吃资源而放手&#xff01; 这里介绍一款平替工具PasteSpider&#xff0c;PasteSpider是一款使用c#编写的linux容器部署工具(使用PasteSpider和…

k8s集群的声明式管理资源

一 声明式管理方法 1 适合于对资源的修改操作&#xff08;陈述式方式修改资源非常不方便&#xff09; 2 声明式资源管理方法依赖于yaml资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff…

集成构建流程之根文件系统Buidroot

编译流程 单板信息 #---- device/milkv-duos-sd/boardconfig.sh export MV_BOARDmilkv-duos-sd export MV_BOARD_CPUcv1813h export MV_VENDORmilkv export MV_BUILD_ENVmilkvsetup.sh export MV_BOARD_LINKcv1813h_milkv_duos_sd 通用编译脚本&#xff1a;build.sh #---- b…

MySQL 视图(1)

常用视图语句 -- 创建视图 CREATE VIEW t1_view AS SELECT * FROM t1; CREATE VIEW v AS VALUES ROW(1,2);-- 查询视图 SELECT * FROM t1_view;-- 查询视图的相关系统视图 SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = test AND TABLE_NAME =…

MATLAB基础应用精讲-【数模应用】调节中介作用分析(附R语言代码实现)

目录 算法原理 什么是调节中介作用分析 中介调节模型 一概念

LLaMA2详解

padding_side llama系列训练和推理都是right padding&#xff1a; 训练&#xff1a;其实只要设置padding mask&#xff0c;那么left/right pad是没有区别的。然而实际上huggingface中某些tokenizer在training的时候必须设成right padding&#xff0c;因为有些tokenizer使用的是…