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

news2025/7/20 22:41:40

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_AHB4ENSETR
	RCC->MP_AHB4ENSETR |= (0x1<<1);   //GPIOB使能
	RCC->MP_AHB4ENSETR |= (0x1<<6);   //GPIOG使能

	//RCC_APB1ENSETR
	RCC->MP_APB1ENSETR |= (0x1<<16);  //UART4使能

	//GPIOB
	GPIOB->MODER &= (~(0x3<<4));  //GPIOB_MODER设置复用功能模式
	GPIOB->MODER |= (0x1<<5);
	GPIOB->AFRL &= (~(0xf<<8));   //设置GPIOB引脚功能复用模式 
	GPIOB->AFRL |= (0x1<<11);

	//GPIOG
	GPIOG->MODER &= (~(0x3<<22));  //GPIOG_MODER设置复用功能模式
	GPIOG->MODER |= (0x1<<23);
	GPIOG->AFRH &= (~(0xf<<12));   //设置GPIOG引脚功能复用模式 
	GPIOG->AFRH |= (0x3<<13);

	//uart初始化
	USART4->CR1 &= (~(0x1<<0));   //判断UE是否等于0
	USART4->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_AHB4ENSETR
	if(GPIOX == GPIOE){
		RCC->MP_AHB4ENSETR |= (0x1<<4);   //GPIOE使能
	}else{
		RCC->MP_AHB4ENSETR |= (0x1<<5);   //GPIOF使能
	}
	//GPIOX
	GPIOX->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,则再发送一个回车\r
	if(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()
{	
	//初始化UART
	uart_init();
	//初始化LED1
	LED_init(GPIOE,10);
	//初始化LED2
	LED_init(GPIOF,10);
	//初始化LED3
	LED_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.coloradmin.cn/o/368680.html

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

相关文章

苹果电容笔和普通电容笔区别是什么?开学好用电容笔推荐

苹果的电容笔与一般的电容笔有何不同呢&#xff1f;两者的差距并不是很大。不过这款原装的苹果电容笔&#xff0c;重量要普通的电容笔重得多&#xff0c;而且笔尖还有一个特殊的重力感应装置&#xff0c;在其他方面两者并没有太大的差异。但是&#xff0c;由于苹果电容笔的售价…

QT自绘标题和边框

在QT中如果想要自绘标题和边框&#xff0c;一般步骤是&#xff1a; 1&#xff09; 在创建窗口前设置Qt::FramelessWindowHint标志&#xff0c;设置该标志后会创建一个无标题、无边框的窗口。 2&#xff09;在客户区域的顶部创建一个自绘标题栏。 3&#xff09;给窗口绘制一个背…

Hadoop的生成经验调优和基准测试

文章目录&#xff08;1&#xff09;项目经验之HDFS存储多目录&#xff08;2&#xff09;项目经验之集群数据均衡&#xff08;3&#xff09;项目经验之Hadoop参数调优&#xff08;4&#xff09;项目经验之支持LZO压缩配置&#xff08;5&#xff09;项目经验之LZO创建索引&#x…

软考中级--嵌入式系统设计师考试培训教程开始了

1.考试时间: 1.1 上半年5月下旬考试 1.2 下半年11月上旬考试 2.考试内容 2.1 系统基础 满分75分 时间150分钟 2.2 系统设计 满分75分 时间150分钟 3.计划安排 3.1 熟悉考试大纲 3.2 按考纲学习相关内容 整理设计知识 快速学习形成知识印象 3.3 复习整理的知识 …

Hadoop3.3.1完全分布式部署

Hadoop目录Hadoop3.3.1完全分布式部署(一)1、HDFS一、安装1、基础安装1.1、配置JDK-181.2、下载并解压hadoop安装包本地运行模式测试 eg:2、完全分布式运行模式1、概要&#xff1a;2、编写集群分发脚本&#xff0c;把1~4步安装的同步到其他服务器&#xff1a;2.1、创建脚本vim …

Tailwind CSS 在Vue中的使用

什么是Tailwind CSS&#xff1f; Tailwind CSS 是一个功能类优先的 CSS 框架&#xff0c;它集成了诸如 flex, pt-4, text-center 和 rotate-90 这样的的类&#xff0c;支持 hover 和 focus 样式&#xff0c;它们能直接在脚本标记语言中组合起来&#xff0c;构建出任何设计。 …

【算法基础】 Trie树

一、Trie树Trie树用于高效存储和查找字符串集合的数据结构。二、Trie字符串统计维护一个字符串集合&#xff0c;支持两种操作&#xff1a;I x 向集合中插入一个字符串 x&#xff1b;Q x 询问一个字符串在集合中出现了多少次。共有 N&#xfffd;个操作&#xff0c;所有输入的字…

c#前端实现对pcl点云颜色根据强度特征动态变化突出指定对象

前言 本文主要介绍如何使用c# winform对点云颜色根据点云强度信息对显示的点云颜色进行动态调整。 目的是根据强度信息采用不同的颜色特征突出不同的物体。 一、点云强度是什么&#xff1f; 点云强度又可以叫做反射率&#xff0c; 通常常见的点云格式包括&#xff1a;以pcl为…

SpringBoot可以同时处理多少请求?

本文已收录至我的Github仓库DayDayUP&#xff1a;github.com/RobodLee/DayDayUP&#xff0c;欢迎Star ⭐⭐⭐⭐⭐转载请注明出处&#xff1a;https://blog.csdn.net/weixin_43461520/article/details/129207427 前言 前两天面试的时候&#xff0c;面试官问我&#xff1a;一个i…

【拿好了!Linux 运维必备的 13 款实用工具!】

​本文介绍几款 Linux 运维比较实用的工具&#xff0c;希望对 Linux 运维人员有所帮助。 查看进程占用带宽情况 – Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a; http://sourceforge.net/projects/nethogs/files/ne…

NPDP认证|产品研发过程中,产生冲突怎么办?

随着传统行业在研发过程中牵涉到很多利益相关方,这些相关方在产品研发过程中关注角度的不同,会产生各种各样的矛盾冲突&#xff0c;如研发与产品的冲突、运营与产品的冲突、客户与产品的冲突&#xff0c;那么产生冲突的原因是什么呢&#xff1f; 产生冲突的原因&#xff1f; 1…

Redis:实现全局唯一ID

Redis&#xff1a;实现全局唯一ID一. 概述二. 实现&#xff08;1&#xff09;获取初始时间戳&#xff08;2&#xff09;生成全局ID三. 测试为什么可以实现全局唯一&#xff1f;其他唯一ID策略补充&#xff1a;countDownLatch一. 概述 全局ID生成器&#xff1a;是一种在【分布式…

墨天轮发布数据库行业报告,创邻科技Galaxybase大放异彩

近日&#xff0c;知名数据库社区墨天轮发布《2022中国数据库行业年度分析报告》&#xff0c;该报告由墨天轮联合业界专家学者共同编写&#xff0c;共122页&#xff0c;详细总结了2022年数据库行业产学研用的发展近况、挑战以及对未来趋势的展望。旨在于给数据库行业带来有价值的…

Hadoop命令大全

HDFS分布式文件系统 &#xff0c; 将一个大的文件拆分成多个小文件存储在多台服务器中 文件系统&#xff1a; 目录结构&#xff08;树状结构&#xff09; "/" 树根&#xff0c; 目录结构在namenode中维护 目录 1.查看当前目录 2.创建多级目录 3.上传文件 4.查…

狂神说:面向对象(二)

一、创建与初始化对象new分配内存空间、默认初始化、构造器调用二、构造器特点&#xff1a;1. 没有返回值 2. 方法名与类名相同类里面啥都没写的时候&#xff0c;new一个这个类对象&#xff0c;java会生成一个默认构造函数&#xff08;构造器&#xff09;&#xff1a;构造器核心…

公司新招了个腾讯5年经验的测试员,让我见识到什么才是真正的测试天花板····

5年测试&#xff0c;应该是能达到资深测试的水准&#xff0c;即不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;而且还应该能全面掌握数据库等方面的技能&#xff0c;如果技能再高些的话&#xff0c;甚至熟悉分…

Qt 进程间通信

Qt进程间通信的方法&#xff1a; TCP/IPLocal Server/Socket共享内存D-Bus &#xff08;Unix库&#xff09;QProcess会话管理 TCP/IP &#xff1a; 使用套接字的方式&#xff0c;进行通信&#xff08;之前介绍了&#xff0c;这里就不介绍了&#xff09;。 Local Server/Socket…

智能家居之主机--驱动层搭建

智能家居之主机--驱动层搭建bsp-底层驱动bsp_gpiobsp_adcbsp_uartbsp_timer伪调度bsp-底层驱动 bsp_gpio 利用一个config.h的配置文件&#xff0c;把所有要使用的gpio的属性配置好&#xff0c;这样有一个好处&#xff0c;比较集中&#xff0c;也比较好查&#xff0c;不需要一个…

fp32/fp64精度,4/8字节16进制转float/double十进制

1、IEEE-754 32位单精度浮点数&#xff08;4字节&#xff09; 1.1 32位单精度浮点数 其中&#xff0c; 32位16进制数包括1位符号位(SIGN)&#xff0c;8位指数位(EXPONENT)和 23位尾数位(MANTISSA)。 例如&#xff1a; 25.3可以表示为41CA6666&#xff08;0x41为高字节&#xf…

算法第十六期——动态规划(DP)之线性DP

【概述】 线性动态规划&#xff0c;是较常见的一类动态规划问题&#xff0c;其是在线性结构上进行状态转移&#xff0c;这类问题不像背包问题、区间DP等有固定的模板。 线性动态规划的目标函数为特定变量的线性函数&#xff0c;约束是这些变量的线性不等式或等式&#xff0c;目…