【STM32F103实验(一)】跑马灯

这篇博客介绍了如何在STM32F103正点原子精英版上实现LED0和LED1每间隔1秒交替闪烁的跑马灯效果。内容包括硬件电路分析,软件设计的步骤,如使能端口时钟,设置引脚为推挽输出模式,并提供库函数和寄存器版本的主函数代码示例。

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

一、目的

在正点原子精英版上实现LED0、LED1两个灯每间隔1秒同时闪烁。

二、硬件电路分析

由电路图可知:LED0-PB5,LED1-PE5。

三、软件设计

本次实验主要是控制GPIOB.5和GPIOE.5输出进而控制LED0和LED1的状态。其核心是对着两个引脚进行配置,配置流程如下:

(1)使能端口时钟。(GPIO是挂载在APB2总线上的外设)

(2)设置引脚模式。将两个引脚都设置为推挽输出模式(设置为推挽输出模式可以使该引脚输出强高低电平)

(3)初始时将这两个引脚拉高。

四、程序

1.库函数版本

​/*------------------------------库函数------------------------------*/
void LED_init(void)    //LED初始化函数
{
    GPIO_InitTypeDef GPIO_InitStructure;    //一定要放这里,放下面会报错
    
    //时钟使能-使能GPIOB和GPIOE端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    //LED0-PB5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);    //LED1-PE5
    
    //配置GPIOB.5和GPIOE.5模式
    
    //GPIOB.5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB5拉高
    
    //GPIOE.5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE,&GPIO_InitStructure);
    GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE5拉高
    
}

​

主函数

#include "led.h"

/*--------------库函数版本---------------*/
int main(void)
{
    LED_init();
    delay_init();
    while(1)
    {
        GPIO_SetBits(GPIOB,GPIO_Pin_5); 
        GPIO_SetBits(GPIOE,GPIO_Pin_5);
        delay_ms(1000);
        
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);
        delay_ms(1000);
    }
}

2.寄存器版本

/*------------------------------寄存器版本-----------------------------*/
void LED_init(void)
{
    //时钟使能
    RCC->APB2ENR |= (1 << 3);   //使能GPIOB端口时钟
    RCC->APB2ENR |= (1 << 6);   //使能GPIOE端口时钟
    
    //端口模式设置
    GPIOB->CRL &= ~(15 << 20);  //清零
    GPIOB->CRL |= (3 << 20);   //0011 设置GPIOB.5为推挽输出模式
    GPIOB->BSRR |= (1 << 5);  //将GPIOB.5上拉
    
    
    GPIOE->CRL &= ~(15 << 20);  //清零
    GPIOE->CRL |= (3 << 20);    //0011 设置GPIOE.5为推挽输出模式
    GPIOE->BSRR |= (1 << 5);  //将GPIOE.5上拉
}

主函数

#include "led.h"

/*--------------寄存器版本-----------------*/

int main(void)
{
    LED_init();
    delay_init();
    while(1)
    {
        GPIOB->BSRR |= (1 << 5);
        GPIOE->BSRR |= (1 << 5);
        delay_ms(300);
        
        GPIOB->BRR |= (1 << 5);
        GPIOE->BRR |= (1 << 5);
        delay_ms(300);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值