一. GPIO初始化
STM32单片机和51单片机不同,51单片机只需与引脚相连后就可以使用引脚发出高低电平信号控制外部器件,而STM32单片机需要先对引脚进行配置(初始化),如果使用引脚用作I2C、SPI、USART等通讯接口时,就是所谓的复用功能时,就需要再配置外设的工作参数。
1.使能GPIO端口时钟;
RCC_APBxPeriphClockCmd(RCC_APBxPeriph_GPIOy , ENANLE/DISABLE);
函数表示使能或者不使能APBx(Advanced Peripheral Bus)的外设时钟,APBx表示时钟总线APB1或APB2,APB1为低速的外设时钟(最大为36MHz),APB2为高速的外设时钟(最大为72MHz)。GPIOy表示GPIO的端口(A.B.C...)。两个时钟总线上都挂载着不同的引脚端口和外设,使用时需要注意,APB1的使能函数不能使能挂载在APB2总线上的引脚端口和外设。
2.初始化GPIO目标引脚的工作模式
因为官方库函数已经将初始化GPIO的所需要的功能进行了封装,成为一个结构体,所以需要先定义一个GPIO_InitTypeDef类型的结构体。注意:定义结构体要放在GPIO配置函数内的第一行。
GPIO_InitTypeDef GPIO_InitStructure;
然后选择需要控制的引脚,x表示所控制端口的第几个引脚。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
然后设置引脚模式,xx表示8种不同的引脚模式,如果只是想要控制引脚的高低电平用于LED的亮灭控制,则可以选择GPIO_Mode_Out_PP(通用推挽输出);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_xx;
然后设置引脚的速率,xx表示输出最大的频率,共有10MHz、2MHz、50MHz三种选择,速度越大,I/O口的相应速度越快,但相应的功耗和噪声也大。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xxMHz;
3.调用库函数,初始化GPIO端口
GPIOx为需要使用端口,在前面已经使能其的时钟;GPIO_InitStructure为第2步定义的结构体。
GPIO_Init(GPIOx, &GPIO_InitStructure);
4.定义引脚的高低电平
GPIO_SetBits(GPIOx , GPIO_Pin_y)表示将Px(y)的引脚拉高;
GPIO_ResetBits(GPIOx , GPIO_Pin_y)表示将Px(y)的引脚拉低;
二. 示例程序:通过控制引脚PB5输出高低电平实现led灯的亮灭。
“bsp_led.c” //led驱动文件
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
"bsp_led.h" //led头文件
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LED_GPIO_Config(void);
#define LED_OFF GPIO_SetBits(GPIOB , GPIO_Pin_5); //PB5引脚为低电平
#define LED_ON GPIO_ResetBits(GPIOB , GPIO_Pin_5); //PB5引脚为高电平
#endif /* __LED_H */
"main.c" //主函数文件
#include "stm32f10x.h"
#include "bsp_led.h"
void delay_ms(uint16_t nms) //延时函数,ms级别
{
uint16_t i , j;
for(i=0;i< 1000;i++)
{ for(j=0 ; i< 1000 ; j++) }
}
int main(void) //led循环亮灭各0.5秒
{
LED_GPIO_Config();
while(1)
{
LED_ON;
delay_ms(500); //延时500ms
LED_OFF;
delay_ms(500); //延时500ms
}
}
三. 电路图示意
LED接线示意图
当PB5为低电平时,led亮;当PB5为高电平时,led灭。由于led的内阻较小,而且有最大电流限制,所以需要串联电阻调节电流,我选用的led的最大电流为20mA,所以我使用330Ω的电阻,使其电流为10mA,不会超过电流限制。
上一篇:一文详解GD32单片机和STM32单片机
下一篇:STM32入门学习笔记之外置FLASH读写实验
推荐阅读最新更新时间:2024-11-09 12:47
设计资源 培训 开发板 精华推荐
- LTC3850、2 通道、15A/400kHz 稳压器
- TB62737FUG 升压 DC-DC 转换器用于 4 个白光 LED 驱动器的典型应用
- TA48S025F 1A 输出电流和 2.5V 低压差稳压器的典型应用,带 ON/OFF 控制开关
- DC2142A,使用 LTC3875EUJ 高效率、单输出同步降压转换器和极低 DCR 电感器的演示板
- RT8010A 1.5MHz、1A、高效PWM降压DC/DC转换器的典型应用,适用于固定电压调节器
- 带 10 个 LED 的 PAM2841 1.5A 开关电流、40V 精密 WLED 驱动器的典型应用
- 使用 Infineon Technologies AG 的 IRU3137 的参考设计
- 使用 Analog Devices 的 LT1317BCMS8 的参考设计
- 电池储能点焊机 Arduino
- LTM8064IY 58Vin、5Vout 降压型 CVCC 转换器的典型应用电路