STM32F103RCT6mini点灯相关函数及操作(上)

文章详细介绍了在STM32学习过程中如何使用LED驱动函数来控制LED点灯。通过分析代码和原理图,解释了GPIO_Init、RCC_APB2PeriphClockCmd等函数的作用,以及如何配置GPIO模式、速度和引脚。同时,强调了在STM32中需要手动设置引脚参数与51单片机的不同,并提到了头文件包含的防止重复定义的技巧。
摘要由CSDN通过智能技术生成

在学习STM32的过程中,有相当一部分时间花在了学习相关驱动函数上,今天就来梳理一下与LED点灯相关的一些函数及软件操作


首先来了解一下我们今天用到的主要的函数是什么,代码如下:

void LED_Init(void)
{
 GPIO_InitTypeDef GPIOInitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOA,&GPIO_InitStructure);
 GPIO_SetBits(GPIOA,GPIO_Pin_8);
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOD,&GPIO_InitStructure);
 GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

只看代码的话理解起来会十分困难,接下来我们通过原理图来具体分析相关的函数到底有什么意义。

看下面这张原理图:

我们可以清楚的发现PD2引脚和PA8引脚分别控制着LED1LED0,下面来看看相应LED模块的原理图

可以发现两个发光LED二极管正极连接着3.3V的VCC电源,所以正极的输入信号为1。而负极连接着LED0LED1两个引脚,当LED1引脚为信号0(也就是为低电平)时,有顺着LED的电平差,此时电流就可以顺利流过LED2,LED0同理。那既然我们知道原理了,能不能像51单片机一样直接控制引脚的电平呢?直觉告诉我们好像是不能的哈。那该怎么做呢,这就要说到本文章的重要主角了:“引脚驱动函数”


在开始介绍引脚驱动函数之前,我们先来了解一个51单片机有而STM32没有的机制:51单片机会自动设置相应引脚的输出频率,输出方式等参数,而STM32需要通过代码调试。这就需要我们在使用相应STM32GPIO引脚时加入时钟函数。下面来了解一下这个函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);

这个函数的作用是将GPIOx(x=A,B,C,D)的一组引脚的时钟使能的。后面两个参数是:选择哪一组的GPIO口,是否使能这组GPIO口。


接下来我们通过结构体继续理解初始化相应GPIO口的各项属性:

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

这一项是配置相应GPIO口的模式一共有八种模式,在这里再复习一下:上拉输入,下拉输入,浮空输入,模拟输入,推挽输出,开漏输出,复用推挽,复用开漏。

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

这个函数是配置到底是对(某一组中的)哪个GPIO口进行配置

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

此项函数是用来配置相应IO口的传输频率的,一共有3种速度可选:2MHz,10MHz,50MHz。

GPIO_Init(GPIOA,&GPIO_InitStructure);

这个函数是用来初始化相应IO口的,前面的入口参数选择哪一组GPIO口,后面的入口参数选择结构体地址。

GPIO_SetBits(GPIOA,GPIO_Pin_8);

最后一个函数的功能就像他的名字一样,可以设置某一组GPIO口的某个引脚输出高电平。如果能输出高电平,那就一定有函数可以输出低电平GPIO_ResetBits(GPIOA,GPIO_Pin_8);这个函数就是用来输出低电平的,用法和上面的函数一样,就是名字换了。

这样一来我们就把LED_Init函数配置好了,需要的时候直接把它扔进主函数就可以了。

最后我们来提一嘴一个非常重要的函数

#ifndef<标识>
#define<标识>
.//这里正常写入代码
.//
.//
.//
.//
.//  
#endif

这个函数在头文件数量繁多的程序中非常重要,有了它,在函数编译的时候就能避免重复定义头文件,减少程序报错。(接下篇)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值