从一个月前开始学习 STM32,对于 MCU 的理解也更加深入透彻。今天开始就陆续将自己在学习中的经历发布到这里(当然,更新随缘)。

1 流水灯实验原理

LED 模块的原理图如图 1 所示:

图1 LED模块原理图

图 1 LED 模块原理图

从原理图中可以很清楚地看出来,只有把左边引脚设成低电平,LED 灯就会被点亮,否则,LED 灯处于熄灭状态。
因此,STM32 的作用就是按一定规律把 GPIOD 的 2、3、4、7 引脚拉低拉高。

2 管脚配置

STM32 的管脚和 8051MCU 相比,功能更加丰富。STM32 的管脚可以设置成不同的功能,成为 “分时复用”,具体请移步 ST 提供的 DataSheet 参考手册

同时,不同于 51MCU 的流水灯程序(以 AT89S52 为例):

c
1
2
3
4
5
6
7
8
9
10
11
12
13
#include 
#include
void delay(unsigned int nCount);
void main(void){
P1 = 0xfe;
while(1){
P1 = _crol_ (P1,1); //循环左移函数,在intrins.h中定义
delay(5000);
}
}
void delay(unsigned int nCount){
for(; nCount != 0; nCount--);
}

将 STM32 的管脚拉低拉高需要配置 STM32 管脚的输入输出模式,详见下表:

模式名称 标识
浮空输入 GPIO_MODE_IN_FLOATING
带上拉输入 GPIO_MODE_IPU
带下拉输入 GPIO_MODE_IPD
模拟输入 GPIO_MODE_AIN
开漏输出 GPIO_MODE_OUT_OD
推挽输出 GPIO_MODE_OUT_PP
复用_推挽输出 GPIO_MODE_AF_PP
复用_开漏输出 GPIO_MODE_AF_OD

另外,还要提一点,关于 STM32 的所有外设(包括管脚) 的使用流程:
初始化 (Initialization)–> 配置 (Configuation)–> 调用 (Call)

3 CODE

下面就贴一下代码。

关于 STM32 项目的建立,可参考 STM32F1 开发指南 - 库函数版本_V3.1 .pdf 第三章。

c
1
2
3
4
5
6
7
8
9
//LED.h
#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

void LED_Init(void);

#endif
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//LED.c
#include "led.h"

void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//使能对应GPIO的Clock时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_7;
//设置端口

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置端口模式 推挽输出(Push-Pull)

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//最大输出速度50MHz

GPIO_Init(GPIOD, &GPIO_InitStructure);
//调用GPIO初始化函数
}
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//main.c
#include "led.h"

void delay(uint32_t);

int main(void)
{
LED_Init();
while(1)
{
GPIO_ResetBits(GPIOD, GPIO_Pin_2); //将GPIOD的Pin2拉低
delay(1600000);
GPIO_SetBits(GPIOD, GPIO_Pin_2); //将GPIOD的Pin2拉高
delay(1600000);

GPIO_ResetBits(GPIOD, GPIO_Pin_3);
delay(800000);
GPIO_SetBits(GPIOD, GPIO_Pin_3);
delay(800000);

GPIO_ResetBits(GPIOD, GPIO_Pin_4);
delay(400000);
GPIO_SetBits(GPIOD, GPIO_Pin_4);
delay(400000);

GPIO_ResetBits(GPIOD, GPIO_Pin_7);
delay(200000);
GPIO_SetBits(GPIOD, GPIO_Pin_7);
delay(20000);
}
}

void delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}

4 总结

GPIO 管脚配置 + 软件延时实现流水灯是学习 STM32 过程中最基础外设,也是最重要的资源之一,需要深入的了解。本文趋向实用性,对于 GPIO 管脚的复用和寄存器配置未进行详细说明,请移步相关文档继续研究。