通过操作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;
}
实现效果: