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

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

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

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

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

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

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

uk.h代码如下:

#include "uk.h"

extern void delay_ms(int ms);
//串口初始化
void uk_init()
{
    /**************************RCC章节初始化********************/
    
    //使能GPIOE组控制器
    RCC->MP_AHB4ENSETR |= (0x1<<4);

    //使能GPIOF组控制器
    RCC->MP_AHB4ENSETR |= (0x1<<5);

    //使能GPIOB组控制器    
    RCC->MP_AHB4ENSETR &=(~(0x1<<1));
    RCC->MP_AHB4ENSETR |=(0x1<<1);
    
    //使能GPIOG组控制器
    RCC->MP_AHB4ENSETR &=(~(0x1<<6));
    RCC->MP_AHB4ENSETR |=(0x1<<6);
    
    //使能UART4组控制器
    RCC->MP_APB1ENSETR &=(~(0x1<<16));
    RCC->MP_APB1ENSETR |=(0x1<<16);

    /*********************GPIO章节初始化***********************/
    //设置GPIOE_MODER寄存器为输出模式
    GPIOE->MODER &= (~(0x3<<20));
    GPIOE->MODER |= (0x1<<20);

    //设置GPIOF_MODER寄存器为输出模式
    GPIOF->MODER &= (~(0x3<<20));
    GPIOF->MODER |= (0x1<<20);
    
    //设置GPIOE_MODER寄存器为输出模式
    GPIOE->MODER &= (~(0x3<<16));
    GPIOE->MODER |= (0x1<<16);

    //设置GPIOE_OTYPER寄存器为推挽输出模式
    GPIOE->OTYPER &= (~(0x1<<10));

    //设置GPIOF_OTYPER寄存器为推挽输出模式
    GPIOF->OTYPER &= (~(0x1<<10));

    //设置GPIOE_OTYPER寄存器为推挽输出模式
    GPIOE->OTYPER &= (~(0x1<<8));

    //设置GPIOE_OSPEEDR寄存器为低速输出模式
    GPIOE->OSPEEDR &= (~(0x3<<20));

    //设置GPIOE_OSPEEDR寄存器为低速输出模式
    GPIOF->OSPEEDR &= (~(0x3<<20));

    //设置GPIOE_OSPEEDR寄存器为低速输出模式
    GPIOE->OSPEEDR &= (~(0x3<<16));

    //设置GPIOE_PUPDR寄存器为禁止上下拉电阻
    GPIOE->PUPDR &=(~(0x3<<20));
    
    //设置GPIOE_PUPDR寄存器为禁止上下拉电阻
    GPIOF->PUPDR &=(~(0x3<<20));
    
    //设置GPIOE_PUPDR寄存器为禁止上下拉电阻
    GPIOE->PUPDR &=(~(0x3<<16));
    
    //设置GPIOB——MODER寄存器为复用功能模式    
    GPIOB->MODER &=(~(0x3<<4));
    GPIOB->MODER |=(0x1<<5);

    //设置GPIOG_MODER寄存器为复用功能模式
    GPIOG->MODER &=(~(0x3<<22));
    GPIOG->MODER |=(0x1<<23);

    //设置GPIOB_AFRL寄存器复用功能模式UART4_RX
    GPIOB->AFRL &=(~(0xf<<8));
    GPIOB->AFRL |=(0x1<<11);

    //设置GPIOG_AFRH寄存器复用功能模式UART4_TX
    GPIOG->AFRH &=(~(0xf<<12));
    GPIOG->AFRH |=(0x3<<13);
    
    /******************UART4章节初始化******************************/

    if(    USART4->CR1 &=(0x1<<0))
    {
        delay_ms(500);
        USART4->CR1 &=(~(0x1<<0));
    }
    //写00 ----->设置数据位宽度为8位
    USART4->CR1 &=(~(0x1<<28));
    USART4->CR1 &=(~(0x1<<12));

    //写0 ----->设置串口无奇偶校验位
    USART4->CR1 &=(~(0x1<<10));
    
    //设置串口1位停止位
    USART4->CR2 &=(~(0x3<<12));
    
    //写0 ----->设置串口采样率,会影响波特率的计算
    USART4->CR1 &=(~(0x1<<15));

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

    //设置串口发送器使能
    USART4->CR1 |=(0x1<<3);
    //[200~设置串口接收器使能
    USART4->CR1 |=(0x1<<2);
    //设置串口使能
    USART4->CR1 |=(0x1<<0);

}

//发送一个字符
void put_char(const char str)
{
    //1.判断发送数据寄存器是否为空,为空才可以发送下一个字节
    //ISR[7]
    //读0:发送数据寄存器满,需要等待
    //读1:发送数据寄存器空,才可以发送下一个字节数据
    while(!(USART4->ISR &(0x1<<7)));
    

    //2.将要发送的字符,写到发送数据寄存器中
    USART4->TDR = str;
    
    //3.判断发送数据寄存器是否完成
    //ISR[6]
    while(!(USART4->ISR &(0x1<<6)));
}

//接受一个字符
char get_char()
{
    char ch;
    //1.判断接收数据寄存器是否有数据可读 ISR[5]
    while(!(USART4->ISR & (0x1<<5)));
    
    //2.将接收到的数据读出来
    ch = USART4->RDR;
    return ch;
}

//发送一个字符串
void put_string(const char *str)
{
    //判断是否为'\0',一个字符一个字符发送
    int i = 0;
    while( str[i]!='\0')
    {
        put_char(str[i]);
        i++;
    }
    put_char('\n');
    put_char('\r');
}


char buffer[50] = {0};
//接受一个字符串
char *get_string()
{
    int i;                                                 
    //for循环                                              
    //当键盘的回车键'\r'按下之后,字符串输入完成           
    for(i=0;i<49;i++)                                      
    {                                                      
        buffer[i] = get_char();//接收一个字符         
        put_char(buffer[i]);//发送一个字符            
        if(buffer[i] == '\r') //判断字符串是否输入完成     
            break;                                         
    }                                                      
    //字符串补'\0'                                         
    buffer[i] = '\0';                                      
    put_char('\n');                                   
    return buffer;    
}


void led1_on()
{
  //设置PE10引脚输出高电平 ODR[10] = 1
  GPIOE->ODR = GPIOE->ODR | (0x1<<10);
}


void led1_off()
{

  //设置PE10引脚输出低电平 ODR[10] = 0
    GPIOE->ODR = GPIOE->ODR & (~(0x1<<10));
}

void led2_on()
{
  //设置PF10引脚输出高电平 ODR[10] = 1
  GPIOF->ODR = GPIOE->ODR | (0x1<<10);
}


void led2_off()
{

  //设置PF10引脚输出低电平 ODR[10] = 0
    GPIOF->ODR = GPIOE->ODR & (~(0x1<<10));
}
void led3_on()
{
  //设置PE8引脚输出高电平 ODR[10] = 1
  GPIOE->ODR = GPIOE->ODR | (0x1<<8);
}


void led3_off()
{

  //设置PE8引脚输出低电平 ODR[10] = 0
    GPIOE->ODR = GPIOE->ODR & (~(0x1<<8));
}

int strcmp(const char* str1,const char* str2)
{
    char*p1 = str1;
    char*p2 = str2;
    while(*p1 != '\0')
    {
        if(*p1 != *p2) return 0;
        p1++;
        p2++;
    }
    return 1;
}

uk.h代码如下:

#ifndef __UART4__H__
#define __UART4__H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"

//串口初始化
void uk_init();

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

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

//接受一个字符
char get_char();

//接受一个字符串
char *get_string();


int strcmp(const char* str1,const char* str2);
void led1_on();
void led1_off();

void led2_on();
void led2_off();

void led3_on();
void led3_off();

#endif

main.c代码如下:

#include "uk.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()
{

    uk_init();
    char *p;
    while(1)
    {
        p = get_string();
        if(strcmp(p,"led1on\n")==1)
        {
            led1_on();
        delay_ms(500);
        }
        else if(strcmp(p,"led1off\n")==1)
        {
            led1_off();                                    
            delay_ms(500);
        }
        else if(strcmp(p,"led2on\n")==1)
        {
            led2_on();
        delay_ms(500);
        }
        else if(strcmp(p,"led2off\n")==1)
        {
            led2_off();
        }
        else if(strcmp(p,"led3on\n")==1)
        {
            led3_on();
        delay_ms(500);
        }
        else if(strcmp(p,"led3off\n")==1)
        {
            led3_off();
        }
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值