注:文章内使用的MCU是STM32F107,原理图在这里。
本文的程序使用的是库函数开发
一、流水灯实验原理
先看一下LED灯模块的原理图:
从原理图中可以很清楚地看出来,只有把左边引脚设成低电平,LED灯就会被点亮,否则,LED灯处于熄灭状态。
因此,STM32的作用就是按一定规律把GPIOD的2、3、4、7引脚拉低拉高。
流程图
根据实验的原理及设想,可以得到主程序的流程图。
二、管脚配置
STM32的管脚和51MCU相比,功能更加丰富。STM32的管脚可以设置成不同的功能,成为”分时复用”,具体请移步ST提供的DataSheet和参考手册。
同时,不同于51MCU的流水灯程序(以AT89S52为例):
#include <reg52.h>
#include <intrins.h>
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的所有外设(包括管脚)的使用流程:
三、CODE
下面就贴一下代码。
关于STM32项目的建立,可参考STM32F1开发指南-库函数版本_V3.1 .pdf第三章。
//LED.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LED_Init(void);
#endif
//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初始化函数
}
//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--);
}
总结
GPIO管脚配置+软件延时实现流水灯是学习STM32过程中最基础外设,也是最重要的资源之一,需要深入的了解。本文趋向实用性,对于GPIO管脚的复用和寄存器配置未进行详细说明,请移步相关文档继续研究。