3.21 ARM day5

串口控制LED灯亮灭

main.c

#include "uart4.h"int main()
{//串口初始化uart4_init();//led初始化led_init();char i;int count = 0;int count2 = 0;int count3 = 0;while (1){i = getchar();putchar(i);//键盘输入a,串口工具显示aif (i == '1'){count++;if (count % 2 == 1)LED1_ON();elseLED1_OFF();}if (i == '2'){count2++;if (count2 % 2 == 1)LED2_ON();elseLED2_OFF();}if (i == '3'){count3++;if (count3 % 2 == 1)LED3_ON();elseLED3_OFF();}}return 0;
}

uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"void uart4_init();
void putchar(char a);
char getchar();
void gets(char *s);
void puts(char *s);void led_init();
void LED1_ON();
void LED1_OFF();
void LED2_ON();
void LED2_OFF();
void LED3_ON();
void LED3_OFF();
int my_strcmp(const char *src1, const char *src2);
#endif

uart4.c

#include "uart4.h"#include "led.h"int my_strcmp(const char *src1, const char *src2)
{while (*src1 == *src2){if (*src1 == 0){return 0;}src1++;src2++;}return (*src1 - *src2);
}void led_init()
{RCC->MP_AHB4ENSETR |= (0x3 << 4); //使能GPIOF、GPIOEGPIOE->MODER &= (~(0x3 << 20));   //PE10清零GPIOE->MODER |= (0x1 << 20);      //PE10管脚复用GPIOE->MODER &= (~(0x3 << 16));   //PE8清零GPIOE->MODER |= (0x1 << 16);      //PE8管脚复用GPIOF->MODER &= (~(0x3 << 20));   //PF10清零GPIOF->MODER |= (0x1 << 20);      //PF10管脚复用//设置推挽模式GPIOE->OTYPER &= (~(0x1 << 10));GPIOF->OTYPER &= (~(0x1 << 10));GPIOE->OTYPER &= (~(0x1 << 8)); //PE8//设置低速GPIOE->OSPEEDR &= (~(0x3 << 20));GPIOF->OSPEEDR &= (~(0x3 << 20));GPIOE->OSPEEDR &= (~(0x3 << 16)); //PE8//设置无上拉下拉GPIOE->PUPDR &= (~(0x3 << 20));GPIOF->PUPDR &= (~(0x3 << 20));GPIOE->PUPDR &= (~(0x3 << 16));//设置低电平输出 灯灭GPIOE->ODR &= (~(0x1 << 10));GPIOF->ODR &= (~(0x1 << 10));GPIOE->ODR &= (~(0x1 << 8));
}void uart4_init()
{//使能GPIOB GPIOG UART4外设时钟RCC->MP_AHB4ENSETR |= (0x1 << 1);  //GPIOBRCC->MP_AHB4ENSETR |= (0x1 << 6);  //GPIOGRCC->MP_APB1ENSETR |= (0X1 << 16); //UART4//设置PB2和PG11管脚复用GPIOB->MODER &= (~(0x3 << 4));//PB2GPIOB->MODER |= (0x2 << 4);GPIOG->MODER &= (~(0x3 << 22));//PG11GPIOG->MODER |= (0x2 << 22);GPIOB->AFRL &= (~(0XF << 8));GPIOB->AFRL |= (0x8 << 8);GPIOB->AFRH &= (~(0XF << 12));GPIOG->AFRH |= (0x6 << 12);//设置串口不使能 UE=0USART4->CR1 &= (~(0X1));//设置8位数据位USART4->CR1 &= (~(0x1 << 12));USART4->CR1 &= (~(0x1 << 28));//设置没有奇偶校验位USART4->CR1 &= (~(0x1 << 10));//设置1位停止位USART4->CR2 &= (~(0x3 << 12));//设置16倍过采样USART4->CR1 &= (~(0x1 << 15));//设置时钟不分频USART4->PRESC &= (~(0xF));//设置波特率为115200USART4->BRR = 0X22B;//使能发送器USART4->CR1 |= (0x1 << 3);//使能接收器USART4->CR1 |= (0x1 << 2);//使能uart4USART4->CR1 |= (0x1 << 0);
}//发送一个字符
void putchar(char a)
{//先判断发送数据寄存器是否为空 不为空则阻塞等待while (!(USART4->ISR & (0x1 << 7)));//为空向发送数据寄存器写入a的数据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('\n'); // '\n'切换到下一行putchar('\r'); //'\r'回车键,切换到行头
}//接收字符串函数
void gets(char *s)
{while (1){*s = getchar();putchar(*s);if ((*s) == '\r')break;s++;}*s = '\0';putchar('\n'); //换行
}

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

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

相关文章

步进电机驱动器的接线与使用(接线详细)

今天小编就来继续学习与使用步行电机的学习&#xff0c;如果位置对你有帮助&#xff0c;评论收藏&#xff0c;点赞一下 步进电机驱动器 步进电机驱动器是一种专用于控制步进电机的电子设备&#xff0c;用于控制步进电机的转动和位置。步进电机是一种将电信号转换为机械运动的电…

Compose UI 之 Segmented buttons 分段按钮

Segmented buttons SegmentedButton 是一种分段式按钮组件,它允许用户在一组相关的选项中选择一个或几个。 上图中:① 单选的分段式按钮。② 多选的分段式按钮。 分段式按钮的几个特点: 分段式按钮是带有状态的按钮,又有单选和多选之分。 从设计上将,不论是单选或是多选…

第二十九章 配置 Web Gateway 的默认参数 - 与 IRIS 的连接(二)

文章目录 第二十九章 配置 Web Gateway 的默认参数 - 与IRIS 的连接(二)Event Log Rotation SizeMaximum Logged Request SizeSSL/TLS Library PathPreserve Mode Exclude File Types 第二十九章 配置 Web Gateway 的默认参数 - 与IRIS 的连接(二) Event Log Rotation Size 这…

fastjson2 反序列化包含多层泛型结构的实体类

前言 由于使用到httpUtill来调用接口 工具类的返回是字符串 其中接口的实现返回值是个多层泛型结构的实体类 例如Result<Page<UserDto>> 当使用 JSON.parseObject("res",new TypeReference<Result<Page<UserDto>>>{})发现在page中存在…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数&#xff08;通常使用输入函数&#xff09;&#xff0c;确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和&#xff0c;该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系&#xff0c;而传统的固定序列处理方法可能会遗漏这…

QT(19)-QNetworkRequest

attribute(QNetworkRequest::Attribute code, const QVariant &defaultValue QVariant()) const 获取指定的请求属性。如果该属性未设置&#xff0c;则返回默认值。 hasRawHeader(const QByteArray &headerName) const 检查是否存在指定名称的原始请求头。 header(Q…

虚拟机扩展:虚拟机快照

虚拟机快照 在学习阶段我们无法避免的可能损坏Linux操作系统。如果损坏的话&#xff0c;重新安装一个Linux操作系统就会十分麻烦。 那我们就可以通过快照将当前虚拟机的状态保存下来&#xff0c;在以后系统损坏时通过快照恢复虚拟机到保存的状态。 制作并还原快照 在VMware …

静态方法 static foo()

静态方法&#xff08;Static Method&#xff09;是编程语言中的一种特殊方法&#xff0c;其特点是不依赖于类的实例即可被调用。在C和许多其他面向对象的编程语言中&#xff0c;静态方法通过类名来直接调用&#xff0c;而无需创建类的实例。这些方法属于类本身&#xff0c;而不…

数据结构(二)队列和栈

Java提供了java.util.Stack类来表示栈数据结构。Stack类是Vector类的子类&#xff0c;它实现了一个标准的后进先出&#xff08;LIFO&#xff09;栈。同样也提供了Queue接口&#xff0c;表示一系列按照特定顺序排列的元素&#xff0c;其中最早添加的元素将最先被移除&#xff08…

SAP HCM 0008信息类型间接评估与直接评估

如果在间接评估模块输入就是间接评估&#xff08;tarif是读取下图中的数据 a代表不需要输入工资项&#xff0c;b表示需要找工资相&#xff09; 不输入就是直接评估需要客户自己输入数字 第2个情况 summe求和 &#xff08;比如在0008中输入9000与9001 那么自动求出9002工资项数…

C# WPF编程-布局

C# WPF编程-布局 布局WPF布局原则布局过程布局容器布局属性Border控件StackPanel布局WrapPanel布局DockPanel布局Grid布局UniformGrid布局Canvas布局 布局 WPF布局原则 WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面&#xff0c;需要在窗口…

uniapp 之 一些常用方法的封装(页面跳转,页面传参等)

util.js 提示&#xff1a;permission.js是uniapp插件市场由官方DCloud_heavensoft提供的App权限判断和提示插件。 import permision from "/js_sdk/wa-permission/permission.js"/*** uni.toast 封装* param {String} msg toast 提示内容* param {Number} duration …

SpringBoot项目如何打包成war包,并部署在tomcat上运行

项目场景&#xff1a; 正常情况下&#xff0c;我们开发 SpringBoot 项目&#xff0c;由于内置了Tomcat&#xff0c;所以项目可以直接启动&#xff0c;部署到服务器的时候&#xff0c;直接打成 jar 包&#xff0c;就可以运行了。 有时我们会需要打包成 war 包&#xff0c;放入外…

Redis进阶(持久化、复制、集群、多线程、缓存)

Redis进阶 1.Redis持久化1.1 什么是Redis持久化&#xff1f;为什么需要持久化&#xff1f;1.2 Redis持久化方式——RDB(Redis DataBase)1.2.1 什么是RDB&#xff1f;1.2.2 备份文件位置1.2.3 触发RDB的方式1.2.3.1 自动触发1.2.3.2 手动触发1.2.3.3 其他触发方式 1.2.4 RDB优缺…

【GPT概念04】仅解码器(only decode)模型的解码策略

一、说明 在我之前的博客中&#xff0c;我们研究了关于生成式预训练转换器的整个概述&#xff0c;以及一篇关于生成式预训练转换器&#xff08;GPT&#xff09;的博客——预训练、微调和不同的用例应用。现在让我们看看所有仅解码器模型的解码策略是什么。 二、解码策略 在之前…

阿里云代理仓库地址

在天朝使用jcenter、mavenCentral及google三个远程仓库&#xff0c;Gradle Sync会很慢&#xff0c;google仓库甚至需要科学上网才能访问。为了加快Gradle Sync速度&#xff0c;一招教你优先用 阿里云仓库服务 的仓库作为下载源。 一劳永逸之道 将本项目的gradle/init.d/init.g…

【小程序开发】功能页面 API 汇总集合

ty.device.openCategoryActivatorPage 进入配网-选品类首页 需引入DeviceKit&#xff0c;且在>2.3.2版本才可使用 参数 Object object 属性类型默认值必填说明completefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行&#xff09;successfunction否…

【Jenkins】Spark on Yarn 部署脚本

文章目录 停止 Yarn 集群中的 Spark 应用提交 Spark 应用到 YARN✔️ 目标:提供 Jenkins 脚本,用于 在 Jenkins 中实现 Spark 任务提交到 YARN 及重启操作。 停止 Yarn 集群中的 Spark 应用 Shell 脚本: # 停止spark应用(仅支持一个yarn应用,如果跑了多个应用,会报错)…

【Linux】多线程编程基础

&#x1f4bb;文章目录 &#x1f4c4;前言&#x1f33a;linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 &#x1f33b;linux线程冲突概念互斥锁函数介绍加锁的缺点 &#x1f4d3;总结 &#x1f4c4;前言 无论你是否为程序员&#xff0c;相信多线程这个词汇应…

How to install Miniconda on ubuntu 22.04

How to install Miniconda on ubuntu 22.04 介绍安装脚本细节 初始化脚本细节 卸载脚本细节 介绍 通常来说&#xff0c;要安装conda有以下三种安装方案&#xff1a; Miniconda Miniconda 是 conda 的免费最小安装程序。它是 Anaconda 的一个小型引导版本&#xff0c;仅​​包…