基于A7核的开发板的串口控制

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

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

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

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

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

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

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

头文件:

#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);
//灯亮
void led_on(int i);
//灯灭
void led_off(int i);

//比较字符串
int strcmp(char *arr,const char *src);

#endif

源文件:

#include "new.h"
extern void printf(const char *fmt,...);
extern void delay_ms(int ms);
//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;
}

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....\n");
    while(1)
    {
        char* p = get_string();
        if(strcmp(p,"led1on") == 0)
        {
            led_on(1);
        }
        else if(strcmp(p,"led1off") == 0)
        {
            led_off(1);
        }
        else if(strcmp(p,"led2on") == 0)
        {
            led_on(2);
        }
        else if(strcmp(p,"led2off") == 0)
        {
            led_off(2);
        }
        else if(strcmp(p,"led3on") == 0)
        {
            led_on(3);
        }
        else if(strcmp(p,"led3off") == 0)
        {
            led_off(3);
        }
    }
    return 0;
}

实现效果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值