2024.3.21 ARM

串口控制三盏灯亮灭

main.c

#include "uart4.h"int main()
{//串口初始化uart4_init();//led初始化led_init();char i;//char s[128];int count = 0;int count2 = 0;int count3 = 0;while (1){i = getchar();putchar(i);//最终的现象:键盘输入a,串口工具显示a//gets(s);//puts(s);if (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 LED2_ON();
void LED3_ON();
void LED1_OFF();
void LED2_OFF();
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管脚复用//PB2GPIOB->MODER &= (~(0x3 << 4));GPIOB->MODER |= (0x2 << 4);//PG11GPIOG->MODER &= (~(0x3 << 22));GPIOG->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'); //'\n'回车键,切换到行头
}//接收字符串函数
void gets(char *s)
{while (1){*s = getchar();putchar(*s);if ((*s) == '\r')break;s++;}*s = '\0';putchar('\n'); //换行
}

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

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

相关文章

表情识别数据集

表情视频数据集 在许多的研究中,研究者通常会把人脸表情识别区分为静态的人脸表情识别(static facial emotion recognition)和动态的人脸表情识别(dynamic facial emotion recognition)。前者希望通过单张图片辨别人的表情从而达到识别人情绪的目的,而后者希望感知视频/…

进程的概念 | PCB | Linux下的task_struct | 父子进程和子进程

在讲进程之前首先就是需要去回顾一下我们之前学的操作系统是干嘛的&#xff0c;首先操作系统是一个软件&#xff0c;它是对上提供一个良好高效&#xff0c;稳定的环境的&#xff0c;这是相对于用户来说的&#xff0c;对下是为了进行更好的软硬件管理的&#xff0c;所以操作系统…

多数据源 - dynamic-datasource | 进阶 - 数据库加密

文章目录 实现原理EncDataSourceInitEvent 类与 DataSourceInitEvent 接口配置 DataSourceInitEvent 为 Bean使用案例第 1 步:使用私钥加密第 2 步:在 YAML 中使用 ENC(xxx) 配置相关文章🗯️ 上节回顾:前节中,了解了 dynamic-datasource 的懒加载/初始化 SQL/无数据源启…

TinyEMU源码分析之虚拟机初始化

TinyEMU源码分析之虚拟机初始化 1 初始化结构参数2 配置RAM地址空间3 初始化设备4 拷贝BIOS和Kernel5 手动写入5条指令6 体验第一条指令的执行 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其它文章。 本文中使用的代码&#xff0c;均为伪代码&#xff0c…

vue2使用webSocket双向通讯

基于webSocket实现双向通信&#xff0c;使用webworker保持心跳。 由于浏览器的资源管理策略会暂停或限制某些资源的消耗&#xff0c;导致前端心跳包任务时效&#xff0c;后端接收不到webSocket心跳主动断开&#xff0c;因此需要使用webworker保持心跳 引入webworker npm insta…

关于安卓调用文件浏览器(一)打开并复制

背景 最近在做一个硬件产品&#xff0c;安卓应用开发。PM抽风&#xff0c;要求从app打开文件浏览器&#xff0c;跳转到指定目录&#xff0c;然后可以实现文件复制粘贴操作。 思考 从应用开发的角度看&#xff0c;从app打开系统文件浏览器并且选择文件&#xff0c;这是很常见…

Java 中 BitSet 类的用法

Java 中 BitSet 类的用法 API构造置位为 true清除为 false查找位反转长度运算流其他 原理底层数据结构如何工作 API 构造 无参构造 &#xff1a;默认为 64 个 bit 的容量 BitSet bitset new BitSet();有参构造 &#xff1a;设置为 n 个 bit 的容量 BitSet bitset new BitSe…

.NET Framework 服务实现监控可观测性最佳实践

环境信息 系统环境&#xff1a;Windows Server开发语言&#xff1a;.NET Framework > 4.6.1APM探针包&#xff1a;ddtrace 准备工作 安装 Datakit 主机部署&#xff1a; 主机安装 - 观测云文档 打开采集 APM 采集器 Windows 主机配置 # 到如下路径&#xff0c;把ddtr…

广东省30m二级分类土地利用数据(矢量)

广东省&#xff0c;地处中国大陆最南部&#xff0c;属于东亚季风区&#xff0c;从北向南分别为中亚热带、南亚热带和热带气候&#xff0c;是中国光、热和水资源最丰富的地区之一。主要河系为珠江的西江、东江、北江和三角洲水系以及韩江水系。广东省面积为17.977万平方公里&…

vue+element 前端实现增删查改+分页,不调用后端

前端实现增删查改分页&#xff0c;不调用后端。 大概就是对数组内的数据进行增删查改分页 没调什么样式&#xff0c;不想写后端&#xff0c;当做练习 <template><div><!-- 查询 --><el-form :inline"true" :model"formQuery">&l…

2024山东医养健康展,济南养老产业展,中国老龄用品展

打造养老产业交流与合作平台&#xff0c;助力企业便捷开拓买方市场&#xff0c;2024山东老博会5月27日举办&#xff1b; 2024第6届中国&#xff08;济南&#xff09;国际养老服务业展览会&#xff08;CSOLDE山东老博会&#xff09; The 2024 sixth China (Jinan) Internationa…

高性能 MySQL 第四版(GPT 重译)(一)

前言 由 Oracle 维护的官方文档为您提供了安装、配置和与 MySQL 交互所需的知识。本书作为该文档的伴侣&#xff0c;帮助您了解如何最好地利用 MySQL 作为强大的数据平台来满足您的用例需求。 本版还扩展了合规性和安全性在操作数据库足迹中的日益重要作用。隐私法律和数据主…

GPT系列 论文阅读笔记

文章目录 GPT-1GPT-2GPT-3 GPT-1 GPT-1的核心&#xff1a;基于Transformer的解码器构建一个模型&#xff0c;在大量无标号的文本数据上训练一个模型&#xff0c;然后再在下游的子任务上进行微调。当前面临的问题&#xff1a;在NLP领域&#xff0c;有各种各样的下游任务。目前&…

c++ 构造函数详细介绍

c对象的创建 c对象的创建一般分为以下三个阶段&#xff1a; 分配内存&#xff1a; ■ 在堆区、栈区或者全局数据区留出足够多的字节。这个时候的内存还比较“原始”&#xff0c;没有被“教化”&#xff0c;它所包含的数据一般是零值或者随机值&#xff0c;没有实际的意义&…

使用Java版工程行业管理系统源码,提升工程项目的综合管理能力

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

Java------数据结构之栈与队列(简单讲解)

本篇碎碎念&#xff1a;时隔n个月&#xff0c;继续写博客&#xff0c;假期落下的进度&#xff0c;在开学后努力追赶&#xff0c;假期不努力&#xff0c;开学徒伤悲啊&#xff0c;此时此刻真想对自己说一句&#xff0c;活该啊~~~~ 欠下的链表练习题讲解会在下次更新~~~~ 今日份励…

Day53| 1143 最长公共子序列 1035 不相交的线 53 最大子序和 动态规划

目录 1143 最长公共子序列 1035 不相交的线 53 最大子序和 动态规划 1143 最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() 1, vector<int>(text2.si…

Ubuntu20.04 安装fcitx5输入法

序 ubuntu 20.04.3下fcitx5 需要从flatpak安装&#xff0c;&#xff08;由于qt版本&#xff0c;fcitx5-config只能安装在20.10上&#xff09;&#xff0c;中间出了各种问题&#xff0c;最后发现以下解决方案最好&#xff1a; 安装flatpak (建议使用官方ppa,版本较新) 1 2 3 …

应届生/实习生租房经验帖

前言 作者&#xff1a;晓宜 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 博主本人在杭州互联网小镇和北京中关村都实习过一段时间&#xff0c;分享下租房的经历&#xff0c;以及在这过程中踩的坑…

视频素材库网站下载的地方在哪里?

视频素材库网站下载的地方在哪里&#xff1f;这是很多短视频创作者都会遇到的问题。别着急&#xff0c;今天我就来给大家介绍几个视频素材库网站下载的好去处&#xff0c;让你的视频创作更加轻松有趣&#xff01; 蛙学网&#xff1a;视频素材库网站下载的一定要选择蛙学网啦&am…