在串口输入相应的命令,实现相应的led灯进行点亮和熄灭
头文件
#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灯进行点亮和熄灭相关推荐
- stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭
stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...
- linux查看所有磁盘信息fdisk,Linux下添加新硬盘,分区及挂载 挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看...
挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看到除了当前的第一块硬盘外还有一块sdb的第二块硬盘,然后用fdisk /dev/sdb 进行分区 进入fdisk命令,输入h可以看到该命令的 ...
- dos命令行输入adb shell命令为什么报错
在命令行(就是开始--运行--输入cmd)模式下输入adb shell命令一般会报两种错误,一是"adb不是内部命令或外部命令,也不是可运行的程序或批处理文件",二是"e ...
- python怎么输入两行_python交互模式下输入换行/输入多行命令的方法
先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如: >>> print 'aaa'; \ ... print 'bbb'; \ ... print ...
- arduino串口输入改变模式模块
最新更新: 当时太嫩,做这个不知道arduino还有中断的方法,利用中断的方法可以比下面这种循环判断的方法更简单. 最近做了不少arduino智能系统,我发现在与用户交互的过程中,经常用到:通过在串口 ...
- linux输入过的命令行,LINUX中命令行的历史记录和编辑
前的Linux发行版默认使用Bash Shell,它已成为Linux系统的实际标准.Bash Shell命令行具有非常强大的功能.Bash Shell提供了一些特性使输入命令变得容易. 1.命令行的历 ...
- python命令行输入参数_Python命令行参数处理
sys模块 sys模块代表了Python解释器,主要用于获取和Python解释器相关的信息,其中 sys.argv 可以获取命令行参数 在Python交互式解释器中可以先导入sys模块 import ...
- Linux Shell - 脚本中自动确认需要输入确认的命令
文章目录 Linux Shell - 脚本中自动确认需要输入确认的命令 1.yum 命令 2.其它命令 Linux Shell - 脚本中自动确认需要输入确认的命令 1.yum 命令 通过指定 -y ...
- 电脑Win7系统刷新dns缓存,输入“ipconfig /flushdns”命令后,显示无法刷新DNS解析缓存:执行期间,函数出了问题
电脑Win7系统刷新dns缓存,有时候,输入"ipconfig /flushdns"命令后,显示"无法刷新DNS解析缓存:执行期间,函数出了问题",如图: 查询 ...
- 【Arduino】温湿度传感器(DHT11)控制设计 四位数码管,LCD1602,带蜂鸣器、LED灯报警,串口输入设定阈值
@[TOC]( [Arduino]温湿度传感器(DHT11)控制设计 四位数码管,LCD1602,带蜂鸣器.LED灯报警,串口输入设定阈值 ) 一.实验器材 UNO控制板:1块 共阳极四位数码管:1个 ...
最新文章
- 孔雀翎----《Programming C# 》中文版 第4版
- java uppercase方法_Java toUpperCase()方法及其示例
- VS2010 VC Project的default Include设置
- 【转】FPGA到底是啥?
- vue.js安装与配置
- 预编译sql查询语句_频繁查询重新编译– SQL查询性能杀手–检测
- SQLite剖析之事务处理技术
- 数据之路 - Python爬虫 - PyQuery库
- CFS内网渗透三层内网漫游靶场-2019某CTF案例
- 计算机专业正高职称怎么获得,正高级软件工程师职称认定办理
- 【 移动硬盘安装Ubuntu18.04】
- 笔记本电脑不用软件开wifi热点
- Android开机速度优化
- office办公所有版本齐全
- 算算我们80后的小孩今后读大学要花多少钱
- 简述Java长期占据主要地位的原因
- HTTP请求报文和HTTP响应报文
- 【Ubuntu】ThinkPad T470p 安装Win10 Ubuntu 16.04 双系统
- Kepware Ping驱动的应用
- StableStudio,比Midjourney还牛逼的绘画平台,免费!