基于STM32的智能门锁系统 经典开局,先来个点灯

正常项目开始了,那就先从原理图看一下,点个灯吧

然后再看一下LED_R和LED_G,这两个灯在核心板子哪个IO口上

找到了

那么我们从原理图上可以看到,两个LED通过IO口输出个低电平就可以点亮了,

那接下来就是去初始化配置这两个LED对应的IO没有问题吧

那就我们进入项目,创建LED.c和LED.h两个文件

寄存器示例

在开始编写程序之前,看一下寄存器如何配置IO口的呢

首先还是开启GPIO端口的时钟,让其能工作,接下来配置IO口的输出类型,我们就是选择是输出类型,接着就是输出模式(推挽和开漏),然后配置输出速度,接着就是上下拉,然后我们在默认输出数据寄存器为高电平(默认LED为灭着)。好那么现在输出化完成后,

我们就在LED.h定义几个宏。

红灯

复制代码
#define LED_R_ON (GPIOB->ODR &= ~(1<<8);#define LED_R_OFF (GPIOB->ODR |= (1<<8));#define LED_R_TURN (GPIOB->ODR ^= (1<<8));

绿灯​​​​​​​

复制代码
#define LED_G_ON (GPIOB->ODR &= ~(1<<9));#define LED_G_OFF (GPIOB->ODR |= (1<<9));#define LED_G_TURN (GPIOB->ODR ^= (1<<9));

在主函数中​​​​​​​

复制代码
#include "LED.h"
int main(){  LED_INIT();  LED_R_ON;  LED_G_ON;    while(1){          }}

那么以上是关于寄存器初始化IO口的详细过程,而我们用到这个项目是库函数开发的。

库函数

库函数就是将我上面LED.c写的初始化函数里中直接封装为一个函数了,我们呢只需要调用,然后传参数就可以了,不用我们自己去写寄存器了。

我们可以看到这些外设的函数,这些就是我们在刚开始搭建一个项目环境时,提取的一些内核和外设文件。那我们现在就找GPIO.c的文件,跳到对应的头文件

可以看到有一些库函数,这些就是我们以后用到的库函数,这些函数将我们的寄存器给封装起来,所以在用到的时候很方便。

举例:

比如我现在想配置IIC,那就去找关于IIC的这个函数

也可以看到给我们封装的一些函数。

库函数示例

那么就以上述我们写的初始化GPIO寄存器为例,我们用库函数去解决

时钟配置

首先我们是不是需要开启GPIO时钟,

去到rcc.h中,看到一些函数,我们根据STM的官方数据手册,知道GPIOB控制器是挂载到AHB1总线上,

复制代码
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);

那么就是这个函数

这个函数有两个参数,那我得知道这个参数是什么,那么我们鼠标右键点击去看这个函数定义,所以来到了

那么就可以根据这个,我们知道函数参数为RCC_AHB1Periph_GPIOB

和ENABLE

GPIO配置

再到了GPIO初始化了,我们就继续到库函数,发现这个函数

那么我们就继续上述内容,去找个函数里面找参数,

根据注释,我们发现第一个是不是GPIOB的参数

然后第二个是一个指针类型的参数,我们发现是不是,是GPIO_InitTypeDef指针类型的变量,那我们就继续右键去看找找个结构体

发现这个结构体中就有我们前面去用寄存器开发的一些内容,比如GPIO的模式,速度,输出类型,输入类型,都属于这个结构体中的成员参数了,上一个我们找到的GPIO初始化函数的一个参数,所以我们就知道,我们得需要配置这个结构体,然后在传入这个函数,那么接下来就是如何配置这个结构体

那我们就去定义这个结构变量在我们的LED.c初始化函数

然后我们就去给这个结构体变量中的成员去赋值,最后这个LED.c的GPIO初始化的代码就是,

​​​​​​​

复制代码
void LED_Init(){        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct = {0};	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;	GPIO_InitStruct.GPIO_Speed = GPIO_Medium_Speed;	GPIO_InitStruct.GPIO_OType = PIO_OType_PP;	GPIO_InitStruct.GPIO_PuPd = PIO_PuPd_NOPULL;        ·       GPIO_Init(GPIOB, GPIO_InitTypeDef* GPIO_InitStruct);        GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9)}

上面就是我们把这两个LED的IO口给配置好了,

相关推荐
周周记笔记1 天前
[元器件专题] RC充电电路(七)
嵌入式硬件·测试工具·硬件开发
ACP广源盛139246256731 天前
GSV2712@ACP#2 进 1 出 HDMI 2.0/Type-C DisplayPort 1.4 混合切换器 + 嵌入式 MCU
单片机·嵌入式硬件·计算机外设·音视频
沉在嵌入式的鱼1 天前
STM32--GY906体温检测传感器
stm32·单片机·嵌入式硬件·gy906·体温检测
cooldream20091 天前
基于 RISC-V VisionFive 的桌面数字时钟项目实战
嵌入式硬件·risc-v·嵌入式开发
2401_853448231 天前
Spieed micarray开发介绍
stm32·sk9822·sipeed mic
哄娃睡觉1 天前
STM32 VBAT外围电路接法详解--备用电源(纽扣电池)
stm32
小李做物联网1 天前
26.3基于stm32单片机毕业设计物联网软硬件智能遮阳棚设计
stm32·单片机·嵌入式硬件·物联网
D***y2011 天前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
易水寒陈1 天前
使用1个定时器作为多个串口的超时计数器
stm32·单片机
三佛科技-187366133971 天前
BP8501CH是什么芯片?BP8501CH(输出功率说明及典型电路图)
单片机·嵌入式硬件