1.GPIO的输出模式:
- 推挽模式输出:因为LED0和LED1阳极都是3.3V,需要将阴极设置为低电平才可以点亮LED;
- 操作io口时,必须引入源文件和头文件;
- 关于时钟的文件存放在rcc中;
2.GPIO库函数介绍:
(1).1个初始化函数:
- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
- 作用:初始化一个或多个io口(同一组)的工作方式和速度,
- 该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或下拉的时候有设置BSRR或BRR寄存器;
- 主要包括设置指定初始化io口、设置工作模式(8种)、设置io口输出速度;
注意:
- 外设(包括GPIO)在使用之前,几乎都要先使能对应的时钟;
- 可以一次初始化一个io组下的多个io,前提是这些io口的设置方式一样;
(2).2个读取输入电平函数:
- uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- 作用:读取某个GPIO的输入电平。实际操作GPIOx_IDR寄存器;
- uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
- 作用:读取某组GPIO的输入电平。实际也是操作GPIOx_IDR寄存器;
(3).2个读取输出电平函数:
- uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- 作用:读取某个GPIO的输出电平。实际操作的是GPIOx_ODR寄存器;
- uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
- 作用:读取某组GPIO的输出电平。实际也是操作GPIOx_ODR寄存器;
(4).4个设置输出电平函数:
- void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- 作用:设置某个io口输出为高电平(1)。实际操作BSRR寄存器;
- void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- 作用:设置某个io口输出为低电平(0)。实际操作BRR寄存器;
- void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
- void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
- 以上两个函数不常用,也是用来设置io口输出电平;
3.相关引脚原理图:
4.跑马灯实验步骤:
- 使能io口时钟,调用RCC_APB2PeriphClockCmd()函数实现;
- 初始化io口模式,调用GPIO_Init()函数实现;
- 操作io口,输出高低电平;GPIO_SetBits()和GPIO_ResetBits()函数实现;
注意:
在使能io口时钟时,不同的io组,调用的时钟使能函数不一样;
(1)主函数:
#include "led.h"
#include "delay.h"int main(){LED_Init(); //LED初始化delay_init(); //延时初始化while(1){delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0亮GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1不亮delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0不亮GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1亮}}
(2)LED头文件:
#ifndef __LED_H
#define __LED_Hvoid LED_Init();#endif
(3)LED初始化功能函数:
#include "led.h"
#include "stm32f10x.h"/*1.功能:LED的初始化2.返回参数:无
*/
void LED_Init(){GPIO_InitTypeDef GPIO_InitStruct;//1.初始化io时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);//2.配置GPIOGPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD; //推挽输出模式->既可以输出高电平也可以输出低电平GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5; //PB5GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //输出速率50MHzGPIO_Init(GPIOB,&GPIO_InitStruct);GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0灭->LED对应的引脚,高电平灭,低电平亮GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD; //推挽输出模式GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5; //PE5GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStruct); GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1灭}