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

news/2024/3/29 3:48:44/文章来源:https://blog.csdn.net/Vpipiguai/article/details/129207982

1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作
例如在串口输入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);

}cmd_t;

2)结构体数组

方式1:cmd_t cmd_arr[6] = {{"led1off",GPIOE,GPIO_PIN_10,GPIO_RESET_T},{},};

cmd_t cmd_arr[6] = {

[0] ={ .cmd_arr = "led1off", .gpiox = GPIOE, .pin = GPIO_PIN_10, .status = GPIO_RESET_T, .gpio_write_pin = hal_gpio_write, }, [1] = {}, [2] = {}, };

3)在串口输入一个字符串

1>在串口输入一个字符串,需要定义一个变量接收,串口接收到的字符串 char* string = uart_get_string();

2>串口中输入的字符串,与结构体中每个元素中的cmd_arr变量进行比较

3>如果比较成功,代表查到输入的字符串 思考:函数实现如何编写?

cmd_t* find_command(const char* str) {

//串口中输入的字符串,与结构体中每个元素中的cmd_arr变量进行比较

//遍历比较,自己编写strcmp比较的函数 return 0;

//失败返回0 }

4)思考main.c函数编写

cmd_t* cmd_arr;

char* string = uart_get_string();

cmd_arr = find_command(string);

if(cmd_arr == 0)

{

查找失败

}else {

cmd_arr->gpio_write_pin(cmd_arr->gpiox,...........)

}

头文件

#ifndef __TEST_H__
#define __TEST_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
#include "gpio.h"typedef struct{char* cmd_str;  //命令行字符串gpio_t* gpiox;  //GPIO组号unsigned int pin;  //引脚编号gpio_status_t status;  //LED灯状态void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,gpio_status_t status);
}cmd_t;//UART初始化
void uart_init();
//LED初始化
void LED_init(gpio_t* GPIOX,unsigned int PIN);
//发送一个字符
void put_char(const char ch);
//接收一个字符
char get_char();
//发送一个字符串
void put_string(const char* str);
//接收一个字符串
char* get_string();
//点亮LED
void LED_lighting(gpio_t* GPIOX,unsigned int PIN,gpio_status_t status);
//字符串比较函数
int strcmp(const char* string,const char* arr_string);
cmd_t* find_command(const char* str);#endif


源文件

#include "test.h"cmd_t cmd_arr[6] = {                                     [0] ={                                               .cmd_str = "led1on",                             .gpiox = GPIOE,                                  .pin = gpio_PIN_10,                              .status = gpio_set,                              .gpio_write_pin = LED_lighting,                  },                                                   [1] ={                                               .cmd_str = "led1off",                            .gpiox = GPIOE,                                  .pin = gpio_PIN_10,                              .status = gpio_reset,                            .gpio_write_pin = LED_lighting,                  },                                                   [2] ={                                               .cmd_str = "led2on",                             .gpiox = GPIOF,                                  .pin = gpio_PIN_10,                              .status = gpio_set,                              .gpio_write_pin = LED_lighting,                  },                                                   [3] ={                                               .cmd_str = "led2off",                            .gpiox = GPIOF,                                  .pin = gpio_PIN_10,                              .status = gpio_reset,                            .gpio_write_pin = LED_lighting,                  },                                                   [4] ={                                               .cmd_str = "led3on",                             .gpiox = GPIOE,                                  .pin = gpio_PIN_8,                               .status = gpio_set,                              .gpio_write_pin = LED_lighting,                  },                                                   [5] ={                                               .cmd_str = "led3off",                            .gpiox = GPIOE,                                  .pin = gpio_PIN_8,                               .status = gpio_reset,                            .gpio_write_pin = LED_lighting,                  }                                                    
};                                                       //UART初始化
void uart_init(){//RCC_AHB4ENSETRRCC->MP_AHB4ENSETR |= (0x1<<1);   //GPIOB使能RCC->MP_AHB4ENSETR |= (0x1<<6);   //GPIOG使能//RCC_APB1ENSETRRCC->MP_APB1ENSETR |= (0x1<<16);  //UART4使能//GPIOBGPIOB->MODER &= (~(0x3<<4));  //GPIOB_MODER设置复用功能模式GPIOB->MODER |= (0x1<<5);GPIOB->AFRL &= (~(0xf<<8));   //设置GPIOB引脚功能复用模式 GPIOB->AFRL |= (0x1<<11);//GPIOGGPIOG->MODER &= (~(0x3<<22));  //GPIOG_MODER设置复用功能模式GPIOG->MODER |= (0x1<<23);GPIOG->AFRH &= (~(0xf<<12));   //设置GPIOG引脚功能复用模式 GPIOG->AFRH |= (0x3<<13);//uart初始化USART4->CR1 &= (~(0x1<<0));   //判断UE是否等于0USART4->CR1 &= (~(0x1<<12));  USART4->CR1 &= (~(0x1<<28));   //设置数据位宽度为8位USART4->CR2 &= (~(0x3<<12));   //设置1位停止位USART4->CR1 &= (~(0x1<<15));   //设置16倍采样率USART4->CR1 &= (~(0x1<<10));   //设置串口无奇偶位USART4->BRR = 0x22B;USART4->CR1 &= (~(0x1<<3));  USART4->CR1 |= (0x1<<3);   //发送使能USART4->CR1 &= (~(0x1<<2)); USART4->CR1 |= (0x1<<2);   //接收器使能USART4->PRESC &= (~(0xf<<0));  //一级分配USART4->CR1 |= (0x1<<0);   //UART使能
}//LED初始化
void LED_init(gpio_t* GPIOX,unsigned int PIN){//RCC_AHB4ENSETRif(GPIOX == GPIOE){RCC->MP_AHB4ENSETR |= (0x1<<4);   //GPIOE使能}else{RCC->MP_AHB4ENSETR |= (0x1<<5);   //GPIOF使能}//GPIOXGPIOX->MODER &= (~(0x3<<(PIN*2)));   //设置输出模式GPIOX->MODER |= (0x1<<(PIN*2));GPIOX->OTYPER &= (~(0x1<<PIN));  //设置推挽输出GPIOX->OSPEEDR &= (~(0x3<<(PIN*2))); //设置低速输出模式GPIOX->PUPDR &= (~(0x3<<(PIN*2)));  //设置禁止上下拉电阻}
//发送一个字符
void put_char(const char ch){//判断发送寄存器是否为空while(!(USART4->ISR & (0x1<<7)));//将数据放入发送寄存器中USART4->TDR = ch;//如果字符是\n,则再发送一个回车\rif(ch == '\n'){while(!(USART4->ISR & (0x1<<7)));USART4->TDR = '\r';}//判断一帧数据是否发送成功while(!(USART4->ISR & (0x1<<6)));}
//接收一个字符
char get_char(){char ch;//判断接收数据寄存器是否为空while(!(USART4->ISR & (0x1<<5)));//将接收到的数据放入接收数据寄存器中ch = USART4->RDR;return ch;
}
//发送一个字符串
void put_string(const char* str){//循环发送字符for(int i=0; str[i]!='\0'; i++){put_char(str[i]);}put_char('\n');put_char('\r');
}
char buf[50]={0};
//接收一个字符串
char* get_string(){int i = 0;for(i=0; (buf[i]=get_char()) != '\r';i++){put_char(buf[i]);}buf[i]='\0';put_char('\n');put_char('\r');return buf;
}
//点亮LED
void LED_lighting(gpio_t* GPIOX,unsigned int PIN,gpio_status_t status){if(status == gpio_set){    //如果num=1,则点亮灯GPIOX->ODR |= (0x1<<PIN);}else{          //否则熄灭灯GPIOX->ODR &= (~(0x1<<PIN));}
}
//字符串比较函数
int strcmp(const char* string,const char* arr_string){while((*string != '\0') && (*arr_string != '\0')){if(*string > *arr_string){return *string-*arr_string;}else if(*string < *arr_string){return *string-*arr_string;}string++;arr_string++;}return 0;
}
cmd_t* find_command(const char* str){for(int i=0; i<6;i++){if(strcmp(str,cmd_arr[i].cmd_str)==0){return &cmd_arr[i];}}return 0;
}


main.c

#include "test.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()
{	//初始化UARTuart_init();//初始化LED1LED_init(GPIOE,10);//初始化LED2LED_init(GPIOF,10);//初始化LED3LED_init(GPIOE,8);put_string("UART AND LED TEST!!!");while(1){cmd_t* cmd_p;char* string = get_string();cmd_p = find_command(string);   //让接收到的字符串进行比较if(cmd_p == 0){printf("输入错误\n");}else{cmd_p->gpio_write_pin(cmd_p->gpiox,cmd_p->pin,cmd_p->status);}}return 0;
}

运行结果

 

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

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

相关文章

LabVIEW主VI前面板中显示或使用多个子VI

LabVIEW主VI前面板中显示或使用多个子VI想在程序中连接一个或多个子VI的前面板&#xff0c;但是当调用它们时&#xff0c;每个子VI在计算机屏幕上显示为一个新窗口。那么怎么能让每个子VI作为主VI前面板的一部分进行显示&#xff0c;而不是在屏幕上显示多个窗口&#xff1f;正在…

Malware Dev 00 - Rust vs C++ 初探

写在最前 如果你是信息安全爱好者&#xff0c;如果你想考一些证书来提升自己的能力&#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a; https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助&#xff0c;并分享学习和实践过程…

mysql 内存架构

1. 背景 从 innodb 的整体架构中可以知道 innodb 的内存架构中分为 buffer pool 缓存区, change pool 修改缓冲区, adaptive hash index 自适应哈希索引, 和 log buffer 日志缓冲区. 2. buffer pool buffer pool 是用于缓冲磁盘页的数据&#xff0c;mysql 的80%的内存会分配给…

GroupDocs.Merger for Java

GroupDocs.Merger for Java GroupDocs.Merger for Java是一个文档操作API&#xff0c;可帮助您合并、拆分、交换或删除文档页面。API通过启用或禁用密码提供保护&#xff0c;并允许开发人员加入PDF、Microsoft Word、Excel和Powerpoint文档。 支持的文件格式 Microsoft Office格…

内存管理框架---Slab(二)

站在Arnold Lu南京大佬的肩膀&#xff0c;俯瞰内存管理之slab 文章目录slab层的由来slab/slub/slobslab层的设计思想slab相关数据结构创建slab描述符分配slab对象释放slab对象销毁缓存在内核栈上的静态分配高端内存的映射永久映射临时映射每个CPU的分配新的每个CPU接口编译时的…

为什么需要这个岗位,软件测试是干什么

目录 一、软件测试概念 二、软件测试目的 三、软件测试基本原则 四、软件测试主要工作内容 五、软件测试方法 六、测试工程师的职责 七、为什么要软件测试这个岗位 一、软件测试概念 软件测试&#xff1a;为了发现软件错误和缺陷&#xff08;统称bug&#xff09;而执行…

浅谈liunx init.d 和 rc.local 两种起动方式

浅谈liunx init.d 和 rc.local 两种起动方式 以rabbitmq 举例 &#xff08;一&#xff09;.init.d 方式 开机自动重启设置 1.在/etc/init.d 目录下新建一个 rabbitmq [rootlocalhost init.d]# vi rabbitmq具体脚本如下所示&#xff1a; #!/bin/bash # # chkconfig: 2345 …

全球智慧能源解决方案服务商「雄韬股份」牵手企企通,谱写采购数字化变革之路

近日&#xff0c;全球知名智慧能源解决方案服务商「深圳市雄韬电源科技股份有限公司」&#xff08;以下简称“雄韬股份”&#xff09;与企企通达成合作。本次合作&#xff0c;企企通将为雄韬股份提供专业的采购数字化解决方案&#xff0c;推动企业采购更加智能、高效、透明&…

计算机网络(2)从十六进制的ip数据报中得到详细字段信息

本博文介绍如何将十六进制的ip报文拆分出具体的字段信息。社会计算机网络和网络协议分析的初学者参考&#xff08;今天看了网络协议分析期末复习重点的最后一个大题&#xff0c;竟然一头雾水&#xff0c;然后快马加鞭翻阅各种资料&#xff0c;然后差不多学会 了&#xff09;wir…

浏览器输入www.baidu.com后执行的全部过程

日升时奋斗&#xff0c;日落时自省 <1>URL输入 URL称为 : 统一资源定位符,用于定位互联网上的资源,也就是平常提起的"网址" 地址栏输入网址之后按下回车,浏览器会对输入的信息进行评判 (1)检查输入的内容是否是是一个合法的网址连接(非法地址不行) (2)合法的…

Python Unittest框架

1、unittest简介 unittest是Python自带的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件,主要适用于单元测试,可以用来作自动化测试框架的用例组织执行框架。 2、unittest框架的特性: 提供用例组织与执行:当测试用例只有几条的时候可以不考虑…

Nginx 02篇——Nginx基本配置与参数说明篇

Nginx 02篇——Nginx基本配置与参数说明篇前言-默认配置文件1. 前言——关于nginx1.1 关于nginx1. 2 Nginx 01篇——Nginx安装2. Nginx 配置文件结构2.1 Nginx 安装后的默认文件2.2 Nginx 的三大组成部分3. 配置参说明-1——整个配置3.1 配置说明3.2 参考4. 配置说明-2—详细说…

postgres 源码解析51 LWLock轻量锁--2

本篇将着重讲解LWLock涉及的主要API工作流程与实现原理&#xff0c;相关基础知识见回顾&#xff1a;postgres 源码解析50 LWLock轻量锁–1 API介绍 函数API功能CreateLWLocks分配LWLocks所需的内存并进行初始化LWLockNewTrancheId分配新的Tranche ID,供用户使用Extension模块…

结构效度分析流程

结构效度分析流程如下图 一、结构效度的意义 效度分析在学术研究中非常常见&#xff0c;结构效度是为了分析“从量表获得的结果与设计该量表时所假定的理论之间的符合程度”。简单来讲&#xff0c;在研究者设计量表之初&#xff0c;一般会预设好几个维度&#xff0c;在经过因子…

kafka入门到精通

文章目录一、kafka概述&#xff1f;1.定义1.2消息队列1.2.1 传统消息队列的使用场景1.2.2 消息队列好处1.2.3 消息队列两种模式1.3 kafka基础架构二、kafka快速入门1.1使用docker-compose安装kafka1.2测试访问kafka-manager1.3 查看kafka版本号1.4 查看zookeeper版本号1.5 扩展…

python学习之OpenCV-Python模块的部分应用示例(生成素描图和动漫图)

文章目录前言一、图片转灰度二、对图片进行二值化处理三、对图片去除噪点四、调整图片透明度五、生成素描滤镜效果图&#xff08;方法结合应用&#xff09;六、生成动漫卡通滤镜效果图&#xff08;方法结合应用&#xff09;总结前言 OpenCV 是一个图像和视频处理库&#xff0c…

掌握饮食健康:了解你的宏量营养素摄入

谷禾健康 // 俗话说“病从口入”&#xff0c;我们的健康状况很大一部分取决于饮食。而食物基本上是由各种营养素构成的。 宏量营养素是人体大量需要的必需营养成分。宏量营养素指的是“三大”营养素&#xff1a;蛋白质、脂肪和碳水化合物&#xff0c;它们是我们饮食中的关键。 …

【JavaScript】基本语法大全

前言&#xff1a; 大家好&#xff0c;我是程序猿爱打拳。在学习C和Java这样的后端编程语言后&#xff0c;我们大概率会学习一些关于前端的语言如HTMLJavaScript。又因为前后端基本语法有些许不同&#xff0c;因此我整理出来。今天给大家讲解的是JS中的数据类型、运算符、选择结…

【华为OD机试模拟题】用 C++ 实现 - 最低位排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

Eth-trunk :LACP模式链路聚合实战

Eth-trunk : LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 &#xff0c;网段为192.168.10.0 /24PC2和PC4数据vlan20 &#xff0c;网段为192.168.20.0 /24确保设备之间互联互通&#xff0c;使用最大互联带宽并没有环路确保相同网段的PC可以互通判断交换机之间的每个端口…