跑马灯实验

一.参考资料:

探索者STM32F4开发板:
《STM32F4开发指南-库函数版本》-第六章 跑马灯实验6.1小节
STM32F4xx官方资料:
《STM32F4xx中文参考手册》-第7章通用IO

二.GPIO基础知识

每组IO口含下面10个寄存器。也就是10个寄存器,
一共可以控制一组GPIO的16个IO口。

一个端口模式寄存器(GPIOx_MODER)
一个端口输出类型寄存器(GPIOx_OTYPER)
一个端口输出速度寄存器(GPIOx_OSPEEDR)
一个端口上拉下拉寄存器(GPIOx_PUPDR)
一个端口输入数据寄存器(GPIOx_IDR)
一个端口输出数据寄存器(GPIOx_ODR)
一个端口置位/复位寄存器(GPIOx_BSRR)
一个端口配置锁存寄存器(GPIOx_LCKR)
两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)

三.跑马灯硬件连接

图 6.2.1 LED 与 STM32F4 连接原理图

GPIO输出方式:
推挽输出(上拉)

四.GPIO相关库函数说明:

1.库函数介绍:

头文件:stm32f4xx_gpio.h
源文件:stm32f4xx_gpio.c

2.GPIO库函数介绍:

重要函数:

1个初始化函数:

void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct);
作用:初始化一个或者多个IO口(同一组)的工作模式,输出类型,速度以及上下拉方式。也就是一组IO口的4个配置寄存器。
(GPIOx->MODER, GPIOx->OSPEEDR,GPIOx->OTYPER,GPIOx->PUPDR)
GPIOx: GPIOA~GPIOK(最多11组,也就是16X11=176个IO)

typedef struct
{
uint32_t GPIO_Pin//指定要初始化的端口
GPIOMode_TypeDef GPIO_Mode;//端口模式
GPIOSpeed_TypeDef GPIO_Speed;//速度
GPIOOType_TypeDef GPIO_OType; //输出类型
GPIOPuPd_TypeDef GPIO_PuPd;//上拉或者下拉
}GPIO_InitTypeDef;
注意:外设(包括GPIO)在使用之前,几乎都要先使能对应的时钟。

GPIO_Init函数初始化样例:

GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
//GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10

2个读取输入电平函数:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平。

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。
例如:
GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平

2个读取输出电平函数:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
例如:
GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平

4个设置输出电平函数:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为高电平(1)。实际操作BSRRL寄存器。

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为低电平(0)。实际操作的BSRRH寄存器。

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
这两个函数不常用,也是用来设置IO口输出电平。

五.手把手写跑马灯实验

1.注意事项

1.使能IO口时钟。调用函数RCC_AHB1PeriphClockCmd();
不同的外设调用的时钟使能函数可能不一样
2.初始化IO口模式。调用函数GPIO_Init();
3.操作IO口,输出高低电平。
GPIO_SetBits();
GPIO_ResetBits();

2.具体操作

1.在工程目录下新建文件夹,路径如下:
实验0 Template工程模板HARDWARELED

2.在LED文件夹下新建led.c文件和led.h文件。

3.将led.h头文件路径加入:
options for target - C/C++ - include paths - 新建对应路径

4.开始编写led.c文件,led.h文件和main.c文件。

5.led.c文件代码如下:

include "led.h"

include "stm32f4xx.h"

void LED_Init(void)
{

GPIO_InitTypeDef GPIO_Initstructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
//F9
GPIO_Initstructure.GPIO_Pin=GPIO_Pin_9;
GPIO_Initstructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Initstructure.GPIO_OType=GPIO_OType_PP;
GPIO_Initstructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF,&GPIO_Initstructure);
GPIO_SetBits(GPIOF,GPIO_Pin_9);
//F10
GPIO_Initstructure.GPIO_Pin=GPIO_Pin_10;
GPIO_Initstructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Initstructure.GPIO_OType=GPIO_OType_PP;
GPIO_Initstructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF,&GPIO_Initstructure);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
}

6.led.h文件代码如下:

ifndef __LED_H

define __LED_H

void LED_Init(void);

endif

7.main.c文件代码如下:

include "led.h"

include "stm32f4xx.h"

include "delay.h"

int main(void)
{
delay_init(168);
LED_Init();
while(1)
{

    GPIO_SetBits(GPIOF,GPIO_Pin_9);
    GPIO_SetBits(GPIOF,GPIO_Pin_10);
    delay_ms(500);
    GPIO_ResetBits(GPIOF,GPIO_Pin_9);
    GPIO_ResetBits(GPIOF,GPIO_Pin_10);
    delay_ms(500);    

}
}

8.编译并且导入到stm32开发板中。

最后修改:2020 年 02 月 06 日 12 : 15 PM
如果觉得我的文章对你有用,请随意赞赏