STM32F103的流水灯点亮
实验1: STM32F103的流水灯点亮版本1(寄存器地址操作)
实验目标
- 了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
- 以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
实验准备
- Keil5 MDK
- Proteus
- STM32最小系统板
- 面包板
- LED
实验内容
1. STM32流水灯仿真
-
代码实现
-
Proteus电路连接
-
实际效果
2. STM32 + 面包板实现流水灯
这里使用PA0、PB0、PC13三个端口分别外接一个LED灯,并设计程序控制3个LED灯轮流闪烁,间隔时长1秒。
-
代码实现
代码使用标准库来实现。
- 首先是需要用到的3个GPIO端口的初始化:
// GPIOA的初始化 void GPIOA_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 使能GPIOA外设时钟,以便使用它 GPIO_InitTypeDef GPIO_InitStructure; // 创建一个GPIO_InitTypeDef结构体变量,用于配置GPIOA引脚的初始化参数 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置GPIOA的工作模式为推挽输出(GPIO_Mode_Out_PP) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置GPIOA的引脚为Pin 0 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置GPIOA的输出速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 使用上述的GPIO_InitStructure配置GPIOA引脚 } // GPIOB的初始化 void GPIOB_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB外设时钟,以便使用它 GPIO_InitTypeDef GPIO_InitStructure2; // 创建一个GPIO_InitTypeDef结构体变量,用于配置GPIOB引脚的初始化参数 GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP; // 配置GPIOB的工作模式为推挽输出(GPIO_Mode_Out_PP) GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_0; // 配置GPIOB的引脚为Pin 0 GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz; // 配置GPIOB的输出速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure2); // 使用上述的GPIO_InitStructure2配置GPIOB引脚 } // GPIOC的初始化 void GPIOC_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC外设时钟,以便使用它 GPIO_InitTypeDef GPIO_InitStructure3; // 创建一个GPIO_InitTypeDef结构体变量,用于配置GPIOC引脚的初始化参数 GPIO_InitStructure3.GPIO_Mode = GPIO_Mode_Out_PP; // 配置GPIOC的工作模式为推挽输出(GPIO_Mode_Out_PP) GPIO_InitStructure3.GPIO_Pin = GPIO_Pin_13; // 配置GPIOC的引脚为Pin 0 GPIO_InitStructure3.GPIO_Speed = GPIO_Speed_50MHz; // 配置GPIOC的输出速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure3); // 使用上述的GPIO_InitStructure3配置GPIOC引脚 }
- 延时函数 Delay_ms 的实现:
void Delay_ms(uint32_t xms) { while(xms--) { Delay_us(1000); } }
- main 函数的实现:
int main(void) { while (1) { GPIO_SetBits(GPIOA, GPIO_Pin_0); // 在GPIOA的引脚0上设置高电平(点亮LED等操作) Delay_ms(1000); // 延时1秒 GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 在GPIOA的引脚0上设置低电平(熄灭LED等操作) GPIO_SetBits(GPIOB, GPIO_Pin_0); // 在GPIOB的引脚0上设置高电平 Delay_ms(1000); // 延时1秒 GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 在GPIOB的引脚0上设置低电平 GPIO_SetBits(GPIOC, GPIO_Pin_13); // 在GPIOC的引脚13上设置高电平 Delay_ms(1000); // 延时1秒 GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 在GPIOC的引脚13上设置低电平 } }
完整代码如下:
#include "stm32f10x.h" // Device header #include "Delay.h" void GPIOA_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void GPIOB_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure2; GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure2); } void GPIOC_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure3; GPIO_InitStructure3.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure3.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure3.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure3); } int main(void) { while (1) { GPIO_SetBits(GPIOA, GPIO_Pin_0); // 在GPIOA的引脚0上设置高电平(点亮LED等操作) Delay_ms(1000); // 延时1秒 GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 在GPIOA的引脚0上设置低电平(熄灭LED等操作) GPIO_SetBits(GPIOB, GPIO_Pin_0); // 在GPIOB的引脚0上设置高电平 Delay_ms(1000); // 延时1秒 GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 在GPIOB的引脚0上设置低电平 GPIO_SetBits(GPIOC, GPIO_Pin_13); // 在GPIOC的引脚13上设置高电平 Delay_ms(1000); // 延时1秒 GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 在GPIOC的引脚13上设置低电平 } }
-
实际效果
先将STM32、面包板和LED按如下方式连接:
将代码烧录到STM32最小系统板中,可以看到如下效果: