六、使用库函数点亮一个LED

一、LED模块硬件电路

 

二、GPIO库函数介绍

(一)GPIO外设的库文件

stm32f10x_gpio.c、stm32f10x_gpio.h

(二)GPIO常用库函数

1、初始化函数

void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)

功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度即GPIO的2个配置寄存器

	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择你要设置的IO口
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率

	GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIO

可以一次对多个管脚进行初始化,前提必须是它们的配置模式需一样。比如:

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;

2、设置管脚输出电平函数

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层为配置BSRR寄存器

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//写一个引脚

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//写全部引脚

功能:设置为输出电平,很少用

3、读取管脚输入电平函数

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。

uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。

4、读取管脚输出电平函数

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。

uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

功能:读取某组端口的输出电平。底层是通过读取ODR寄存器。

(三)使能GPIO时钟函数

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

不同的外设调用的时钟使能函数可能不一样,因为不同的外设挂接的总线可能不一样,GPIO挂接在APB2总线上

例,使能GPIOC端口时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

三、使用库函数编写点亮LED程序

在编写程序之间要先配置模板库,模板库配置参见五、STM32固件库介绍及库函数模板创建_并不傻的袍子-CSDN博客

新建APP文件夹用于存放led.h和led.c文件,在工程中新建目录APP,将led.c文件添加进目录,再在魔术棒配置->C/C++中将led.h的路径添加进来

在led.h文件中,添加:

#ifndef _led_H
#define _led_H

#include "stm32f10x.h"

//定义LED灯的引脚时钟
#define LED_PORT_RCC RCC_APB2Periph_GPIOC
//定义LED灯的引脚
#define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
//定义LED灯的端口名称
#define LED_PORT GPIOC

//LED灯初始化函数
void LED_Init(void);

#endif

在led.c文件中添加

#include "led.h"

void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//定义引脚配置的结构体变量
	
	RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);//开启GPIOC的时钟
	
	GPIO_InitStructure.GPIO_Pin=LED_PIN;
	//GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择引脚为GPIO的0号引脚
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置引脚为推挽输出
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟频率为50MHz
	GPIO_Init(LED_PORT,&GPIO_InitStructure);//调用引脚配置函数
	
	//将GPIOC的所有引脚设置为高电平
	GPIO_SetBits(LED_PORT,LED_PIN);
	
}

在main.c函数中添加

#include "stm32f10x.h"
#include "led.h"

int main()
{
	LED_Init();
	
	while(1)
	{
		GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	}
}

编译执行,将生成的hex文件下载到普中STM32f103ZET6开发板上,即可点亮第一个LED灯。

猜你喜欢

转载自blog.csdn.net/qq_40836442/article/details/110089729
今日推荐