本篇文章将从库函数和寄存器两个方法来讲述跑马灯的学习,小白总结,如有错误,请大神指教。
一、GPIO引脚说明
用的板子是STM32F103RCT6,一共四组IO口,一共51个IO口。GPIOA0—A15,GPIOB0—B15,GPIOC0—C15,GPIOD0—D2。
1.1GPIO工作方式
(1)4种输入模式:输入浮空、输入上拉、输入下拉、模拟输入
(2)4种输出模式:开漏输出(只可以输出强低电平,高电平得靠外部电阻拉高)、开漏复用功能、推挽式输出(可以输出强高低电平)、推挽式复用功能
1.2STM32引脚说明
(1)端口复用功能:就是一些端口不仅仅可以作为通用IO口,还可以复用为一些外设引脚。
作用:最大限度的利用端口资源。
(2)端口重映射功能:可以把某些功能引脚映射到其他引脚。
作用:方便布线。
1.3STM32的所有IO口都可以作为中断输入。
二、跑马灯的硬件连接
GPIOA的IO8控制mini板红灯,GPIOD的IO2控制mini板的绿灯。
IO口输出高电平,LED灭;输出低电平,LED点亮。
三、库函数方法实现跑马灯
3.1需要用到的GPIO口库函数介绍
(1)GPIO-Init函数初始化样例:
GPIO_Init(GPIOB,&GPIO_InitStructure);
(2)2个读取输入电平函数
1>
uint8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
作用:读取某个GPIO的输入电平,实际操作的是GPIOx_IDR寄存器。
样例:
GPIO_ReadInputData(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输入电平
2>
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输入电平。
样例:
GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
(3)4个设置输出电平函数
1>
void GPIO SetBits(GPIO_TypeDef* GPIOx,uint16_t GPIO_pin);
作用:设置某个IO口输出为高电平
2>
void GPIO_ResetBits(GPIO_TypeDef* GPIOx,uint16_t GPIO_pin);
作用:设置某个IO口输出为低电平
3>void GPIO WriteBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_pin,BitAction BitVal);
4>void GPIO Write(GPIO_TypeDef* GPIOx,uint16_t PortVal);
这两个函数不常用,也是用来设置IO口输出电平的。
3.2写跑马灯实验的思路
(1)使能IO口时钟。(不同的IO组,调用的时钟使能函数不一样)。
(2)初始化IO口模式。
(3)操作IO口,输出高低电平。
3.3跑马灯实验
先新建一个工程,工程文件如下:
led.c文件代码如下:
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//GPIOD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
main.c代码如下:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
int main(void)
{
LED_Init();
delay_init();
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
delay_ms(1000);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
delay_ms(1000);
}
}
现象是两个灯一起闪烁。
四、位操作的方法实现跑马灯
4.1位操作的基本原理:把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的。
4.2写跑马灯的思路
(1)使能IO口时钟。
(2)初始化IO口模式。
(3)操作IO口,输出高低电平。(使用位带操作)
4.3跑马灯实验位操作
先新建一个工程,工程文件如下:
led.c如下:
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//GPIOD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
main.c如下:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
int main(void)
{
delay_init();
LED_Init();
while(1)
{
PAout(8) = 1;
PDout(2) = 1;
delay_ms(500);
PAout(8) = 0;
PDout(2) = 0;
delay_ms(500);
}
}