一、LED模块硬件电路
二、GPIO库函数介绍
(一)GPIO外设的库文件
stm32f10x_gpio.c stm32f10x_gpio.h
(二)GPIO常用库函数
初始化函数
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;
设置管脚输出电平函数
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);
功能:设置端口管脚输出电平,很少使用。
读取管脚输入电平函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。
读取管脚输出电平函数
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输出电平。底层是通过读取ODR寄存器
(三)使能GPIO时钟函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
不同的外设调用的时钟使能函数可能不一样
使能GPIOC端口时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
三、GPIO初始化步骤
- 使能对应的GPIO端口时钟
- 初始化GPIO
四、使用库函数编写跑马灯程序
程序框架如下:
- LED初始化
- 跑马灯
led.h
#ifndef _led_H
#define _led_H
#include "stm32f10x_gpio.h"
#define LED_PORT GPIOC
#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)
#define LED_1 GPIO_Pin_0
#define LED_2 GPIO_Pin_1
#define LED_3 GPIO_Pin_2
#define LED_4 GPIO_Pin_3
#define LED_5 GPIO_Pin_4
#define LED_6 GPIO_Pin_5
#define LED_7 GPIO_Pin_6
#define LED_8 GPIO_Pin_7
#define LED_PORT_RCC RCC_APB2Periph_GPIOC
void LED_Init(void);
void LED_Test(void);
void delay(u32 i);
#endif
led.c
#include "led.h"
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=LED_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(LED_PORT,&GPIO_InitStructure);
GPIO_SetBits(LED_PORT,LED_PIN);
}
void LED_Test(void)
{
int i=8;
LED_Init();
while(1)
{
switch(i)
{
case 1: GPIO_ResetBits(LED_PORT,LED_1); break;
case 2: GPIO_ResetBits(LED_PORT,LED_2); break;
case 3: GPIO_ResetBits(LED_PORT,LED_3); break;
case 4: GPIO_ResetBits(LED_PORT,LED_4); break;
case 5: GPIO_ResetBits(LED_PORT,LED_5); break;
case 6: GPIO_ResetBits(LED_PORT,LED_6); break;
case 7: GPIO_ResetBits(LED_PORT,LED_7); break;
case 8: GPIO_ResetBits(LED_PORT,LED_8); break;
default: GPIO_SetBits(LED_PORT,LED_PIN); i=9; break;
}
delay(1000000);
i--;
}
}
void delay(u32 i)
{
while(i--);
}
main.c
#include "stm32f10x.h"
#include "led.h"
int main()
{
while(1)
{
LED_Init();
LED_Test();
}
}