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

通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作--->上传CSDN 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led2灯熄灭 5.例如在串口输入led3on,开饭led3灯点亮 6.例如在串口输入led3off,开饭led3灯熄灭

头文件

#include"stm32mp1xx_rcc.h"                                                                           
#include"stm32mp1xx_uart.h"                                                                          
#define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)                                        
                                                                                                     
//寄存器MODER模式初始化                                                                              
typedef enum{                                                                                        
    Input,                                                                                           
    Output,                                                                                          
    Alt_fun,                                                                                         
    Analog,                                                                                          
}gpio_moder_t;                                                                                       
                                                                                                     
//寄存器OTYPER输出类型                                                                               
typedef enum{                                                                                        
    PP,                                                                                              
    OD,                                                                                              
}gpio_otyper_t;                                                                                      
                                                                                                     
//寄存器OSPEEDR输出速度                                                                              
typedef enum{                                                                                        
    LOW,                                                                                             
    MED,                                                                                             
    HIGH,                                                                                            
    VERY_HIGH,                                                                                       
}gpio_ospeedr_t;                                                                                     
                                                                                                     
//寄存器PUPDR是否需要上下拉                                                                          
typedef enum{                                                                                        
    NO_PUPDR,                                                                                        
    PU,                                                                                              
    PD,                                                                                              
    RESERVED,                                                                                        
}gpio_pupdr_t;                                                                                       
                                                                                                     
                                                                                                     
//对gpio引脚状态封装                                                                                 
typedef enum{                                                                                        
    gpio_reset_t,                                                                                    
    gpio_set_t,                                                                                      
}gpio_status_t;                                                                                      
                                                                                                     
//对GPIO进行初始化                                                                                   
typedef struct{                                                                                      
    gpio_moder_t moder; //模式                                                                       
    gpio_otyper_t otyper; //类型                                                                     
    gpio_ospeedr_t speedr; //速度                                                                    
    gpio_pupdr_t pupdr; //是否需要上下拉                                                             
}gpio_init_t;                                                                                        
                                                                                                     
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;                                                                                              
                                                                                                     
                                                                                                     
//对GPIO引脚初始化函数                                                                               
void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin);                                
                                                                                                     
//对GPIO引脚写操作函数                                                                               
void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t state);                             
                                                                                                     
                                                                                                     
                                                                                                     
//初始化                                                                                             
void uart();                                                                                         
                                                                                                     
//发送一个字符                                                                                       
void write_char(char str);                                                                           
                                                                                                     
//发送一个字符串                                                                                     
void write_str(const char *str);                                                                     
                                                                                                     
//接受一个字符                                                                                       
char read_char();                                                                                    
                                                                                                     
//接受一个字符串                                                                                     
char *read_str1();                                                                                   
                                                                                                     
cmd_t* find_command();                                                                               
                                                                                                     
                                                                                                     
                                                                                                     
                                                                                                     
#endif                                                                                               

功能文件

ubuntu@ubuntu:01-点灯实验$ cat src/
do_irq.c  do_irq.o  gpio.c    gpio.o    led.c     led.o     
ubuntu@ubuntu:01-点灯实验$ cat src/
do_irq.c  do_irq.o  gpio.c    gpio.o    led.c     led.o     
ubuntu@ubuntu:01-点灯实验$ cat src/gpio.c
#include "gpio.h"

extern void delay_ms(int ms);
 
 void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin)
 {
     //1.设置GPIO引脚模式
     gpiox->MODER &= (~(0x3 << (pin * 2)));
     gpiox->MODER |= init->moder << (pin * 2);
     //2.设置GPIO引脚输出类型
     gpiox->OTYPER &= (~(0x1 << pin));
     gpiox->OTYPER |= init->otyper << pin;
     //3.设置GPIO引脚的输出速度
     gpiox->OSPEEDR &= (~(0x3 << (pin * 2)));
     gpiox->OSPEEDR |= init->speedr << (pin * 2);
     //4.设置GPIO引脚是否需要上下拉
     gpiox->PUPDR &= (~(0x3 << (pin * 2)));
     gpiox->PUPDR |= init->pupdr << (pin * 2);
 }
 void hal_gpio_write(gpio_t* gpiox,unsigned int pin,gpio_status_t state)
 {
     if(state == gpio_reset_t)
     {
         gpiox->ODR &= (~(0x1 << pin));
     }else
     {
         gpiox->ODR |= (0x1 << pin);
     }
 }
                                                                                

//初始化
void uart()
{
    //rcc章节
    RCC->MP_AHB4ENSETR|=((0x1<<1));
    RCC->MP_AHB4ENSETR|=((0x1<<6));
    RCC->MP_APB1ENSETR|=((0x1<<16));

    //gpio章节
    //MODER寄存器
    GPIOG->MODER&=(~(0x3<<22));
    GPIOG->MODER|=(0x1<<23);
    GPIOB->MODER&=(~(0x3<<4));
    GPIOB->MODER|=(0x1<<5);
    //AFRL和AFRH寄存器
    GPIOG->AFRH&=(~(0xf<<12));
    GPIOG->AFRH|=(0x3<<13);
    GPIOB->AFRL&=(~(0xf<<8));
    GPIOB->AFRL|=(0x1<<11);

    //uart章节
    if(USART4->CR1&(0x1<<0))
    {
        delay_ms(500);
        USART4->CR1&=(~(0x1));
    }
    //CR1寄存器
    USART4->CR1&=(~(0x1<<12));
    USART4->CR1&=(~(0x1<<28));
    USART4->CR1&=(~(0x1<<15));
    USART4->CR1&=(~(0x1<<10));
    USART4->CR1|=(0x1<<3);
    USART4->CR1|=(0x1<<2);
    USART4->CR1|=(0x1);
    //CR2寄存器
    USART4->CR2&=(~(0x1<<12));
    //BRR寄存器
    USART4->BRR=0x22B;
    //PRESC寄存器
    USART4->PRESC&=(~(0x1));

    USART4->CR1|=(0x1<<3);
    USART4->CR1|=(0x1<<2);
    USART4->CR1|=(0x1);



}

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

}

//发送一个字符串
void write_str(const char *str)
{
    while(*str!='\0')
    {
        write_char(*str);             
        str++;
    }
    write_char('\n');
    write_char('\r');
}

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

//接受一个字符串
char buf[512]={0};
char *read_str1()
{

    int i=0;
    while(1)
    {

        buf[i]=read_char();
        if(buf[i] == '\r') break;
        i++;
    }

    buf[i]='\0';
    write_str(buf);

    return buf;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值