STM32基础设计(1)---点亮LED灯

时间:2022-09-22 14:37:22

博主今年大四,在准备一个四轴飞行器毕业设计,此系列博文,供博主学习参考用,以防忘记。如能帮助到别人,不胜感激。

首先,总结全文,用STM32f103c8点亮LED的大概步骤为:

  1. 定义GPIO口结构体
  2. 使能相关gpio口的时钟
  3. 如果GPIO口有其他重映射功能,先失能其重映射。
  4. 操纵相应GPIO口,实现LED灯的亮灭。

下面详细解释具体步骤:

1,定义GPIO口

库函数中GPIO结构体:

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
根据库函数,博主是这样定义的:
GPIO_InitTypeDef B_IO;

根据此结构体就可以明确使用GPIOx口的某个引脚,引脚的最大速率以及引脚的使用模式。

模式分别有:模拟输入模式,浮空输入模式(复位口的状态)、上拉/下拉输入模式、通用推挽输出模式、通用开漏输出模式、复用功能推挽输出模式、复用功能开漏输出模式。

速率可根据相应要求,设置为10Mhz、2Mhz、50Mhz。

接下来给GPIO口赋值:

B_IO.GPIO_Pin = GPIO_Pin_3;
B_IO.GPIO_Speed = GPIO_Speed_50MHz;
B_IO.GPIO_Mode = GPIO_Mode_Out_PP;//此为推挽输出
GPIO_Init(GPIOB,&B_IO);//通过GPIO_Init()函数初始化GPIO口。

2.使能相关gpio口的时钟

函数库中相关的函数为:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

详细内容请自查。

博主用的STM32板子上GPIOB的第3引脚连接了LED灯,但是根据STM32中文手册,这个引脚重映射了,所以要关闭其重映射,才可以用GPIOB_Pin_3引脚。

STM32基础设计(1)---点亮LED灯


调整引脚映射需要用到这个库函数:

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
另外,对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。

AFIO_MAPR:配置复用功能重映射

AFIO_EXTICRX:配置外部中断线映射

AFIO_EVCR: 配置EVENTOUT事件输出

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

4.控制引脚信号,实现LED灯的亮灭

定义了GPIO口变量,又使能了时钟,这样相关引脚就可以直接控制了。

delay(1000);
GPIOB->BSRR = GPIO_Pin_3;//Pin_3置1
delay(1000);
GPIOB->BRR = GPIO_Pin_3;//置0
delay(1000);
GPIOB->BSRR = GPIO_Pin_3;

可以通过GPIO寄存器BRR、BSRR来设置相关引脚的信号。

简单地说:

对于低16位而言,BRR是用来置0的,BSRR是用来置1的。

对于高16位而言,BRR的高16位保留,BSRR的高16位是用来置0的。

具体的请自查STM32中文手册115页。

因为PB3引脚接着一个电源,故PB3为低电平时灯亮,高电平时灯灭。

详细代码如下:

#include<stm32f10x.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint n)
{
	int i,j;
	for(i=0;i<n;i++)
		for(j=0;j<8500 ; j++);
}
int main(void)
{
	GPIO_InitTypeDef B_IO;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

	
	B_IO.GPIO_Pin = GPIO_Pin_3;
	B_IO.GPIO_Speed = GPIO_Speed_50MHz;
	B_IO.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB,&B_IO);
	
	GPIOB->BRR=GPIO_Pin_3;
	while(1)
	{
		delay(1000);
		GPIOB->BSRR = GPIO_Pin_3;
		delay(1000);
		GPIOB->BRR = GPIO_Pin_3;
		delay(1000);
		GPIOB->BSRR = GPIO_Pin_3;
	}
}

2018年3月17日