当前位置: 首页 > news >正文

基于A7核开发板的串口实现控制LED亮灭

1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作

1>例如在串口输入led1on,开饭led1灯点亮

2>例如在串口输入led1off,开饭led1灯熄灭

3>例如在串口输入led2on,开饭led2灯点亮

4>例如在串口输入led2off,开饭led2灯熄灭

5>例如在串口输入led3on,开饭led3灯点亮

6>例如在串口输入led3off,开饭led3灯熄灭

2.编程要求:

1)结构体封装

typedef struct{

char* cmd_arr; //命令行字符串

gpio_t* gpiox;//GPIO组号

unsigned int pin; //引脚编号

status_t status; //LED灯状态

void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status); //处理LED状态的函数指针

}cmd_t;

头文件:

#ifndef __NEW_H__
#define __NEW_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
//led初始化
void led_init();
void led1_init();
void led2_init();
void led3_init();//uart初始化
void uart4_init();
//接收一个字符
char get_char();
//接收一串字符
char *get_string();
//发送一个字符
void put_char(const char ch);
//发送一个字符串
void put_string(const char *sr);typedef enum{GPIO_RESET_T,GPIO_SET_T,
}status_t;#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15typedef struct{char* cmd;//命令gpio_t* gpiox;//组号unsigned int pin;//引脚status_t status;//灯的状态void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status);//设置灯的状态
}cmd_t;/*
//灯亮
void led_on(int i);
//灯灭
void led_off(int i);
*/void hal_gpio_write(gpio_t* gpiox,unsigned int pin,status_t status);
cmd_t* find_command(char *string);
//比较字符串
int strcmp(char *arr,const char *src);#endif

源文件:

#include "new.h"
extern void printf(const char *fmt,...);
extern void delay_ms(int ms);
cmd_t cmd_arr[6] = {[0] = {.cmd = "led1on",.gpiox = GPIOE,.pin = GPIO_PIN_10,.status = GPIO_SET_T,.gpio_write_pin = hal_gpio_write,},[1] = {.cmd = "led1off",.gpiox = GPIOE,.pin = GPIO_PIN_10,.status = GPIO_RESET_T,.gpio_write_pin = hal_gpio_write,},[2] = {.cmd = "led2on",.gpiox = GPIOF,.pin = GPIO_PIN_10,.status = GPIO_SET_T,.gpio_write_pin = hal_gpio_write,},[3] = {.cmd = "led2off",.gpiox = GPIOF,.pin = GPIO_PIN_10,.status = GPIO_RESET_T,.gpio_write_pin = hal_gpio_write,},[4] = {.cmd = "led3on",.gpiox = GPIOE,.pin = GPIO_PIN_8,.status = GPIO_SET_T,.gpio_write_pin = hal_gpio_write,},[5] = {.cmd = "led3off",.gpiox = GPIOE,.pin = GPIO_PIN_8,.status = GPIO_RESET_T,.gpio_write_pin = hal_gpio_write,}
};
//led初始化
void led_init()
{/********RCC章节*********/RCC->MP_AHB4ENSETR |= (0x1 << 4);//GPIOE使能   RCC->MP_AHB4ENSETR |= (0x1 << 5);//GPIOF使能led1_init();led2_init();led3_init();
}void led1_init()
{/********GPIO章节********/GPIOE->MODER &= (~(0x3 << 20));GPIOE->MODER |= (0x1 << 20);//输出模式GPIOE->OTYPER &= (~(0x1 << 10));//推挽GPIOE->OSPEEDR &= (~(0x3 << 20));//低速GPIOE->PUPDR &= (~(0x3 << 20));//无上下拉
}void led2_init()
{/********GPIO章节********/GPIOF->MODER &= (~(0x3 << 20));GPIOF->MODER |= (0x1 << 20);//输出模式GPIOF->OTYPER &= (~(0x1 << 10));//推挽GPIOF->OSPEEDR &= (~(0x3 << 20));//低速GPIOF->PUPDR &= (~(0x3 << 20));//无上下拉
}void led3_init()
{/********GPIO章节********/GPIOE->MODER &= (~(0x3 << 16));GPIOE->MODER |= (0x1 << 16);//输出模式GPIOE->OTYPER &= (~(0x1 << 8));//推挽GPIOE->OSPEEDR &= (~(0x3 << 16));//低速GPIOE->PUPDR &= (~(0x3 << 16));//无上下拉
}//uart初始化
void uart4_init()
{/********RCC章节*********/RCC->MP_AHB4ENSETR |= (0x1 << 1);//GPIOB使能RCC->MP_AHB4ENSETR |= (0x1 << 6);//GPIOG使能RCC->MP_APB1ENSETR |= (0x1 << 16);//UART4使能/********GPIO章节********/GPIOB->MODER &= (~(0x3 << 4));GPIOB->MODER |= (0x2 << 4);//复用模式GPIOG->MODER &= (~(0x3 << 22));GPIOG->MODER |= (0x2 << 22);//复用模式GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x8 << 8);//设置复用功能RXGPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x6 << 12);//设置复用功能TX/********uart4章节*******/if(USART4->CR1 & (0x1)){delay_ms(500);USART4->CR1 &= (~(0x1));//禁止UE}USART4->CR1 &= (~(0x1 << 12));USART4->CR1 &= (~(0x1 << 28));//设置8位数据位USART4->CR1 &= (~(0x1 << 10));//无奇偶校验位USART4->CR1 &= (~(0x1 << 15));//x16采样率USART4->CR2 &= (~(0x3 << 12));//无停止位USART4->PRESC &= (~(0xf));//一级分配USART4->BRR = 0x22B;//115200USART4->CR1 |= (0x1 << 2);//读端使能USART4->CR1 |= (0x1 << 3);//写端使能USART4->CR1 |= 0x1;//UE使能}
//接收一个字符
char get_char()
{char ch;//检查接收寄存器是否有数据可读while(!(USART4->ISR & (0x1 << 5)));//接收字符ch = USART4->RDR;put_char(ch);return ch;
}
//接收一串字符
char buf[50] = "";
char *get_string()
{int i;for(i = 0;(buf[i] = get_char()) != '\r';i++);buf[i] = '\0';put_char('\n');put_char('\r');put_string(buf);return buf;
}
//发送一个字符
void put_char(const char ch)
{while(!(USART4->ISR & (0x1 << 7)));USART4->TDR = ch;while(!(USART4->ISR & (0x1 << 6)));
}
//发送一个字符串
void put_string(const char *sr)
{for(int i=0;sr[i] != '\0';i++){put_char(sr[i]);}put_char('\n');put_char('\r');
}
/*
//灯亮
void led_on(int i)
{switch(i){case 1:GPIOE->ODR |= (0x1 << 10);//led1亮break;case 2:GPIOF->ODR |= (0x1 << 10);//led2亮break;case 3:GPIOE->ODR |= (0x1 << 8);//led3亮break;}
}//灯灭
void led_off(int i)
{switch(i){case 1:GPIOE->ODR &= (~(0x1 << 10));//led1灭break;case 2:GPIOF->ODR &= (~(0x1 << 10));//led2灭break;case 3:GPIOE->ODR &= (~(0x1 << 8));//led3灭break;}
}*/
//比较字符串
int strcmp(char *arr,const char *src)
{while(*arr != '\0' || *src != '\0'){if(*arr == *src){arr++;src++;}else{return (*arr - *src);}}return 0;
}void hal_gpio_write(gpio_t* gpiox,unsigned int pin,status_t status)
{if(1 == status) gpiox->ODR |= (0x1 << pin);elsegpiox->ODR &= (~(0x1 << pin));
}cmd_t* find_command(char *string)
{for(int i=0;i < 6;i++){if(strcmp(cmd_arr[i].cmd,string) == 0){return &cmd_arr[i];}}return 0;
}

Main文件:

#include "new.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}int main()
{led_init();uart4_init();put_string("start....");while(1){char *string = get_string();cmd_t *arr = find_command(string);if(0 == arr){printf("error commond\n");}else{arr->gpio_write_pin(arr->gpiox,arr->pin,arr->status);}        }return 0;
}

实现效果:

相关文章:

基于A7核开发板的串口实现控制LED亮灭

1.通过操作Cortex-A7核&#xff0c;串口输入相应的命令&#xff0c;控制LED灯进行工作 1>例如在串口输入led1on,开饭led1灯点亮 2>例如在串口输入led1off,开饭led1灯熄灭 3>例如在串口输入led2on,开饭led2灯点亮 4>例如在串口输入led2off,开饭led2灯熄灭 5>例如…...

HyperGBM用Adversarial Validation解决数据漂移问题

本文作者&#xff1a;杨健&#xff0c;九章云极 DataCanvas 主任架构师 数据漂移问题近年在机器学习领域来越来越得到关注&#xff0c;成为机器学习模型在实际投产中面对的一个主要挑战。当数据的分布随着时间推移逐渐发生变化&#xff0c;需要预测的数据和用于训练的数据分布…...

关基系统三月重保安全监测怎么做?ScanV提供纯干货!

三月重保当前&#xff0c;以政府、大型国企央企、能源、金融等重要行业和领域为代表的关键信息基础设施运营单位都将迎来“网络安全大考”。 对重要关基系统进行安全风险监测并收敛暴露面&#xff0c;响应监管要求进行安全加固&#xff0c;重保期间实时安全监测与数据汇报等具体…...

RK3588关键电路 PCB Layout设计指南

1、音频接口电路 PCB 设计&#xff08;1&#xff09;所有 CLK 信号建议串接 22ohm 电阻&#xff0c;并靠近 RK3588 放置&#xff0c;提高信号质量&#xff1b;&#xff08;2&#xff09;所有 CLK 信号走线不得挨在一起&#xff0c;避免串扰&#xff1b;需要独立包地&#xff0c…...

二分边界详细总结

一、查找精确值 从一个有序数组中找到一个符合要求的精确值&#xff08;如猜数游戏&#xff09;。如查找值为Key的元素下标&#xff0c;不存在返回-1。 //这里是left<right。 //考虑这种情况&#xff1a;如果最后剩下A[i]和A[i1]&#xff08;这也是最容易导致导致死循环的…...

STM32---备份寄存器BKP和 FLASH学习使用

BKP库函数 学习BKP&#xff0c;首先就是知道BKP每一个函数的作用然后如何使用即可 使用备份域的作用只需要操作上面的两个函数即可&#xff0c;其余的都是它的其他功能 BKP简介 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份…...

Python-生成元组和字典

1.生成元组元组是元素按顺序组合后的产物&#xff0c;元组对象的类型是tuple型含有两个元素的元组成为数据对元组可以包含任意数量和任意类型的元素&#xff0c;其元素总数可以为0、1、2等&#xff0c;并且元素的先后顺序是由意义的。另外&#xff0c;元组中的元素类型没有必要…...

I.MX6ULL内核开发10:设备树

目录 一、设备树简介 二、设备树源码 三、获取设备树信息 1、增加设备节点 2、内核编译设备树 3、替换设备树文件 4、查看设备树节点 5、在驱动中获取节点的属性 6、编译驱动模块 7、加载模块 一、设备树简介 设备树的作用是描述一个硬件平台的硬件资源。这个“设备树…...

【大数据】记一次hadoop集群missing block问题排查和数据恢复

问题描述 集群环境总共有2个NN节点&#xff0c;3个JN节点&#xff0c;40个DN节点&#xff0c;基于hadoop-3.3.1的版本。集群采用的双副本&#xff0c;未使用ec纠删码。 问题如下&#xff1a; bin/hdfs fsck -list-corruptfileblocks / The list of corrupt files under path…...

国产音质好的蓝牙耳机有哪些?国产音质最好的耳机排行

随着时间的推移&#xff0c;真无线蓝牙耳机逐渐占据耳机市场的份额&#xff0c;成为人们日常生活中必备的数码产品之一。蓝牙耳机品牌也多得数不胜数&#xff0c;哪些国产蓝牙耳机音质好&#xff1f;下面&#xff0c;我们从音质出来&#xff0c;来给大家介绍几款国产蓝牙耳机&a…...

CTFer成长之路之XSS的魔力

XSS的魔力CTF XSS闯关 题目描述: 你能否过关斩将解决所有XSS问题最终获得flag呢&#xff1f; docker-compose.yml version: "3.2"services:xss:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-xss:latestports:- 3000:3000启动方式 docker-compose up -…...

行锁、表锁、主键外键、表之间的关联关系

Java知识点总结&#xff1a;想看的可以从这里进入 目录2.4、行锁、表锁2.5、主键、外键2.5.1、主键2.5.2、外键2.6、表的关联关系2.4、行锁、表锁 MyISAM默认采用表级锁&#xff0c;InnoDB默认采用行级锁。 表锁&#xff1a;开销小&#xff0c;加锁快&#xff0c;不会出现死锁…...

JavaScript 进阶(面试必备)--charater4

文章目录前言一、深浅拷贝:one: 浅拷贝:two:深拷贝二、异常处理:one: throw 抛异常:two: try /catch 捕获异常:three:debugger三、处理thisthis指向 :one:普通函数this指向this指向 :two: 箭头函数this指向3.2 改变this:one: call():two: apply():three: bind()四、性能优化:on…...

ARM+FPGA架构开发板PCIE2SCREEN示例分析与测试-米尔MYD-JX8MMA7

本篇测评由电子发烧友的优秀测评者“zealsoft”提供。 本次测试内容为米尔MYD-JX8MMA7开发板其ARM端的测试例程pcie2screen并介绍一下FPGA端程序的修改。 ​ 01. 测试例程pcie2screen 例程pcie2screen是配合MYD-JX8MMA7开发板所带的MYIR_PCIE_5T_CMOS 工程的测试例&#…...

51单片机入门 - SDCC / Keil_C51 会让没有调用的函数参与编译吗?

Small Device C Compiler&#xff08;SDCC&#xff09;是一款免费 C 编译器&#xff0c;适用于 8 位微控制器。 不想看测试过程的话可以直接划到最下面看结论&#xff1a;&#xff09; 关于软硬件环境的信息&#xff1a; Windows 10STC89C52RCSDCC &#xff08;构建HEX文件&…...

OpenCV只含基本图像模块编译

编译OpenCV4.5.5只含基本图像模块&#xff0c;环境为Windows10 x64CMake3.23.3VS2019。默认编译选项编译得到的OpenCV库往往大几百MB甚至上GB&#xff0c;本文配置下编译得到的库压缩后得到的zip包大小仅6.25MB&#xff0c;适合使用OpenCV基本图像功能模块的项目移植而不牵涉其…...

Java实现阴历日历表(附带星座)

准备工作 1.无敌外挂(GitHub直达源码) Nobb 直击灵魂 https://github.com/xuyishanBD/Java_create_calendar.git2.maven配置(如果没有走上面的捷径) <dependencies><dependency><groupId>net.sourceforge.javacsv</groupId><artifactId>javac…...

Python入门之最基础

Python入门之最基础 IDLE有两种模式&#xff0c;一种是交互模式&#xff0c;通俗讲就是写一个代码&#xff0c;会得到相应的反馈&#xff0c;另一种为编辑模式. 注意事项&#xff1a; 标点符号一定要用英文符号 要注意缩进 dir(builtins)可以看到python所有的内置函数&#…...

浏览器缓存策略

先走强缓存&#xff0c;再走协商缓存 强缓存 不发送请求&#xff0c;直接使用缓存的内容 状态码200 当前会话没有关闭的话就是走memory cache&#xff0c;否则就是disk cache 由响应头的 Pragma&#xff08;逐渐废弃&#xff0c;优先级最高&#xff09;&#xff0c;catch-…...

高清无码的MP4如何采集?python带你保存~

前言 大家早好、午好、晚好吖 ❤ ~ 又是我,我又来采集小姐姐啦~ 这次我们采集的网站是(看下图): 本文所有模块\环境\源码\教程皆可点击文章下方名片获取此处跳转 话不多少,我们赶快开始吧~ 第三方模块: requests >>> pip install requests 如果安装python第三方模块…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...