头文件

#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
//引脚编号的封装
#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10
//MODER模式寄存器
typedef enum{INOUT,OUTPUT,ALT,ANLOG
}gpio_moder_t;
//OTYPER输出模式寄存器
typedef enum{PP,OD
}gpio_otyper_t;
//OSPEEDR输出速率寄存器
typedef enum{LOW,MED,HIGH,FAST
}gpio_ospeedr_t;
//PUPDR是否需要上下拉电阻寄存器
typedef enum{NO_PU_PD,PU,PF,RES
}gpio_pupdr_t;
//ODR输出高低电平寄存器
typedef enum{GPIO_RESET_T,GPIO_SET_T
}gpio_status_t;
typedef struct{gpio_moder_t moder;//模式寄存器gpio_otyper_t otyper;//输出类型寄存器gpio_ospeedr_t ospeedr;//输出速率寄存器gpio_pupdr_t pupdr;//是否需要上下拉寄存器
}gpio_init_t;
//串口初始化函数
void hal_uatr_4_init();
//GPIO引脚初始化函数 PE10 PF10 PE8
void hal_gpio_init(gpio_t* gpiox, unsigned int pin, gpio_init_t* gpio_init);
//点灯/熄灭
void hal_gpio_write(gpio_t* gpiox, unsigned int pin,gpio_status_t status);
//接收一个字符
char hal_get_char();
//接收一个字符串
char* hal_get_string();
//比较函数
int my_str_cmp(char* string);
typedef struct{char* cmd_arr;gpio_t* gpiox;unsigned int pin;gpio_status_t status;
}cmd_t;
void delay_ms(int ms);
#endif

函数

#include "led.h"
cmd_t arr[6] = {[0] = {.cmd_arr = "led1on",.gpiox = GPIOE,.pin = GPIO_PIN_10,.status = GPIO_SET_T,},[1] = {.cmd_arr = "led1off",.gpiox = GPIOE,.pin = GPIO_PIN_10,.status = GPIO_RESET_T,},[2] = {.cmd_arr = "led2on",.gpiox = GPIOF,.pin = GPIO_PIN_10,.status = GPIO_SET_T,},[3] = {.cmd_arr = "led2off",.gpiox = GPIOF,.pin = GPIO_PIN_10,.status = GPIO_RESET_T,},[4] = {.cmd_arr = "led3on",.gpiox = GPIOE,.pin = GPIO_PIN_8,.status = GPIO_SET_T,},[5] = {.cmd_arr = "led3off",.gpiox = GPIOE,.pin = GPIO_PIN_8,.status = GPIO_RESET_T,}
};void hal_gpio_init(gpio_t* gpiox, unsigned int pin, gpio_init_t* gpio_init){gpiox->MODER &= (~(0x3 << (pin * 2)));gpiox->MODER |= (gpio_init->moder << (pin * 2));//2.设置gpio引脚输出类型 OTYPER 每一位管理一个引脚gpiox->OTYPER &= (~(0x1 << pin));gpiox->OTYPER |= (gpio_init->otyper << pin);//3.设置gpio引脚输出速率gpiox->OSPEEDR &= (~(0x3 << (pin * 2)));gpiox->OSPEEDR |= (gpio_init->ospeedr << (pin * 2));//4.设置gpio引脚禁止上下拉电阻gpiox->PUPDR &= (~(0x3 << (pin * 2)));gpiox->PUPDR |= (gpio_init->pupdr << (pin * 2));
}
void hal_gpio_write(gpio_t* gpiox, unsigned int pin,gpio_status_t status){if(status == GPIO_RESET_T)gpiox->ODR &= (~(0x1 << pin));elsegpiox->ODR |= (0x1 << pin);
}
void hal_uatr_4_init()
{//RCC章节//1.使能GPIOB组控制器RCC->MP_AHB4ENSETR |= (0x1 << 1);//2.使能GPIOG组控制器RCC->MP_AHB4ENSETR |= (0x1 << 6);//3.使能UART4组控制器RCC->MP_APB1ENSETR |= (0x1 << 16);//GPIO章节//复用功能模式 复用功能为串口接收/发送GPIOB->MODER &= (~(0x3 << 4));//设置PB2引脚复用功能模式GPIOB->MODER |= (0x1 << 5);GPIOG->MODER &= (~(0x3 << 22));//设置PG11引脚复用功能模式     GPIOG->MODER |= (0x1 << 23);                                  GPIOB->AFRL &= (~(0xf << 8));//设置PB2引脚复用功能为UART4_RX  GPIOB->AFRL |= (0x8 << 8);                                    GPIOG->AFRH &= (~(0xf << 12));//设置PG11引脚复用功能为UART4_TXGPIOG->AFRH |= (0x6 << 12);                                   //UART4章节 8N1 115200 对应位使能                           //判断UE是否使能,如果使能等于1,禁止                           if(USART4->CR1 & 0x1)                                         {                                                             delay_ms(500);                                            USART4->CR1 &= (~(0x1 << 0));                             }                                                             USART4->CR1 &= (~((0x1 << 12) | (0x1 << 28)));        USART4->CR2 &= (~(0x3 << 12));//设置1位停止位         USART4->CR1 &= (~(0x1 << 10));//设置串口无校验位      USART4->CR1 &= (~(0x1 << 15));//设置串口16倍采样率    USART4->PRESC &= (~(0xf << 0));//设置不分频           USART4->BRR = 0x22B;//设置比特率为115200              USART4->CR1 |= (0x1 << 3);//设置串口发送为使能        USART4->CR1 |= (0x1 << 2);//设置串口接受位使能        USART4->CR1 |= (0x1 << 0);//设置串口使能
}
//接收一个字符
char hal_get_char()
{                                                //定义一个变量,用来接收数据                  char ch;                                     //判断接收数据寄存器中是否有数据可以读 ISR[5]while(!(USART4->ISR & (0x1 << 5)));          //ch = 接收数据寄存器                        ch = (char)USART4->RDR;                      return ch;
}
//接收一个字符串
char* hal_get_string()
{                                static char string[64]={};   int i = 0;                   //判断键盘回车键是否按下 '\r'for(i=0; i<62 ; i++)         {                                       string[i] = hal_get_char();         if(string[i] == '\r')               break;                          }                                       string[i] = '\0';                       return string;
}
//比较函数
int my_str_cmp(char* string)
{for(int j=0; j<6; j++){cmd_t p = arr[j];int i = 0;while(string[i] == p.cmd_arr[i]){if(string[i] == 0 && p.cmd_arr[i] == 0){hal_gpio_write(p.gpiox, p.pin, p.status);return j;}i++;}}return 99;
}

主函数

#include "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++);
}
//PE10 PF10 PE8
void led_init(){gpio_init_t init;//初始化时钟 GPIOE组和GPIOF组时钟使能RCC->MP_AHB4ENSETR |= (0x3 << 4);//结构体进行初始化init.moder = OUTPUT;init.otyper = PP;init.ospeedr = LOW;init.pupdr = NO_PU_PD;//初始化led1 led2 led3hal_gpio_init(GPIOE, GPIO_PIN_10, &init);hal_gpio_init(GPIOF, GPIO_PIN_10, &init);hal_gpio_init(GPIOE, GPIO_PIN_8, &init);
}int main()
{led_init(); // LED灯初始化hal_uatr_4_init();//uart总线初始化while(1){char *string = hal_get_string();//接收字符串int num = my_str_cmp(string);//比较switch(num){case 0:printf("灯1已点亮\n");break;case 1:printf("灯1已熄灭\n");break;case 2:printf("灯2已点亮\n");break;case 3:printf("灯2已熄灭\n");break;case 4:printf("灯3已点亮\n");break;case 5:printf("灯3已熄灭\n");break;default:printf("输入错误\n");break;}}return 0;
}

在串口输入相应的命令,实现相应的led灯进行点亮和熄灭相关推荐

  1. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  2. linux查看所有磁盘信息fdisk,Linux下添加新硬盘,分区及挂载 挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看...

    挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看到除了当前的第一块硬盘外还有一块sdb的第二块硬盘,然后用fdisk /dev/sdb 进行分区 进入fdisk命令,输入h可以看到该命令的 ...

  3. dos命令行输入adb shell命令为什么报错

    在命令行(就是开始--运行--输入cmd)模式下输入adb shell命令一般会报两种错误,一是"adb不是内部命令或外部命令,也不是可运行的程序或批处理文件",二是"e ...

  4. python怎么输入两行_python交互模式下输入换行/输入多行命令的方法

    先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如: >>> print 'aaa'; \ ... print 'bbb'; \ ... print ...

  5. arduino串口输入改变模式模块

    最新更新: 当时太嫩,做这个不知道arduino还有中断的方法,利用中断的方法可以比下面这种循环判断的方法更简单. 最近做了不少arduino智能系统,我发现在与用户交互的过程中,经常用到:通过在串口 ...

  6. linux输入过的命令行,LINUX中命令行的历史记录和编辑

    前的Linux发行版默认使用Bash Shell,它已成为Linux系统的实际标准.Bash Shell命令行具有非常强大的功能.Bash Shell提供了一些特性使输入命令变得容易. 1.命令行的历 ...

  7. python命令行输入参数_Python命令行参数处理

    sys模块 sys模块代表了Python解释器,主要用于获取和Python解释器相关的信息,其中 sys.argv 可以获取命令行参数 在Python交互式解释器中可以先导入sys模块 import ...

  8. Linux Shell - 脚本中自动确认需要输入确认的命令

    文章目录 Linux Shell - 脚本中自动确认需要输入确认的命令 1.yum 命令 2.其它命令 Linux Shell - 脚本中自动确认需要输入确认的命令 1.yum 命令 通过指定 -y ...

  9. 电脑Win7系统刷新dns缓存,输入“ipconfig /flushdns”命令后,显示无法刷新DNS解析缓存:执行期间,函数出了问题

    电脑Win7系统刷新dns缓存,有时候,输入"ipconfig /flushdns"命令后,显示"无法刷新DNS解析缓存:执行期间,函数出了问题",如图: 查询 ...

  10. 【Arduino】温湿度传感器(DHT11)控制设计 四位数码管,LCD1602,带蜂鸣器、LED灯报警,串口输入设定阈值

    @[TOC]( [Arduino]温湿度传感器(DHT11)控制设计 四位数码管,LCD1602,带蜂鸣器.LED灯报警,串口输入设定阈值 ) 一.实验器材 UNO控制板:1块 共阳极四位数码管:1个 ...

最新文章

  1. 孔雀翎----《Programming C# 》中文版 第4版
  2. java uppercase方法_Java toUpperCase()方法及其示例
  3. VS2010 VC Project的default Include设置
  4. 【转】FPGA到底是啥?
  5. vue.js安装与配置
  6. 预编译sql查询语句_频繁查询重新编译– SQL查询性能杀手–检测
  7. SQLite剖析之事务处理技术
  8. 数据之路 - Python爬虫 - PyQuery库
  9. CFS内网渗透三层内网漫游靶场-2019某CTF案例
  10. 计算机专业正高职称怎么获得,正高级软件工程师职称认定办理
  11. 【 移动硬盘安装Ubuntu18.04】
  12. 笔记本电脑不用软件开wifi热点
  13. Android开机速度优化
  14. office办公所有版本齐全
  15. 算算我们80后的小孩今后读大学要花多少钱
  16. 简述Java长期占据主要地位的原因
  17. HTTP请求报文和HTTP响应报文
  18. 【Ubuntu】ThinkPad T470p 安装Win10 Ubuntu 16.04 双系统
  19. Kepware Ping驱动的应用
  20. StableStudio,比Midjourney还牛逼的绘画平台,免费!

热门文章

  1. 案例39:基于Java办公自动化管理系统开题报告设计
  2. 用html写一个爱心树表白动画
  3. 杰理之样机芯片程序烧写【篇】
  4. 【知识分享】DIC(数字图像相关)实验—高质量散斑制作DIC测试
  5. 17【测试单元、反射、注解、Lombok插件】
  6. 郭健:Linux内存管理系统参数配置之OOM(内存耗尽)
  7. vim使用coc 补全代码
  8. 《千万别学英语》一种非常好的学习方法
  9. JS(v8)垃圾回收机制
  10. 唯众云课堂在数字技术专业混合式教学实践