2月24日作业

news2025/7/19 6:22:33

题目:

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

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

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

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

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

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

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

编程要求:

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,...........)

}

代码:

mix.h

#ifndef __MIX_H__                                                                      
#define __MIX_H__                                                                      
                                                                                       
#include "stm32mp1xx_rcc.h"                                                            
#include "stm32mp1xx_gpio.h"                                                           
#include "stm32mp1xx_uart.h"                                                           
#include "gpio.h"                                                                      
typedef struct                                                                         
{                                                                                      
    char* cmd_arr;                                                                     
    gpio_t* gpiox;                                                                     
    unsigned int pin;                                                                  
    gpio_status_t status;                                                              
    void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,gpio_status_t status);        
}cmd_t;                                                                                
void hal_mix_rcc();                                                                    
void hal_mix_gpio();                                                                   
void hal_mix_uart();                                                                   
void func();                                                                           
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t status);              
cmd_t* find_command(const char* str);                                                  
char *get_string();                                                                    
#endif                                                                                 
                                                                                       

mix.c

#include "mix.h"

extern void delay_ms(int ms);
cmd_t cmd_arr[6]=
{
    [0]={
        .cmd_arr="led1on",
        .gpiox=GPIOE,
        .pin=GPIO_PIN_10,
        .status=GPIO_SET_T,
        .gpio_write_pin=hal_gpio_write,
    },
    [1]={
        .cmd_arr="led1off",
        .gpiox=GPIOE,
        .pin=GPIO_PIN_10,
        .status=GPIO_RESET_T,
        .gpio_write_pin=hal_gpio_write,
    },
    [2]={
        .cmd_arr="led2on",
        .gpiox=GPIOF,
        .pin=GPIO_PIN_10,
        .status=GPIO_SET_T,
        .gpio_write_pin=hal_gpio_write,
    },
    [3]={
        .cmd_arr="led2off",
        .gpiox=GPIOF,
        .pin=GPIO_PIN_10,
        .status=GPIO_RESET_T,
        .gpio_write_pin=hal_gpio_write,
    },
    [4]={
        .cmd_arr="led3on",
        .gpiox=GPIOE,
        .pin=GPIO_PIN_8,
        .status=GPIO_SET_T,
        .gpio_write_pin=hal_gpio_write,
    },
    [5]={
        .cmd_arr="led3off",
        .gpiox=GPIOE,
        .pin=GPIO_PIN_8,
        .status=GPIO_RESET_T,
        .gpio_write_pin=hal_gpio_write,
    }
};

void hal_mix_rcc()
{
    RCC->MP_AHB4ENSETR|=(0x1<<1);
    RCC->MP_AHB4ENSETR|=(0x1<<4);
    RCC->MP_AHB4ENSETR|=(0x1<<5);
    RCC->MP_AHB4ENSETR|=(0x1<<6);

    RCC->MP_APB1LPENSETR|=(0x1<<16);
}
void hal_mix_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);
    GPIOG->AFRH&=(~(0xf<<12));
    GPIOG->AFRH|=(0x6<<12);

    GPIOE->MODER&=(~(0x3<<20));
    GPIOE->MODER|=(0x1<<20);
    GPIOF->MODER&=(~(0x3<<20));
    GPIOF->MODER|=(0x1<<20);
    GPIOE->MODER&=(~(0x3<<16));
    GPIOE->MODER|=(0x1<<16);

    GPIOE->OTYPER&=(~(0x1<<10));
    GPIOF->OTYPER&=(~(0x1<<10));
    GPIOE->OTYPER&=(~(0x1<<8));

    GPIOE->OSPEEDR&=(~(0x3<<20));
    GPIOF->OSPEEDR&=(~(0x3<<20));
    GPIOE->OSPEEDR&=(~(0x3<<16));

    GPIOE->PUPDR&=(~(0x3<<20));
    GPIOF->PUPDR&=(~(0x3<<20));
    GPIOE->PUPDR&=(~(0x3<<16));
}
void hal_led_on(int num)
{
    switch(num)
    {
    case 1:
        GPIOE->ODR|=(0x1<<10);
        break;
    case 2:
        GPIOF->ODR|=(0x1<<10);
        break;
    case 3:
        GPIOE->ODR|=(0x1<<8);
        break;
    }
}
void hal_led_off(int num)
{
    switch(num)                   
    {                             
    case 1:                   
        GPIOE->ODR&=(~(0x1<<10));
        break;                
    case 2:                   
        GPIOF->ODR&=(~(0x1<<10));
        break;                
    case 3:                   
        GPIOE->ODR&=(~(0x1<<8)); 
        break;                
    }                            
}
void hal_mix_uart()
{
    delay_ms(20);
    USART4->CR1&=(~(0x1<<0));

    USART4->CR1&=(~(0x1<<28));
    USART4->CR1&=(~(0x1<<12));
    USART4->CR1&=(~(0x1<<15));
    USART4->CR1&=(~(0x1<<10));

    USART4->CR2&=(~(0x3<<12));

    USART4->PRESC&=(~(0xf<<0));

    USART4->BRR=0x22B;

    USART4->CR1|=(0x1<<3);
    USART4->CR1|=(0x1<<2);
    USART4->CR1|=(0x1<<0);
}
void put_char(const char ch)
{
    while(!(USART4->ISR&(0x1<<7)));
    USART4->TDR=ch;
    while(!(USART4->ISR&(0x1<<6)));
}
void put_string(const char *string)
{
    int i=0;
    char ch;
    while(1)
    {
        ch=string[i];
        put_char(ch);
        if(ch=='\0')
        {
            break;
        }
        i++;
    }
}
char get_char()
{
    char ch;
    while(!(USART4->ISR&(0x1<<5)));
    ch=USART4->RDR;    
    return ch;
}
char buffer[20];
char *get_string()
{
    for(int i=0;i<19;i++)
    {
        buffer[i]=get_char();
        put_char(buffer[i]);
        if(buffer[i]=='\r')
        {
            put_char('\n');
            buffer[i]='\0';
            break;
        }
    }
    return buffer;    
}
int my_strcmp(const char *a,char *b)
{
    int i=0;
    int j=0;
    while(*(a+i)!='\0'&&*(b+j)!='\0'&&*(a+i)==*(b+j))
    {
        i++;
        j++;
    }
    return *(a+i)-*(b+j);
}
void buffer_clear()
{
    for(int i=0;i<20;i++)
    {
        buffer[i]=0;
    }
}
void func()
{
    get_string();
    if(my_strcmp(buffer,"led1on")==0)
    {
        hal_led_on(1);
    }
    else if(my_strcmp(buffer,"led1off")==0)
    {
        hal_led_off(1);
    }
    else if(my_strcmp(buffer,"led2on")==0)
    {
        hal_led_on(2);
    }
    else if(my_strcmp(buffer,"led2off")==0)
    {
        hal_led_off(2);
    }
    else if(my_strcmp(buffer,"led3on")==0)
    {
        hal_led_on(3);
    }
    else if(my_strcmp(buffer,"led3off")==0)
    {
        hal_led_off(3);
    }
}
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t status)
{
    if(status==GPIO_SET_T)
    {
        gpiox->ODR|=(0x1<<pin);
    }
    else
    {
        gpiox->ODR&=(~(0x1<<pin));
    }
}
cmd_t* find_command(const char* str)
{
    //串口中输入的字符串,与结构体中每个元素中的cmd_arr变量进行比较
    //遍历比较,自己编写strcmp比较的函数 
    
    for(int i=0;i<6;i++)
    {
        if(my_strcmp(str,cmd_arr[i].cmd_arr)==0)
        {
            return &cmd_arr[i];
        }
    }
    return 0;//失败返回0                   
}

main.c

 #include "mix.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()
 {
     hal_mix_rcc();                                           
     hal_mix_gpio();                              
     hal_mix_uart();                              
     cmd_t* cmd_arr1;
     while(1)
     {
         char* string = get_string();
         cmd_arr1 = find_command(string);
         if(cmd_arr1 == 0){                                   
              printf("find warning\n");                       
         }else
         {
               cmd_arr1->gpio_write_pin(cmd_arr1->gpiox,\
                                        cmd_arr1->pin,\
                                        cmd_arr1->status);    
         }
                                                              
     }
     return 0;
 }
                                                              

运行结果:

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

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

相关文章

day20_Map

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、比较器排序 三、Collections 四、Map 五、HashMap 六、TreeMap 零、 复习昨日 HashSet 不允许重复元素,无序 HashSet去重原理: 先比较hashco…

Java知识复习(二)Java集合

1、List、Set和Map的区别 List&#xff1a;存储的顺序是有序的、可重复的Set&#xff1a;存储的顺序是无序的、不可重复的Map&#xff1a;使用键值对存储&#xff0c;Key和Value都是无序的&#xff0c;其中Key不可重复&#xff0c;而Value可重复 2、ArrayList和LinkedList的区…

node报错

记录bug:运行 npx -p storybook/cli sb init 时报错gyp info spawn C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exegyp info spawn args [gyp info spawn args build/binding.sln,gyp info spawn args /nologo,gyp info spawn args…

OpenCV只含基本图像模块编译

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

电子技术——伯德图与反馈

电子技术——伯德图与反馈 增益和相位边距 从上两节我们知道环路增益 AβA\betaAβ 可以决定一个系统的稳定性&#xff0c;一个更加简单和有效的方法是我们可以绘制 AβA\betaAβ 的伯德图&#xff08;因为相位可以达到360度&#xff0c;因此这是一个四阶响应系统&#xff09;…

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

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

KTV「消亡史」:辉煌、挫折与新生

【潮汐商业评论/原创】这是Ina工作的第五年&#xff0c;疫情之后&#xff0c;第一场大学同学聚会就定在了周末。同学群里大家热烈地讨论着聚会的地点&#xff0c;“要不咱们去KTV吧&#xff0c;哈哈哈哈哈哈”&#xff0c;突然有人提议到。“谁还去KTV啊”“多没意思啊”……随…

按字典序排列的最小的等价字符串[拆解并查集]

并查集前言一、按字典序排列的最小的等价字符串二、并查集总结参考文献前言 并查集有什么用&#xff1f;并查集是什么&#xff1f;搞懂这两个问题&#xff0c;相关的并查集问题就变得非常easy&#xff01; 一、按字典序排列的最小的等价字符串 二、并查集 有一种方法&#x…

工单模型的理解与应用

工单&#xff08;任务单&#xff09;模型的定义 工单模型是一种分派任务的方法&#xff0c;可以用来跟踪、评估和报告任务的完成情况。它通常用于针对特定目标的重复性任务或项目&#xff0c;以确保任务能够按时完成并符合期望的标准。   工单模型的基本流程为&#xff1a;提…

GroupDocs.Merger for Java

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

常见激活函数Activation Function的选择

Activation Function激活函数一般会神经网络中隐层和输出层上&#xff0c;其中作用在输出层主要用于适配输出&#xff0c;比如sigmoid函数可用于生成[0,1]之间的概率估计值。而作用于隐层主要用于增加神经网络的非线性&#xff0c;增加了网络的表达能力&#xff0c;本文主要介绍…

测试员拿到新项目怎么着手测试?不要慌,照做准没错

一、目标 结合公司现有的项目情况制定合理规范的测试流程&#xff0c;提高测试效率和产品质量&#xff0c;尽可能减少客户对产品的问题反馈&#xff0c; 核心还是要加强项目组成员之间的工作交流和沟通&#xff0c;保证整个项目的高效率的按质按量的交付。 二、测试流程说明…

【git】git介绍与安装

Git是什么 Git是目前世界上最先进的分布式版本控制系统 git是由linux的创始人用c语言写的 和集中式比较 历史记录&#xff1a;Git 更加轻量级&#xff0c;每次提交只记录变化&#xff0c;而 SVN 每次提交会存储完整的文件&#xff1b; 版本管理&#xff1a;Git 更加灵活&…

Windows10 下测试 Intel SGX 功能

文章目录参考文献系统要求一、安装Open Enclave SDK 环境&#xff08;一&#xff09;什么是Open Enclave SDK&#xff08;二&#xff09;启动SGX功能方法一&#xff1a; BIOS启动方法二&#xff1a;软件方式启动&#xff08;三&#xff09;安装必要环境&#xff08;1&#xff0…

【微信小程序】-- 其它常用组件介绍 -- button image(八)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

cmake 入门二 库的编译,安装与使用

工程描述 &#xff11;&#xff0c;建立一个静态库和动态库&#xff0c;提供HelloFunc 函数供其他程序编程使用&#xff0c;HelloFunc 向终端输出Hello World字符串。 &#xff12;&#xff0c;安装头文件与共享库。 1 库的工程结构 1.1 工程目录下的CMakeLists.txt PROJECT…

【回眸】记录英飞凌TC397开发项目功能测试流程(包含CAN通信配置)

前言 记录一下从拿到新板子到最终测试的流程 过程 1、包线和接线帽 将大板子的电源接好&#xff0c;用不到的铜插头用美纹纸&#xff08;胶带&#xff09;包起来&#xff0c;防止线束之间相互碰撞导致短路&#xff0c;第一次下载需要把新板子用接线帽来接好&#xff0c;因为…

【论文简述】Learning Optical Flow with Adaptive Graph Reasoning(AAAI 2022)

一、论文简述 1. 第一作者&#xff1a;Haofei Xu 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;AAAI 4. 关键词&#xff1a;光流、图神经网络、自适应 5. 探索动机&#xff1a;现有光流估计方法主要解决基于特征相似性的匹配问题&#xff0c;少有工作研究如何显式…

Linux学习(8)Linux文件与目录管理

以下内容转载自鸟哥的Linux私房菜 绝对路径与相对路径 绝对路径&#xff1a;路径的写法『一定由根目录 / 写起』&#xff0c;例如&#xff1a; /usr/share/doc 这个目录。相对路径&#xff1a;路径的写法『不是由 / 写起』&#xff0c;例如由 /usr/share/doc 要到 /usr/share…

智能化人机协作 遮挡情况下准确识别目标信息

研究背景 废旧产品&#xff08;end-of-life products&#xff09;的拆卸是工程全生命周期管理的一个基本步骤。在减少资源消耗和温室气体排放的同时&#xff0c;回收可重复使用的部件可能创造相当的经济价值&#xff0c;同时也能推动碳中和目标的实现。 但目前EoL的拆卸仍然严…