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

头文件

#ifndef __UART_LED_H__
#define __UART_LED_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
extern void printf(const char *fmt, ...);//LED灯
typedef enum{LED1 = 1,LED2,LED3,
}led_t;//LED灯状态
typedef enum{LED_ON,LED_OFF,
}status_t;//声明一个结构体
typedef struct{char* cmd_arr; //字符串led_t led;   //哪盏LED灯status_t status;  //LED灯状态void (*led_status_t)(led_t led,status_t status);  //函数指针
}cmd_t;//LED等初始化
void hal_led_init();//uart初始化
void hal_uart4_init();//函数实现
void led_status(led_t led,status_t status);//字符串比较函数
int my_strcmp(const char* src,const char* dest);//查找命令字符串
cmd_t* find_command(const char* str);//发送一个字符
void put_char(const char str);//发送一个字符串
void put_string(const char* string);//接收一个字符
char get_char();//接收一个字符串
char* get_string();#endif

源代码

#include "uart_led.h"extern void delay_ms(int ms);//结构体初始化
cmd_t cmd_arr[6] = {[0] = {.cmd_arr = "led1on",.led = LED1,.status = LED_ON,.led_status_t = led_status,},[1] = {.cmd_arr = "led1off",.led = LED1,.status = LED_OFF,.led_status_t = led_status,},[2] = {.cmd_arr = "led2on",.led = LED2,.status = LED_ON,.led_status_t = led_status,},[3] = {.cmd_arr = "led2off",.led = LED2,.status = LED_OFF,.led_status_t = led_status,},[4] = {.cmd_arr = "led3on",.led = LED3,.status = LED_ON,.led_status_t = led_status,},[5] = {.cmd_arr = "led3off",.led = LED3,.status = LED_OFF,.led_status_t = led_status,},
};//控制LED灯亮灭函数
void led_status(led_t led,status_t status)
{switch(led){case LED1:if(status == LED_ON){GPIOE->ODR |= (0x1 << 10);}else{GPIOE->ODR &= ~(0x1 << 10);}break;case LED2:if(status == LED_ON){GPIOF->ODR |= (0x1 << 10);}else{GPIOF->ODR &= ~(0x1 << 10);}break;case LED3:if(status == LED_ON){GPIOE->ODR |= (0x1 << 8);}else{GPIOE->ODR &= ~(0x1 << 8);}break;}}//字符串比较函数
int my_strcmp(const char* src,const char* dest)
{while(*src != 0 && *dest != 0 && *src == *dest){src++;dest++;}return *dest-*src;
}//查找命令字符串
cmd_t* find_command(const char* str)
{int i;for(i=0;i<6;i++){if(!(my_strcmp(str,cmd_arr[i].cmd_arr)))return &cmd_arr[i]; //比较成功,返回结构体元素地址}return 0;
}//LED灯初始化
void hal_led_init()
{RCC->MP_AHB4ENSETR |= (0x1<<4);RCC->MP_AHB4ENSETR |= (0x1<<5);GPIOE->MODER &=(~(0x3<<20));GPIOE->MODER |=(0x1<<20);GPIOF->MODER &=(~(0x3<<20));GPIOF->MODER |=(0x1<<20);GPIOE->MODER &=(~(0x3<<16));GPIOE->MODER |=(0x1<<16);GPIOE->OTYPER &=(~(0x1<<10));GPIOF->OTYPER &=(~(0x1<<10));GPIOE->OTYPER &=(~(0x1<<8));GPIOE->OSPEEDR &=(~(0x3<<20));GPIOE->OSPEEDR &=(~(0x3<<16));GPIOF->OSPEEDR &=(~(0x3<<20));GPIOE->PUPDR &=(~(0x3<<20));GPIOE->PUPDR &=(~(0x3<<16));GPIOF->PUPDR &=(~(0x3<<20));}//uart初始化
void hal_uart4_init()
{//使GPIOG与GPIOB时钟使能RCC->MP_AHB4ENSETR |= (0x1 << 1);RCC->MP_AHB4ENSETR |= (0x1 << 6);//使UART4时钟使能RCC->MP_APB1ENSETR |= (0x1 << 16);//GPIOx_MODER寄存器功能:设置PB2和PG11引脚为复用功能GPIOB->MODER &= ~(0x3 << 4);GPIOB->MODER |= (0x1 << 5);GPIOG->MODER &= ~(0x3 << 22);GPIOG->MODER |= (0x1 << 23);//GPIOx_AFRL寄存器功能:设置PB2引脚的复用功能为UART4_RXGPIOB->AFRL &= ~(0xf << 8);GPIOB->AFRL |= (0x1 << 11);//GPIOx_AFRH寄存器功能:设置PG11引脚的复用功能为UART4_TXGPIOG->AFRH &= ~(0xf << 12);GPIOG->AFRH |= (0x6 << 12);/*******UART章节初始化******/if(USART4->CR1 & (0x1 <<0)){delay_ms(500);//将UE设为禁止 USART4->CR1 &= ~(0x1 << 0);}//USART_CR1[28][12]:设置8位数据位宽度USART4->CR1 &= ~(0x1 << 12);USART4->CR1 &= ~(0x3 << 28);//USART_CR1[15]:设置串口16倍采样率USART4->CR1 &= ~(0x1 << 15);//USART_CR1[10]:设置串口无奇偶校验位USART4->CR1 &= ~(0x1 << 10);//USART_CR1[3]:设置串口发送寄存器使能USART4->CR1 |= (0x1 << 3);//USART_CR1[2]:设置串口接收寄存器使能USART4->CR1 |= (0x1 << 2);//USART_CR1[0]:设置串口使能USART4->CR1 |= (0x1 << 0);//USART__CR2寄存器地址USART4->CR2 &= ~(0x3 << 12);//USART_BRR寄存器地址USART4->BRR = 0x22b;//USART_PRESC寄存器地址USART4->PRESC &= ~(0xf << 0);}//发送一个字符
void put_char(const char str)
{//判断发送数据寄存器是否有数据//读0:寄存器满,需要等待//读1:寄存器为空,发送下一字节数据while(!(USART4->ISR & (0x1 << 7)));//将要发送的字符存入发送数据寄存器中USART4->TDR = str;//判断数据是否发送完成while(!(USART4->ISR & (0x1 << 6)));
}//发送一个字符串
void put_string(const char* string)
{while(*string){put_char(*string++);}put_char('\n');put_char('\r');
}//接收一个字符
char get_char()
{char str;//判断接受寄存器while(!(USART4->ISR & (0x1 << 5)));str = USART4->RDR;return str;
}char buf[50] = "";
//接收一个字符串
char* get_string()
{unsigned int i;for(i=0;i<49;i++){buf[i] = get_char();put_char(buf[i]);if(buf[i] == '\r'){break;}}buf[i] = '\0';put_char('\n');return buf;
}

main.c

#include "uart_led.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()
{cmd_t* p = 0;hal_uart4_init();hal_led_init();while(1){p = find_command(get_string());if(p == 0){printf("command is not find\n");}else{p->led_status_t(p->led,p->status);}}return 0;
}

结果


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部