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

news2025/7/19 11:15:19

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 __UART_LED_H__
#define __UART_LED_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
#include "gpio.h"
typedef struct{
    char * cmd_str;
    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 uart_init();


//发送一个字符
void uart_put_char(const char str);

//发送一个字符串
void uart_put_string(const char *str);

//接收一个字符
char uart_get_char();

//接收一个字符串
char* uart_get_string();

  

void led1_init();
 void led2_init();
 void led3_init();
 //控制LED灯亮灭

#endif

源文件:

#include"uart_led.h"
extern void delay_ms(int ms);

void uart_init()
{
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_AHB4ENSETR |=(0x1<<6);
    RCC->MP_AHB4ENSETR |=(0x1<<16);

    GPIOB->MODER &= (~(0x3<<4));
    GPIOB->MODER |=(0x1<<5);
    GPIOG->MODER &=(~(0x3<<22));
    GPIOG->MODER |=(0x1<<23);

    GPIOB->AFRL &=(~(0xf<<8));
    GPIOB->AFRL |=(0x1<<11);
    GPIOG->AFRH &=(~(0xf<<12));
    GPIOG->AFRH |=(0x6<<12);

    if(USART4->CR1 &=(0x1))
    {
        delay_ms(500);
        USART4->CR1 &= (~(0x1));
    }
    USART4->CR1 &=(~(0x1<<28));
    USART4->CR1 &=(~(0x1<<12));
    USART4->CR1 &=(~(0x1<<15));
    USART4->CR1 &=(~(0x1<<10));
    USART4->CR1 |=(0x1<<3);
    USART4->CR1 |=(0x1<<2);
    USART4->CR2 &=(~(0x3<<12));
    USART4->BRR |=0x22b;
    USART4->PRESC &= (~(0xf));
    USART4->CR1 |=(0x1);

}

//发送一个字符
void uart_put_char(const char str)
{
    while(!(USART4->ISR &(0x1<<7)));
    USART4->TDR =str;
    while(!(USART4->ISR &(0x1<<6)));
}

//发送一个字符串
void uart_put_string(const char *str)
{
    while(!(USART4->ISR &(0x1<<7)));

    int i=0;
    while(str[i]!='\0')
    {
        USART4->TDR = str[i];
        i++;
    }
    
}

//接收一个字符
char uart_get_char()
{
    char ch;
    while(!(USART4->ISR &(0x1<<5)));
    ch=USART4->RDR;
    return ch;
}

//接收一个字符串
char  buffer[50]={0};
char* uart_get_string()
{
    int i=0;
    for(i=0;i<47;i++)
    {
        buffer[i]=uart_get_char();
        uart_put_char(buffer[i]);
        if(buffer[i]=='\r')
            break;
    }


    buffer[i]='\0';
    uart_put_char('\n');
    return buffer;
}

void led1_init()
{

    RCC->MP_AHB4ENSETR |=(0x1<<4);
    GPIOE->MODER &=  (~(0x3<<20));
    GPIOE->MODER|= (0x1<<20);
    GPIOE->OTYPER &= (~(0x1<<10));
    GPIOE->OSPEEDR &= (~(0x3<<20));
    GPIOE->PUPDR &= (~(0x3<<20));

}



void led2_init()
{

    RCC->MP_AHB4ENSETR |=(0x1<<5);
    GPIOF->MODER &=  (~(0x3<<20));
    GPIOF->MODER|= (0x1<<20);
    GPIOF->OTYPER &= (~(0x1<<10));
    GPIOF->OSPEEDR &= (~(0x3<<20));
    GPIOF->PUPDR &= (~(0x3<<20));

}




void led3_init()
{

    RCC->MP_AHB4ENSETR |=(0x1<<4);
    GPIOE->MODER &=  (~(0x3<<16));
    GPIOE->MODER|= (0x1<<16);
    GPIOE->OTYPER &= (~(0x1<<8));
    GPIOE->OSPEEDR &= (~(0x3<<16));
    GPIOE->PUPDR &= (~(0x3<<16));

}


void hal_gpio_write(gpio_t * gpiox,unsigned int pin,status_t status)
{
    if(status==gpio_reset_t)
    {
        gpiox->ODR &= (~(0x1<<pin));
    }else
    {
        gpiox->ODR |= (0x1<<pin);
    }
}

测文件:

#include "uart_led.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++);

}

 cmd_t cmd_arr[6]={

    [0] ={

        .cmd_str ="led1_up",

        .gpiox=GPIOE,

        .pin=GPIO_PIN_10,

        .status=gpio_set_t,

        .gpio_write_pin=hal_gpio_write,

    },

    [1] ={

        .cmd_str ="led1_off",

        .gpiox=GPIOE,

        .pin=GPIO_PIN_10,

        .status=gpio_reset_t,

        .gpio_write_pin=hal_gpio_write,

    },



    [2] ={

        .cmd_str ="led2_up",

        .gpiox=GPIOF,

        .pin=GPIO_PIN_10,

        .status=gpio_set_t,

        .gpio_write_pin=hal_gpio_write,

    },



    [3] ={

        .cmd_str ="led2_off",

        .gpiox=GPIOF,

        .pin=GPIO_PIN_10,

        .status=gpio_reset_t,

        .gpio_write_pin=hal_gpio_write,

    },



    [4] ={

        .cmd_str ="led3_up",

        .gpiox=GPIOE,

        .pin=GPIO_PIN_8,

        .status=gpio_set_t,

        .gpio_write_pin=hal_gpio_write,

    },



    [5] ={

        .cmd_str ="led3_off",

        .gpiox=GPIOE,

        .pin=GPIO_PIN_8,

        .status=gpio_reset_t,

        .gpio_write_pin=hal_gpio_write,

    },





};

cmd_t* find_command(char *str1)

{



    int j,i;



    for( j=0;j<6;j++)

    {

        for(i=0;str1[i]!='\0';i++)

        {

            if(str1[i]!=cmd_arr[j].cmd_str[i])

            {

                break;

            }



        }

        if(str1[i]=='\0')

        {

            return cmd_arr+j;

        }

    }

    return 0;



}

int main()

{

    //串口初始化

    //实现串口数据收发

    led1_init();

    led2_init();

    led3_init();

    uart_init();

    cmd_t* cmd_ack;



    while(1)

    {

        char *str=uart_get_string();

        cmd_ack=find_command(str);

        if(cmd_ack==0)

        {

            printf("查找失败\n");



        }else{

            cmd_ack->gpio_write_pin(cmd_ack->gpiox,cmd_ack->pin,cmd_ack->status);

        }

    }







    return 0;

}

测试结果:

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

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

相关文章

【GlobalMapper精品教程】054:标签(标注)功能案例详解

同ArcGIS标注一样,globalmapper提供了动态标注的功能,称为标签,本文详解标签的使用方法。 文章目录 一、标签配置二、创建标签图层三、标签图层选项1. 标签字段2. 标签样式3. 标签格式4. 标签语言5. 标签优先级一、标签配置 在配置页面的【矢量显示】→标签选项卡下,有标签…

《高性能MySQL》读书笔记(上)

目录 MySQL的架构 MySQL中的锁 MySQL中的事务 事务特性 隔离级别 事务日志 多版本并发控制MVCC 影响MySQL性能的物理因素 InnoDB缓冲池 MySQL常用的数据类型以及优化 字符串类型 日期和时间类型 数据标识符 MySQL的架构 默认情况下&#xff0c;每个客户端连接都…

Java高级编程之Lambda表达式

Lambda表达式 1&#xff0c;语法 利用Lambda 可以更简洁的实现匿名内部类与函数声明与调用&#xff1b;另外&#xff0c;基于Lambda 提供stream 流式处理极大简化对集合的操作 public static void main(String[] args) {//1.标准Lambda使用方式,其中MathOperation为定义的一个…

React 跨域的配置

1、为什么会出现跨域&#xff1f; 浏览器遵循同源政策&#xff08;同源策略三要素&#xff1a;协议相同、域名相同、端口相同&#xff09; 2、配置跨域代理 使用中间件 http-proxy-middleware&#xff08;安装依赖&#xff09; npm install http-proxy-middleware 创建setupP…

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

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

网络协议(八):传输层-TCP(三次握手、四次挥手原理)

网络协议系列文章 网络协议(一)&#xff1a;基本概念、计算机之间的连接方式 网络协议(二)&#xff1a;MAC地址、IP地址、子网掩码、子网和超网 网络协议(三)&#xff1a;路由器原理及数据包传输过程 网络协议(四)&#xff1a;网络分类、ISP、上网方式、公网私网、NAT 网络…

拒绝摆烂!神仙网站Python自学,一路从入门闯到最后,边学边玩

前言给大家推荐3个边玩边学python的网站在刚接触编程&#xff0c;培养对其持续的兴趣是最最重要的事情辣&#xff01;&#xff01;&#xff01;因为前期需要大量的基础代码知识积累&#xff0c;这个过程对于不少人来说还是挺枯燥的&#xff0c;很有可能学到一半就放弃了&#x…

中电金信:金融数字化转型路在何方?这里有答案

近期&#xff0c;媒体大数网整合了业内10份研究报告&#xff0c;详解金融数字化转型的思路、方法与路径。其中「中国电子金融级数字底座“源启”白皮书」也被收录其中。让我们一同阅读文章&#xff0c;探究金融数字化转型相关问题的答案吧。 当前&#xff0c;金融科技正在回归…

大厂跟进ChatGPT,为什么百度“文心一言”成色最好?【快评】

作者 | 曾响铃 文 | 响铃说 赶ChatGPT热度&#xff0c;百度3月初就要发布与ChatGPT类似的人工智能聊天机器人服务“文心一言”&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;&#xff0c;似乎无法提振资本市场对百度的信心。 2022年第四季度及全年未经审计的财报发布…

Python-基础知识

Python是什么 Python是计算机编程语言。 Python是解释型语言&#xff1a;Python在执行时&#xff0c;首先会将.py文件中的源代码转换成Python字节码&#xff0c;然后再由Python虚拟机来执行编译好的字节码。 名词解释 Python解释器&#xff08;Interpreter&#xff09;&#…

Text to image论文精读ALR-GAN:文本到图像合成的自适应布局优化

ALR-GAN是北京工业大学学者提出的一种自适应布局优化生成对抗网络&#xff0c;其可以在没有任何辅助信息的情况下自适应地优化合成图像的布局。 文章发表于2023年&#xff0c;IEEE Transactions on Multimedia&#xff08;TMM&#xff09;期刊&#xff08;CCF B&#xff0c;JCR…

基于Frenet优化轨迹的⾃动驾驶动作规划⽅法

动作规划&#xff08;Motion Control&#xff09;在⾃动驾驶汽⻋规划模块的最底层&#xff0c;它负责根据当前配置和⽬标配置⽣成⼀序列的动作&#xff0c;本⽂介绍⼀种基于Frenet坐标系的优化轨迹动作规划⽅法&#xff0c;该⽅法在⾼速情况下的ACC辅助驾驶和⽆⼈驾驶都具有较强…

浅谈MySQL索引

目录 1.索引的定义 2.索引的原理 3.Hash索引与B Tree索引 4.索引的分类 5.建立索引的注意事项 1.索引的定义 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索…

python常见问题详解

Python python 没有多态&#xff0c;而是鸭子类型 多继承&#xff0c;没有接口&#xff0c;可通过语法糖实现接口的作用 lambda中只能有一句 "/"表示之前的参数是必须是位置参数&#xff0c;”**“表示是后面的必须是关键字参数 Python多进程 Python 多线程是伪多线…

ASE0510SH-ASEMI的MOS管ASE0510SH

编辑-Z ASE0510SH在SOT-89封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为140mΩ&#xff0c;是一款N沟道中低压MOS管。ASE0510SH的最大脉冲正向电流ISM为15A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。ASE0510…

Mac电脑_GitHub提交项目至仓库

第一步&#xff08;准备工作&#xff09;&#xff1a; Mac 电脑自带 git &#xff0c; 无需安装 1. 创建一个项目 demo1 在 github 上 2. 创建 ssh 密钥 打开终端&#xff1a; ssh-keygen -t rsa -C "your_emailyouremail.com" 此处输入两次密码&#xff0c; 直接…

Linux-MYSQL 登录数据库(命令行,图形化) 及 远程登录

命令行登录 &#xff1a;mysql 命令登录数据库语法 &#xff1a; mysql -u用户名 -p密码 -h 连接的数据库服务器的ip [-D] 数据库名 -p 端口注 &#xff1a; 上面的 mysql 命令是指的是 客户端的指令 ~&#xff01;&#xff01;-h &#xff1a; 指的就是 连接数据库服务器的 ip…

并发编程学习篇ReentrantLock设计思想剖析

一、AQS原理剖析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为&#xff0c;比如 等待队列、条件队列、独占获取、共享获取等而这些行为的抽象就是基于AbstractQueuedSynchronizer&#xff08;简称AQS&#xff09;实现的&#xff0c;AQS是一…

如何使用开源 BI 工具 DataEase 实现系列数据分析呢?

当我们使用可视化分析工具制作仪表板时&#xff0c;可能需要制作的仪表板不是单个单个的可视化大屏&#xff0c;而是一系列的仪表板&#xff0c;我们需要用它来产生一个连续性的故事&#xff0c;那么这个时候我们该怎么办呢&#xff1f;例如说总分形式&#xff0c;我们需要一个…

18. linux系统基础

shell 命令解析器 命令解析器作用&#xff1a; 他把在终端上输出的命令 给你解析成内核可以识别的指令&#xff0c;内核 是经过命令解析器的加工 shell在找命令的时候&#xff0c;所包含的路径&#xff0c;就是在这些路径里去 找 找到就执行 找不到就报错 报错 要么 这个命…