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

实验准备

软件 protuse8.9 keil5

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

实验目的

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

实验任务

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

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

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

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

3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了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;

}
实验总结

本实验基于STM32F103的GPIO端口控制。通过操作相应的寄存器地址,我们可以控制每个GPIO引脚的电平,从而实现流水灯的点亮和熄灭。通过本次实验,我成功掌握了STM32F103的GPIO控制方法,理解了通过操作寄存器地址来控制硬件的方式。同时,我也学习了如何编写程序实现特定的硬件控制效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值