STM32F103的流水灯点亮

实验1: STM32F103的流水灯点亮版本1(寄存器地址操作)

实验目标

  1. 了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
  2. 以 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最小系统板中,可以看到如下效果:

参考

STM32入门教程-LED闪烁&LED流水灯&蜂鸣器

Proteus8.9仿真运行stm32流水灯程序——实例

posted @ 2023-09-29 16:55  回文串多放孜然  阅读(205)  评论(0编辑  收藏  举报