基于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 15

typedef 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);//设置复用功能RX

    GPIOG->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;//115200

    USART4->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);
    else
        gpiox->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;
}

实现效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值