STM32初学者的点灯入门指南
一、点亮一盏灯基本的步骤
1、看电路板
(1)电路板实图:找丝印R35 、R36、 R37、 R38。
2、看原理图文档(电路图)
(1)电路板上的丝印(R35) –>(2)原理图文档(搜索R35)–>(3)电路图(红色字体: LED0)
3、看原理图文档(GPIO组、引脚)
(1)原理图文档 –>(2)搜索(LED0)–> (3)找到该led灯的引脚是多少(PF9 : PF组、第9号引脚)
4、.h文档(部分解析)
5、led.c文档(部分解析)
(1)
(2)
二、点亮一盏灯
led.h 文件
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((volatile unsigned int *)(0x40023800+0x30))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_MODER (*((volatile unsigned int *)(0x40021400+0x00))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_OTYPER (*((volatile unsigned int *)(0x40021400+0x04))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_OSPEEDR (*((volatile unsigned int *)(0x40021400+0x08))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_PUPDR (*((volatile unsigned int *)(0x40021400+0x0C))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_ODR (*((volatile unsigned int *)(0x40021400+0x14))) //值强制转换为地址 通过地址解引用访问地址空间
void Led_Init(void);
#endif
led.c文件
#include "led.h"
/*******************************
引脚说明
LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;
*********************************/
void Led_Init(void)
{
// 打开GPIOF组时钟(PF9属于GPIOF组时钟) RCC_AHB1ENR:外设时钟使能寄存器
RCC_AHB1ENR |= (0x01<<5); //第5位置1
// 01:通用输出模式 GPIO 端口模式寄存器
GPIOF_MODER &= ~(0x01<<19); //第19位清0
GPIOF_MODER |= (0x01<<18); //第18位置1
// 0:输出推挽(复位状态) GPIO 端口输出类型寄存器
GPIOF_OTYPER &= ~(0x02<<9); //第9位清0
// 01:25 MHz(中速) GPIO 端口输出速度寄存器
GPIOF_OSPEEDR &= ~(0x01<<19); //第19位清0
GPIOF_OSPEEDR |= (0x01<<18); //第18位置1
// 01:上拉 GPIO 端口上拉/下拉寄存器
GPIOF_PUPDR &= ~(0x01<<19); //第19位清0
GPIOF_PUPDR |= (0x01<<18); //第18位置1
}
main.c文件
#include "stm32f4xx.h"
#include "led.h"
//粗延时
void delay(int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<30000; j++)
{
}
}
}
int main(void)
{
Led_Init();
//灯亮
GPIOF_ODR &= ~(0x01<<9); //第9位清0
return 0;
}
三、一盏灯,灯亮灯灭(一亮一灭)
main.c文件 (前面的led.h文档和led.c文档不变)
#include "stm32f4xx.h"
#include "led.h"
//粗延时
void delay(int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<30000; j++)
{
}
}
}
int main(void)
{
Led_Init();
while(1)
{
//灯灭 GPIO 端口输出数据寄存器
GPIOF_ODR |= (0x01<<9); // 第9位置1
delay(500);
//灯亮
GPIOF_ODR &= ~(0x01<<9); // 第9位清0
delay(500);
}
return 0;
}
四、同时点亮四盏灯(同时闪烁)
led.h 文件
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((volatile unsigned int *)(0x40023800+0x30))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_MODER (*((volatile unsigned int *)(0x40021400+0x00))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_OTYPER (*((volatile unsigned int *)(0x40021400+0x04))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_OSPEEDR (*((volatile unsigned int *)(0x40021400+0x08))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_PUPDR (*((volatile unsigned int *)(0x40021400+0x0C))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_ODR (*((volatile unsigned int *)(0x40021400+0x14))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_MODER (*((volatile unsigned int *)(0x40021000+0x00))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_OTYPER (*((volatile unsigned int *)(0x40021000+0x04))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_OSPEEDR (*((volatile unsigned int *)(0x40021000+0x08))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_PUPDR (*((volatile unsigned int *)(0x40021000+0x0C))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_ODR (*((volatile unsigned int *)(0x40021000+0x14))) //值强制转换为地址 通过地址解引用访问地址空间
void Led_Init(void);
#endif
led.c文件
#include "led.h"
/*******************************
引脚说明
LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;
LED1 连接在 PF10
FSMC_D10 连接在 PE13
FSMC_D11 连接在 PE14
*********************************/
void Led_Init(void)
{
//
// LED0连接在PF9
//
// 打开GPIOF组时钟(PF9属于GPIOF组时钟) RCC_AHB1ENR:外设时钟使能寄存器
RCC_AHB1ENR |= (0x01<<5); //第5位置1
// 01:通用输出模式 GPIO 端口模式寄存器
GPIOF_MODER &= ~(0x01<<19); //第19位清0
GPIOF_MODER |= (0x01<<18); //第18位置1
// 0:输出推挽(复位状态) GPIO 端口输出类型寄存器
GPIOF_OTYPER &= ~(0x02<<9); //第9位清0
// 01:25 MHz(中速) GPIO 端口输出速度寄存器
GPIOF_OSPEEDR &= ~(0x01<<19); //第19位清0
GPIOF_OSPEEDR |= (0x01<<18); //第18位置1
// 01:上拉 GPIO 端口上拉/下拉寄存器
GPIOF_PUPDR &= ~(0x01<<19); //第19位清0
GPIOF_PUPDR |= (0x01<<18); //第18位置1
//
// LED1 连接在 PF10
//
// 1.GPIO 端口模式寄存器(01:通用输出模式 )
GPIOF_MODER &= ~(0x001<<21); // 第21位清0
GPIOF_MODER |= (0x001<<20); // 第20位置1
// 2.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
GPIOF_OTYPER &= ~(0x01<<10); // 第10位清0
// 3.GPIO 端口输出速度寄存器(01:25 MHz(中速))
GPIOF_OSPEEDR &= ~(0x01<<21); // 第21位清0
GPIOF_OSPEEDR |= (0x01<<20); // 第20位置1
// 4.GPIO 端口上拉/下拉寄存器(01:上拉)
GPIOF_PUPDR &= ~(0x01<<21); // 第21位清0
GPIOF_PUPDR |= (0x01<<20); // 第20位置1
//
// FSMC_D10 连接在 PE13
//
// 1.打开 GPIOE 组时钟(PE13属于GPIOE组时钟) RCC_AHB1ENR:外设时钟使能寄存器
RCC_AHB1ENR |= (0x01<<4); //第4位置1
// 2.GPIO 端口模式寄存器(01:通用输出模式 )
GPIOE_MODER &= ~(0x001<<27); // 第27位清0
GPIOE_MODER |= (0x001<<26); // 第26位置1
// 3.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
GPIOE_OTYPER &= ~(0x01<<13); // 第13位清0
// 4.GPIO 端口输出速度寄存器(01:25 MHz(中速))
GPIOE_OSPEEDR &= ~(0x01<<27); // 第27位清0
GPIOE_OSPEEDR |= (0x01<<26); // 第26位置1
// 5.GPIO 端口上拉/下拉寄存器(01:上拉)
GPIOE_PUPDR &= ~(0x01<<27); // 第27位清0
GPIOE_PUPDR |= (0x01<<26); // 第26位置1
//
// FSMC_D11 连接在 PE14
//
// 1.GPIO 端口模式寄存器(01:通用输出模式 )
GPIOE_MODER &= ~(0x001<<29); // 第29位清0
GPIOE_MODER |= (0x001<<28); // 第28位置1
// 2.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
GPIOE_OTYPER &= ~(0x01<<14); // 第14位清0
// 3.GPIO 端口输出速度寄存器(01:25 MHz(中速))
GPIOE_OSPEEDR &= ~(0x01<<29); // 第29位清0
GPIOE_OSPEEDR |= (0x01<<28); // 第28位置1
// 4.GPIO 端口上拉/下拉寄存器(01:上拉)
GPIOE_PUPDR &= ~(0x01<<29); // 第29位清0
GPIOE_PUPDR |= (0x01<<28); // 第28位置1
}
main.c文件
#include "stm32f4xx.h"
#include "led.h"
//粗延时
void delay(int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<30000; j++)
{
}
}
}
int main(void)
{
Led_Init();
while(1)
{
//灯灭 GPIO 端口输出数据寄存器
GPIOF_ODR |= (0x01<<9); // LED0 第9位置1
GPIOF_ODR |= (0x01<<10); // LED1 第10位置1
GPIOE_ODR |= (0x01<<13); // FSMC_D10 第13位置1
GPIOE_ODR |= (0x01<<14); // FSMC_D11 第14位置1
delay(500);
//灯亮
GPIOF_ODR &= ~(0x01<<9); // LED0 第9位清0
GPIOF_ODR &= ~(0x01<<10); // LED1 第10位清0
GPIOE_ODR &= ~(0x01<<13); // FSMC_D10 第13位清0
GPIOE_ODR &= ~(0x01<<14); // FSMC_D11 第14位清0
delay(500);
}
return 0;
}
效果动图(略)
五、流水灯
led.h 文件
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((volatile unsigned int *)(0x40023800+0x30))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_MODER (*((volatile unsigned int *)(0x40021400+0x00))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_OTYPER (*((volatile unsigned int *)(0x40021400+0x04))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_OSPEEDR (*((volatile unsigned int *)(0x40021400+0x08))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_PUPDR (*((volatile unsigned int *)(0x40021400+0x0C))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOF_ODR (*((volatile unsigned int *)(0x40021400+0x14))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_MODER (*((volatile unsigned int *)(0x40021000+0x00))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_OTYPER (*((volatile unsigned int *)(0x40021000+0x04))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_OSPEEDR (*((volatile unsigned int *)(0x40021000+0x08))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_PUPDR (*((volatile unsigned int *)(0x40021000+0x0C))) //值强制转换为地址 通过地址解引用访问地址空间
#define GPIOE_ODR (*((volatile unsigned int *)(0x40021000+0x14))) //值强制转换为地址 通过地址解引用访问地址空间
void Led_Init(void);
#endif
led.c文件
#include "led.h"
/*******************************
引脚说明
LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;
LED1 连接在 PF10
FSMC_D10 连接在 PE13
FSMC_D11 连接在 PE14
*********************************/
void Led_Init(void)
{
// 打开GPIOF组时钟(PF9属于GPIOF组时钟) RCC_AHB1ENR:外设时钟使能寄存器
RCC_AHB1ENR |= (0x01<<5); //第5位置1
// 打开 GPIOE 组时钟(PE13属于GPIOE组时钟) RCC_AHB1ENR:外设时钟使能寄存器
RCC_AHB1ENR |= (0x01<<4); //第4位置1
// 1.GPIO 端口模式寄存器(01:通用输出模式 )
GPIOF_MODER &= ~(0x01<<19); // 第19位清0
GPIOF_MODER |= (0x01<<18); // 第18位置1
GPIOF_MODER &= ~(0x01<<21); // 第21位清0
GPIOF_MODER |= (0x01<<20); // 第20位置1
GPIOE_MODER &= ~(0x01<<27); // 第27位清0
GPIOE_MODER |= (0x01<<26); // 第26位置1
GPIOE_MODER &= ~(0x01<<29); // 第29位清0
GPIOE_MODER |= (0x01<<28); // 第28位置1
// 2.GPIO 端口输出类型寄存器(0:输出推挽(复位状态))
GPIOF_OTYPER &= ~(0x02<<9); //第9位清0
GPIOF_OTYPER &= ~(0x01<<10); // 第10位清0
GPIOE_OTYPER &= ~(0x01<<13); // 第13位清0
GPIOE_OTYPER &= ~(0x01<<14); // 第14位清0
// 3.GPIO 端口输出速度寄存器(01:25 MHz(中速))
GPIOF_OSPEEDR &= ~(0x01<<19); //第19位清0
GPIOF_OSPEEDR |= (0x01<<18); //第18位置1
GPIOF_OSPEEDR &= ~(0x01<<21); // 第21位清0
GPIOF_OSPEEDR |= (0x01<<20); // 第20位置1
GPIOE_OSPEEDR &= ~(0x01<<27); // 第27位清0
GPIOE_OSPEEDR |= (0x01<<26); // 第26位置1
GPIOE_OSPEEDR &= ~(0x01<<29); // 第29位清0
GPIOE_OSPEEDR |= (0x01<<28); // 第28位置1
// 4.GPIO 端口上拉/下拉寄存器(01:上拉)
GPIOF_PUPDR &= ~(0x01<<19); //第19位清0
GPIOF_PUPDR |= (0x01<<18); //第18位置1
GPIOF_PUPDR &= ~(0x01<<21); // 第21位清0
GPIOF_PUPDR |= (0x01<<20); // 第20位置1
GPIOE_PUPDR &= ~(0x01<<27); // 第27位清0
GPIOE_PUPDR |= (0x01<<26); // 第26位置1
GPIOE_PUPDR &= ~(0x01<<29); // 第29位清0
GPIOE_PUPDR |= (0x01<<28); // 第28位置1
}
main.c文件
#include "stm32f4xx.h"
#include "led.h"
/*
流水灯:led0、led1、led2、led3
led0 灭 led1 亮 + 延时
led1 灭 led2 亮 + 延时
led2 灭 led3 亮 + 延时
led3 灭 led0 亮 + 延时
循环
*/
//粗延时
void delay(int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<30000; j++)
{}
}
}
int main(void)
{
Led_Init();
while(1)
{
delay(500);
//灯灭 GPIO 端口输出数据寄存器
GPIOF_ODR |= (0x01<<9); // LED0 第9位置1
//灯亮
GPIOF_ODR &= ~(0x01<<10); // LED1 第10位清0
delay(500);
GPIOF_ODR |= (0x01<<10); // LED1 第10位置1
GPIOE_ODR &= ~(0x01<<13); // FSMC_D10 第13位清0
delay(500);
GPIOE_ODR |= (0x01<<13); // FSMC_D10 第13位置1
GPIOE_ODR &= ~(0x01<<14); // FSMC_D11 第14位清0
delay(500);
GPIOE_ODR |= (0x01<<14); // FSMC_D11 第14位置1
GPIOE_ODR &= ~(0x01<<13); // FSMC_D10 第13位清0
delay(500);
GPIOE_ODR |= (0x01<<13); // FSMC_D10 第13位置1
GPIOF_ODR &= ~(0x01<<10); // LED1 第10位清0
delay(500);
GPIOF_ODR |= (0x01<<10); // LED1 第10位置1
GPIOF_ODR &= ~(0x01<<9); // LED0 第9位清0
}
return 0;
}
效果动图(略)。
作者:不会装罐