( 一)
在学习STM32芯片时,首先要接触的第(一)个内容就是对STM32_GPIO接口的配置和使用。
下面以一个LED流水灯的实验来进行说明。
首先看一下LED的原理图:
从图中可以看出4个LED一端分别连接 STM32芯片的PF6\PF7\PF8\PF9四个引脚,另一端共连一高电平,因此,当PF6\PF7\PF8\PF9分别输出低电平时,4 个LED点亮,输出高电平时LED熄灭,图中电阻主要起限流作用,防止LED或GPIO引脚因电流过大而损坏。
LED流水灯就是通过对STM32引脚的配置,将引脚配置成输出(高、低)电平来实现LED灯的亮灭。
程序实现步骤
1、LED.h头文件:主要用来定义各引脚的
规则(1) #ifndef _LED_H /*测试LED.h是否被定义过*/
(2) #define _LED_H /*如果没有定义则定义*/
(3) #endif /*如果定义了,则跳过(2)、(3)直接执
/*行语句(4)、(5)*/
(4)语句………
(5) 语句………
备注:#ifndef与#endif要一起使用,否则可能报错
例:#ifndef _LED_H
#define _LED_H
#include “main.h”(其包含stm32f10x.h)注意位置要在
ifndef,与define后
#define RCC_APB2Periph_LED RCC_APB2Periph_GPIOF /*定义了LED的
使/失能时钟接口,即PF
口*/
#define GPIO_LED GPIOF/*定义LED对应的GPIO组即PF*/
/*定义了每个LED灯对应的引脚名称*/
#define GPIO_DS1_PIN GPIO_Pin_6
#define GPIO_DS2_PIN GPIO_Pin_7
#define GPIO_DS3_PIN GPIO_Pin_8
#define GPIO_DS4_PIN GPIO_Pin_9
#define LED_NUM 4 //定义了LED灯的个数4个
Void Turnon_LED(u8 LED_number);//函数声明
Void Delay(u32 nCount);//函数声明
#endif
自此LED.h文件定义完毕
2、LED.c程序文件:主要实现LED灯的流水闪烁
例:void LED(void)
{ u8 count=0;/*定义一个计数变量
GPIO_InitTypeDef GPIO_InitStructure;/*定义一结构
体用来初始化LED_GPIO
接口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_LED,ENABLE);/*
开启LED的GPIO接口时
钟
/*对各LED所连接的引脚进行配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_DS1_PIN|GPIO_DS2_PIN|
GPIO_DS3_PIN| GPIO_DS4_PIN;
/*选择引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/设置为
推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHZ;/输出速
率50MHZ,引脚作为输出时,则配置Speed,作为输入用时,可不
必配置
GPIO_Init(GPIOF,&GPIO_InitStructure)/初始化LED_GPIO接
口
下面就来给各LED对应的引脚配置高、低电平以使其亮、灭。
其中所
用到的库函数为
void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)/*将引
脚(GPIOx 可为A B C D E /GPIO_Pin 可为0—15)置高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)/将引
脚置低电平
/*首先将各LED灯的引脚置1关闭所有的LED灯*/
GPIO_SetBits(GPIO_LED,GPIO_DS1_PIN|GPIO_DS2_PIN|
GPIO_DS3_PIN|
GPIO_D4_PIN )
While(1)
{
GPIO_SetBits(GPIO_LED,GPIO_DS1_PIN|GPIO_DS2_PIN|
GPIO_DS3_PIN|
GPIO_D4_PIN )/*关
闭4个 LED灯
Turnon_LED(count%4);/*0.1.2.3.4.分别%4==0,1,2,3,0循环
*/
count++;
Delay(0x2FFFFF);/*转换成十进制为3145727
}
}
Void Turnon_LED(u8 LED_number)
{
switch(LED_number)
{
case 0: GPIO_ResetBits(GPIO_LED,GPIO_DS1_PIN);//点亮DS1
Break;很关键
case 1: GPIO_ResetBits(GPIO_LED,GPIO_DS2_PIN);//点亮DS2
Break;不要忽略
case 2: GPIO_ResetBits(GPIO_LED,GPIO_DS3_PIN);//点亮DS3
Break;重点
case 3: GPIO_ResetBits(GPIO_LED,GPIO_DS4_PIN);//点亮DS4
Break;易错
default:GPIO_ResetBits(GPIO_LED,GPIO_DS1_PIN|GPIO_DS2_PIN|
GPIO_DS3_PIN| GPIO_D4_PIN )/*打开4
个LED灯
}
}
/*延时函数*/
Void Delay(u32 nCount)
{
for(;nCount!=0;nCount--);
}
关于.h 文件,和函数声明的说明
头文件 main.h 包含stm32f10x.h ;a.h, b.h, c.h, d.h, 程序文件 main.c ;a.c,b.c,c.c,d.c
在写a,b,c,d 的.h 头文件时,要包含main.h 因为其可能用到stm32f10x.h 头文件。
在写a,b,c,d 的.c 程序文件时,包含自己的.h 文件就好了.
函数声明时,若一个函数a.c 要用到到b.c 函数,则要在a.h 文件里声明一下b.c 函数,注意函数名、有无返回值等要一致。
同时要注意在写某函数时,无返回值要在前面加void (如:void LED(void))
Keil 软件在用C/C++时要注意最后多出一行,以免有警告出现。