从一个月前开始学习 STM32,对于 MCU 的理解也更加深入透彻。今天开始就陆续将自己在学习中的经历发布到这里(当然,更新随缘)。
1 流水灯实验原理
LED 模块的原理图如图 1 所示:

图 1 LED 模块原理图
从原理图中可以很清楚地看出来,只有把左边引脚设成低电平,LED 灯就会被点亮,否则,LED 灯处于熄灭状态。
因此,STM32 的作用就是按一定规律把 GPIOD 的 2、3、4、7 引脚拉低拉高。
2 管脚配置
STM32 的管脚和 8051MCU 相比,功能更加丰富。STM32 的管脚可以设置成不同的功能,成为 “分时复用”,具体请移步 ST 提供的 DataSheet 和 参考手册。
同时,不同于 51MCU 的流水灯程序(以 AT89S52 为例):
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); 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 第三章。
1 2 3 4 5 6 7 8 9
| #ifndef __LED_H #define __LED_H
#include "stm32f10x.h"
void LED_Init(void);
#endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include "led.h"
void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure); }
|
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
| #include "led.h"
void delay(uint32_t);
int main(void) { LED_Init(); while(1) { GPIO_ResetBits(GPIOD, GPIO_Pin_2); delay(1600000); GPIO_SetBits(GPIOD, GPIO_Pin_2); 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 管脚的复用和寄存器配置未进行详细说明,请移步相关文档继续研究。