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

本文介绍了如何使用STM32F103C8T6开发板配合Keil5和Proteus进行LED流水灯实验,涉及GPIO配置、寄存器编程和C语言实现,包括STM32最小系统电路原理和LED轮流闪烁的控制逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

实验准备

软件 protuse8.9 keil5

硬件 STM32F103C8T6最小系统版 面包板 led*3 stlink 跳线若干

实验目的

了解寄存器的配置和输出流程,完成实际的硬件操作

实验任务

. 了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

最小系统板的引脚原理图如下所示,电路原理图请网上查找。

STM32最小系统核心板(STM32F103C8T6)+面板板+3_(或更多)红绿蓝LED 搭建电路,使用GPIOAGPIOBGPIOC3个端口控制LED灯,轮流闪烁,间隔时长1秒。

1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

2)用C语言寄存器方式编程实现,代码须有详细注解。

3STM32最小系统核心板子出厂时已经焊接好了1led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

实验内容

实验内容

实验要求1

Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

步骤1

了解STM32最小系统核心板(STM32F103C8T6的电路原理图

步骤2

电路原理图,创建工程并设计电路图

步骤3

Keil5下生成hex文件在proteus仿真

代码如下

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;

void delay_ms(uint32_t ms)

{

       uint32_t i_cnt,j_cnt;

       for(i_cnt=0;i_cnt<3000;i_cnt++);

       for(j_cnt=0;j_cnt<ms;j_cnt++);

      

}

uint32_t i;

int main(void)

{

 

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

       GPIO_Init(GPIOC, &GPIO_InitStructure);

       GPIOC->BSRR=0xff;

       while (1)

       {

         for(i=0;i<8;i++)

         {

              delay_ms(99000);

              GPIOC->BRR=(1<<i); 

               

              delay_ms(99000);

              GPIOC->BSRR=(1<<i);

         }

       }

}

步骤4

仿真结果

实验要求2

二.  以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。

1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

2)用C语言寄存器方式编程实现,代码须有详细注解。

3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

步骤1

写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

关闭GPIOB的Pin9和GPIOC的Pin15灯

延时1秒

点亮GPIOB的Pin9灯

关闭GPIOA的Pin7和GPIOC的Pin15灯

延时1秒

点亮GPIOC的Pin15灯

关闭GPIOA的Pin7和GPIOB的Pin9灯

延时1秒

GPIOx端口的各寄存器地址和详细参数:

GPIOA_BASE:0x40010800

GPIOB_BASE:0x40010C00

GPIOC_BASE:0x40011000

GPIOx_CRL/CRH:GPIO配置寄存器,用于配置各引脚的模式、速度和推挽/开漏等属性。

步骤2

用C语言寄存器方式编程实现,代码须有详细注解

代码如下

#include <stdint.h>

#include <stm32f10x.h>

void delay(uint32_t count) {

    for (volatile uint32_t i = 0; i < count; ++i) {

        for (volatile uint32_t j = 0; j < 7200; ++j) {}

    }

}

int main(void) {

    // 1. 初始化GPIOA、GPIOB和GPIOC的相关寄存器,配置为输出模式

    // 使能GPIOA、GPIOB和GPIOC的时钟

    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;

    // 配置GPIOA的Pin7为推挽输出模式

    GPIOA->CRL &= ~(GPIO_CRL_CNF7 | GPIO_CRL_MODE7);

    GPIOA->CRL |= GPIO_CRL_MODE7;

    // 配置GPIOB的Pin9为推挽输出模式

    GPIOB->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9);

    GPIOB->CRH |= GPIO_CRH_MODE9;

    // 配置GPIOC的Pin15为推挽输出模式

    GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13);

    GPIOC->CRH |= GPIO_CRH_MODE13;

    // 2. 循环中轮流点亮其中一个LED灯,并延时1秒

    while (1) {

        // 点亮GPIOA的Pin7灯

        GPIOA->BSRR = GPIO_BSRR_BS7;

        // 关闭GPIOB的Pin9和GPIOC的Pin15灯

        GPIOB->BRR = GPIO_BRR_BR9;

        GPIOC->BRR = GPIO_BRR_BR13;

        delay(1000); // 延时1秒

        // 点亮GPIOB的Pin9灯

        GPIOB->BSRR = GPIO_BSRR_BS9;

        // 关闭GPIOA的Pin7和GPIOC的Pin15灯

        GPIOA->BRR = GPIO_BRR_BR7;

        GPIOC->BRR = GPIO_BRR_BR13;

        delay(1000); // 延时1秒

        // 点亮GPIOC的Pin15灯

        GPIOC->BSRR = GPIO_BSRR_BS13;

        // 关闭GPIOA的Pin7和GPIOB的Pin9灯

        GPIOA->BRR = GPIO_BRR_BR7;

        GPIOB->BRR = GPIO_BRR_BR9;

        delay(1000); // 延时1秒

    }

    return 0;

}

步骤3

3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

代码如下

#include <stdint.h>

#include <stm32f10x.h>

#include <Delay.h>

int main(void) {

    // 1. 初始化GPIOA、GPIOB和GPIOC的相关寄存器,配置为输出模式

    // 使能GPIOA、GPIOB和GPIOC的时钟

    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;

    // 配置GPIOA的Pin7为推挽输出模式

    GPIOA->CRL &= ~(GPIO_CRL_CNF7 | GPIO_CRL_MODE7);

    GPIOA->CRL |= GPIO_CRL_MODE7;

    // 配置GPIOB的Pin9为推挽输出模式

    GPIOB->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9);

    GPIOB->CRH |= GPIO_CRH_MODE9;

    // 配置GPIOC的Pin13为推挽输出模式

    GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13);

    GPIOC->CRH |= GPIO_CRH_MODE13;

    // 2. 循环中轮流点亮其中一个LED灯,并延时1秒

    while (1) {

        // 点亮GPIOA的Pin7灯

        GPIOA->BSRR = GPIO_BSRR_BS7;

        // 关闭GPIOB的Pin9和GPIOC的Pin13灯

        GPIOB->BRR = GPIO_BRR_BR9;

        GPIOC->BRR = GPIO_BRR_BR13;

        Delay_ms(1000); // 延时1秒

        // 点亮GPIOB的Pin9灯

        GPIOB->BSRR = GPIO_BSRR_BS9;

        // 关闭GPIOA的Pin7和GPIOC的Pin13灯

        GPIOA->BRR = GPIO_BRR_BR7;

        GPIOC->BRR = GPIO_BRR_BR13;

              Delay_ms(1000); // 延时1秒

        // 点亮GPIOC的Pin13灯

        GPIOC->BSRR = GPIO_BSRR_BS13;

        // 关闭GPIOA的Pin7和GPIOB的Pin9灯

        GPIOA->BRR = GPIO_BRR_BR7;

        GPIOB->BRR = GPIO_BRR_BR9;

        Delay_ms(1000); // 延时1秒

    }

    return 0;

}

实验总结

通过本次实验我掌握通过STM32最小系统核心板搭建电路的方法,通过GPIOA、GPIOB、GPIOC三个端口控制三只LED灯的闪烁,闪烁间隔为1秒。

并熟悉了配置GPIO端口的工作模式和输出模式。在本实验中,使用的是推挽输出模式。

然后,需要设置GPIO端口的输出速度。在本实验中,使用的是中速输出模式。

接下来,需要设置GPIO端口的输出状态。通过设置GPIO端口的寄存器来实现LED灯的亮灭控制。

最后,为了实现轮流闪烁,可以使用延时函数来控制LED灯的亮灭状态切换。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值