LED流水灯实验2

一.实验目的分析:

要在实验1的基础上使用标准外设库来控制多个LED灯,让它们交替闪烁,每个LED灯亮起和熄灭的周期为1秒。以下是具体步骤:

  1. 创建一个新的工程项目文件夹,并确保你已经添加了STM32标准外设库的相关文件(.c和大.h文件)。
  2. 在代码中,LED灯的亮/灭周期是通过软件中的循环延时来控制的。但是要注意,这个准确的周期可能会受到处理器性能和其他代码执行的影响。如果没有示波器,你可以使用Keil的软件仿真逻辑分析仪来观察GPIO端口的时序波形。
  3. 使用软件仿真逻辑分析仪来观察GPIO端口的输出波形,以确保时序状态正确,高低电平转换周期(LED闪烁周期)实际为1秒。
    这样就可以在没有示波器的情况下,使用Keil的工具来动态跟踪调试代码并确定LED灯的闪烁周期。

二.创建工程

创建新工程如图所示:
在这里插入图片描述
在这里插入图片描述

生成新文件

启动代码在硬件相关方面发挥关键作用,它主要执行以下任务:

  1. 初始化堆栈指针(SP)。
  2. 初始化程序计数器(PC)。
  3. 设置向量表,用于处理异常事件的入口地址。
  4. 最终调用主程序的main函数来启动应用。
    在针对不同的STM32微控制器产品,标准库的启动文件分为三种类型,具体为:
    - `startup_stm32f10x_ld.s` 适用于小容量产品,其中小容量定义为FLASH容量≤32K。
    - `startup_stm32f10x_md.s` 适用于中等容量产品,中容量定义为64K≤FLASH≤128K。
    - `startup_stm32f10x_hd.s` 适用于大容量产品,大容量定义为256K≤FLASH。
    在本例中,作者提到使用的芯片型号是STM32F103ZEC8T6,这是一个64K容量的微控制器,因此需要选择中容量版本的启动文件:`startup_stm32f10x_md.s`。

在这里插入图片描述

添加完START分组之后添加工程所需代码文件:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

等等一系列文件…

达到如下图所示的效果即可:

在这里插入图片描述

三.MDK环境配置编译

配置路径文件路径:

在这里插入图片描述

配置成功:

在这里插入图片描述

在创建一个函数进行测试
在这里插入图片描述

在这里插入图片描述

编译未报错,即代表成功。

四.编写源代码

这个工程代码编写思路在于:

流水灯的实现思路是,从PA0开始,点亮该端口,然后延时一段时间,接着熄灭所有灯。随后,点亮PA1端口,再次延时,然后熄灭所有灯。这个过程不断重复,逐渐向右移动,直到PA7端口点亮。然后再次延时,循环回到PA0,一直保持重复这个流水灯效果。

首先是端口初始化代码:

#include “led.h”
void GPIOA_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//APB2 GPIOA时钟使能
GPIO_InitTypeDef GPIOA_Structure;//创建CPIO结构体
GPIOA_Structure.GPIO_Pin=GPIO_Pin_All; //所有端口
GPIOA_Structure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIOA_Structure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度为50Mhz
GPIO_Init(GPIOA,&GPIOA_Structure);//将GPIOA所有端口设置为50Mhz的推挽输出模式
}

其次再是主函数代码:

#include “stm32f10x.h”
#include “led.h”
void delay(unsigned int time)//软件延时
{
unsigned int i=0;
while(time–)
{
i=12000;
while(i–);
}
}

int main()
{
GPIOA_Init();//初始化端口

while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_0); //PA0为1
GPIO_SetBits(GPIOA,GPIO_Pin_0); //PA0为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_1); //PA1为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_2); //PA2为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_3); //PA3为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_4); //PA4为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_5); //PA5为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_6); //PA6为1
delay(800);//延时
GPIO_ResetBits(GPIOA,GPIO_Pin_All);//全部为0
GPIO_SetBits(GPIOA,GPIO_Pin_7); //PA7为1
delay(800);//延时
}
}

五.实物效果展示:

六.总结

   此次试验使用STM32微控制器开发板,使LED连接到正确的GPIO引脚。完成了使用循环来实现LED流水灯效果,逐个点亮LED并延时一段时间,再熄灭LED。移动到下一个LED,重复上述步骤。这个流程循环进行,创建了LED流水灯效果,在实验中,成功实现了基于STM32固件库的LED流水灯效果。了解了初始化系统和GPIO配置的基本步骤。体验了如何使用循环来控制LED的点亮和熄灭,创建了视觉效果, 这个实验有助于初学者熟悉STM32的基本开发流程,包括硬件准备、工程创建、代码编写、编译、烧录和调试。同时,通过LED流水灯的实现,加深了对GPIO控制的理解。  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值