ARMday6作業

 串口发送指令控制硬件工作

uart1.h

#ifndef __UART1_H__
#define __UART1_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h" 
void all_led_init();
void led1_on();
void led2_on();
void led3_on();
void led1_off();
void led2_off();
void led3_off();
void uart4_init();
void myputchar(char i);
char mygetchar();
char *gets();
void puts(char *s);
int mystrcmp(char *p1,char *p2);
#endif

 uart1.c

#include"uart1.h"
char buf[51]={0};
//串口数据初始化
void uart4_init()
{//1.UART4和GPIOB\GPIOG的时钟使能RCC->MP_AHB4ENSETR|=(0x1<<1);//使能GPIOB时钟RCC->MP_AHB4ENSETR|=(0x1<<6);//使能GPIOG时钟RCC->MP_AHB4ENSETR|=(0x1<<16);//使能UART4的时钟//2.设置PB2和PG11的管脚复用GPIOB->MODER&=(~(0x3<<4));GPIOB->MODER|=(0x2<<4);//设置复用GPIOB->AFRL &=(~(0xF<<8));GPIOB->AFRL |=(0x8<<8);//设置uart4功能复用//设置PB2和PG11的管脚复用GPIOG->MODER&=(~(0x3<<22));GPIOG->MODER|=(0x2<<22);//设置复用GPIOG->AFRH &=(~(0xF<<12));GPIOG->AFRH |=(0x6<<12);//设置uart4功能复用//3.先去设置串口禁用,方便设置数据格式USART4->CR1&=(~0x1);//4.设置8位数据位
USART4->CR1&=(~(0x1<<28));
USART4->CR1&=(~(0x1<<12));//5.设置没有奇偶校验USART4->CR1&=(~(0x1<<10));//6.设置16倍采样USART4->CR1&=(~(0x1<<15));//7.设置1位停止位USART4->CR2&=(~(0x3<<12));//8.设置1分频USART4->PRESC&=(~(0xF));//9.设置波特率115200bpsUSART4->BRR|=0x22B;//10.发送器、接收器使能USART4->CR1|=(0x1<<3);USART4->CR1|=(0x1<<2);//11.USART4->CR1|=(0x1);//
}
void myputchar(char c)
{//1.判断TDR寄存器是否为空,如果为空,向TDR寄存器写入数据while(!(USART4->ISR&(0x1<<7)));USART4->TDR=c;////阻塞等待数据传输完成,函数返回while(!(USART4->ISR&(0x1<<6)));//}
char mygetchar()
{ char c;//判断RDR寄存器是否有就绪的数据,如果有就读取,否则等待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;
}
void all_led_init()
{// 1.使能外设时钟RCC->MP_AHB4ENSETR|=(0X3<<4);// 2.设置PF10 PE10 PE8为输出输出GPIOE->MODER &= (~(0x3 << 20));GPIOE->MODER |= (0x1 << 20);GPIOF->MODER &= (~(0x3 << 20));GPIOF->MODER |= (0x1 << 20);GPIOE->MODER &= (~(0x3 << 16));GPIOE->MODER |= (0x1 << 16);// 3.设置推挽输出GPIOE->OTYPER &= (~(0x1 << 10));GPIOF->OTYPER &= (~(0x1 << 10));GPIOE->OTYPER &= (~(0x1 << 8));// 4.设置输出速度为低速GPIOE->OSPEEDR &= (~(0x3 << 20));GPIOF->OSPEEDR &= (~(0x3 << 20));GPIOE->OSPEEDR &= (~(0x3 << 16));// 5.设置无上拉下拉GPIOE-> PUPDR&= (~(0x3 << 20));GPIOF-> PUPDR&= (~(0x3 << 20));GPIOE-> PUPDR&= (~(0x3 << 16));
}
void led1_on()
{GPIOE->ODR |= (0x1 << 10);
}
void led2_on()
{GPIOF->ODR |= (0x1 << 10);
}
void led3_on()
{GPIOE->ODR |= (0x1 << 8);
}void led1_off()
{GPIOE->ODR &= (~(0x1 << 10));
}
void led2_off()
{GPIOF->ODR &= (~(0x1 << 10));
}
void led3_off()
{GPIOE->ODR &= (~(0x1 << 8));
}
int mystrcmp(char *p1,char *p2)
{int ret;while(*p1 == *p2 && *p1 != '\0' && *p2 != '\0'){p1++;p2++;}ret = *p1 - *p2; // 返回值if(ret==0)return 0;elsereturn 1;
}

 main.c

#include"uart1.h"
//封装延时函数
void delay(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}
}
int main()
{//串口的初始化uart4_init();char *str;all_led_init();//LED初始化//现象是发送一个a串口工具打印一个bwhile(1){myputchar('\n');myputchar('\r');//2.从串口读取一个字符串str=gets();puts(str);//3.回显输入的字符串if(mystrcmp(str,"led1_on")==0){led1_on();}else if(mystrcmp(str,"led1_off")==0){led1_off();}else if(mystrcmp(str,"led2_on")==0){led2_on();}else if(mystrcmp(str,"led2_off")==0){led2_off();}else if(mystrcmp(str,"led3_on")==0){led3_on();}else if(mystrcmp(str,"led3_off")==0){led3_off();}}return 0;
}

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

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

相关文章

代码随想录二刷 | 二叉树 | 110.平衡二叉树

代码随想录二刷 &#xff5c; 二叉树 &#xff5c; 110.平衡二叉树 题目描述解题思路递归迭代 代码实现递归法迭代法 题目描述 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉…

EMNLP 2023 获奖论文公布,大模型、NLP等领域火爆

EMNLP是计算语言学和自然语言处理领域顶级国际会议之一&#xff0c;属于CCF B类&#xff0c;是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于ACL&#xff0c;EMNLP更偏向于NLP在各个领域解决方案的学术探讨。 今年的EMNLP 2023 已于2023…

table表格table/tr/td宽度和高度的设置

关于html中table表格tr,td的⾼度和宽度 做⽹页的时候经常会遇到各种各样的问题&#xff0c;经常遇到的⼀个就是会碰到表格被内容撑开的问题。 设置table样式为 table-layout: fixed; 宽度可以了&#xff0c;但是高度会被撑高。怎么设置都不行&#xff0c;只能给这个td标签单独…

【Linux】 线程池

线程池 什么是线程池&#xff1f; 一次预先申请一批线程&#xff0c;让这批线程有任务&#xff0c;就处理任务&#xff1b;没任务&#xff0c;就处于等待状态。 为什么要有线程池&#xff1f; 以空间换时间&#xff0c;预先申请一批线程&#xff0c;当有任务到来&#xff0c;可…

将rtsp视频流发送到AWS Kinesis Video Streams的方案——使用Gstreamer(C++) Command Line

大纲 1 创建Kinesis Video Streams1.1 创建视频流1.2 记录Creation Time 2 创建策略2.1 赋予权限2.2 限制资源2.3 Json格式描述&#xff08;或上面手工设置&#xff09;2.4 注意事项 3 创建IAM用户3.1 生成密钥对3.2 附加策略3.3 记录访问密钥对 4 编译C 创建者库5 发送6 检查参…

JavaScript <关于逆向RSA非对称加密算法的案例(代码剖析篇)>--案例(五点一)

引用上文: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134857857 剖析: var bitsPerDigit16; // 每个数组元素可以表示的二进制位数// 数组复制函数&#xff0c;将源数组部分复制到目标数组的指定位置 function arrayCopy(src, srcStart, dest, destStart, n) {var m…

国内地址地区智能解析,无需完整地址也能正确匹配

页面直接引入使用 已打包成单文件dist/bundle.js 可以直接通过标签引用 <script src="./bundle.js"></script> <script>var results = AddressParse.parse(福建省福州市福清市石竹街道义明综合楼3F,15000000000,asseek);console.log(results);…

OD机考真题搜集:服务失效判断

题目 某系统中有众多服务,每个服务用字符串(只包含字母和数字,长度<=10)唯一标识,服务间可能有依赖关系,如A依赖B,则当B故障时导致A也故障。 依赖具有传递性,如A依赖B,B依赖C,当C故障时导致B故障,也导致A故障。 给出所有依赖关系,以及当前已知故障服务,要求输…

git提交代码报错Git: husky > pre-commit

目录 git提交代码报错原因解决方法&#xff08;三种&#xff09;1、第一种2、第二种3、第三种 git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代…

Kotlin 中密封类、枚举类与密封接口的对比分析

在 Kotlin 编程语言中&#xff0c;密封类&#xff08;Sealed Classes&#xff09;、枚举类&#xff08;Enum Classes&#xff09;和密封接口&#xff08;Sealed Interfaces&#xff09;是处理一组固定类型的强大工具。它们在 Kotlin 中扮演着特殊的角色&#xff0c;特别是在创建…

【小白专用】MySQL创建数据库和创建数据表

1.在Windows开始搜索输入Mysql,并选择第一个打开。 2.输入安装时的密码 3.说明安装成功。 二、创建数据库 1. 连接 MySQL 输入 mysql -u root -p 命令&#xff0c;回车&#xff0c;然后输入 MySQL 的密码(不要忘记了密码)&#xff0c;再回车&#xff0c;就连接上 MySQL 了。 …

数据库常用锁

数据库锁是一种用于管理并发访问的机制&#xff0c;以确保数据的一致性和完整性。在并发访问的情况下&#xff0c;多个事务可能同时尝试访问相同的数据&#xff0c;而数据库锁能够协调这些访问&#xff0c;防止数据不一致的问题。以下是一些常见的数据库锁及其详细解释&#xf…

C语言-统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数M和N&#xff08;1≤M≤N≤500&#xff09;。 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和&#xff0c;数字间以空格分隔。 输入样例: 10 31输出样例: 7…

深入Redis过程-持久化

目录 redis实现持久化 RDB 触发机制-定期方法 定期-手动触发 save bgsave 定期-自动触发 AOF 开启AOF功能 刷新缓冲区策略 重写机制 混合持久化 Redis事务 事务相关的命令 MULTI EXEC DISCARD WATCH redis实现持久化 RDB RDB叫做Redis数据备份文件&#xf…

强大的公式编辑器 —— MathType最新版本安装与使用

强大的公式编辑器 —— MathType最新版本安装与使用 由于使用了很长时间的机械硬盘出现坏道&#xff0c;安装在其中的MathType6.9&#xff08;精简版&#xff09;也没办法使用了&#xff0c;本来想安装个高版本的MathType&#xff0c;比如MathType7.4&#xff0c;但在网上苦苦…

如何更改Jupyter Notebook中的环境?

1.首先&#xff0c;打开终端 2.接着&#xff0c;分别输入以下命令 conda env list 把EXPose替换为自己的环境变量 conda activate EXPose 3.接下来安装‘ ipykernel ’软件包 conda install ipykernel 4. 将该环境添加到Jupyter Notebook中&#xff1b;在Jupyter Notebook…

HTB Surveillance

Surveillance 2023年12月10日 12:13:35User nmap Starting Nmap 7.80 ( https://nmap.org ) at 2023-12-10 12:15 CST Stats: 0:00:37 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 59.83% done

小白第一次开私服怎么吸引玩家

大家好&#xff0c;我是咕噜-凯撒&#xff0c;在现在这个网络社会很多人为了放松一下会选择打打游戏&#xff0c;私服也就成为了许多玩家为了寻找新鲜体验的热门选择&#xff0c;很多小白就发现了这个契机但是吸引玩家加入自己的服务器也就成了一个比较头疼的问题&#xff0c;下…

Wrong number of values of control parameter 2(Halcon 错误代码:1402)

threshold (ImageReduced1, Region, 0,min2(75,Min)) 程序运行到这一句&#xff0c;出现错误 原因是其中的参数Min为空数组 解决方案&#xff1a;判断了下可以输出Min的区域是否存在&#xff0c;不存在跳过这一步。

八叉树bt文件转为grid文件的代码及编译流程

目的 点云文件转为八叉树文件 代码 在一个文件夹中新建两个文件&#xff0c;pcd2bt.cpp和CMakeLists.txt&#xff0c;分别写入&#xff1a; grid3d_node.cpp #include <ros/ros.h> #include <string> #include "grid3d.hpp"int main(int argc, char…