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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验名称:STM32流水灯实验 实验目的: 1. 了解STM32F103C8T6主控芯片的IO口控制; 2. 熟悉Keil C语言开发环境的使用; 3. 学会编写STM32F103C8T6单片机的程序; 4. 掌握流水灯的实现原理。 实验器材: 1. STM32F103C8T6开发板; 2. USB数据线; 3. 杜邦线。 实验原理: 流水灯是一种常见的控制方式,也是最基础的控制方式之一。流水灯是通过一组LED依次点亮,再依次熄灭,形成一种流动的效果。单片机控制LED灯的亮灭可以实现流水灯效果。 实验步骤: 1. 将STM32F103C8T6开发板连接到电脑上,并打开Keil C语言开发环境。 2. 在Keil C语言开发环境中,新建一个工程。选择新建项目,填入项目名称和存储路径,点击确定。 3. 在工程目录下新建一个源文件,文件名为main.c。 4. 打开main.c文件,编写代码如下: ``` #include "stm32f10x.h" #include "delay.h" GPIO_InitTypeDef GPIO_InitStructure; int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); while(1) { GPIO_SetBits(GPIOB, GPIO_Pin_12); Delay(50); GPIO_ResetBits(GPIOB, GPIO_Pin_12); GPIO_SetBits(GPIOB, GPIO_Pin_13); Delay(50); GPIO_ResetBits(GPIOB, GPIO_Pin_13); GPIO_SetBits(GPIOB, GPIO_Pin_14); Delay(50); GPIO_ResetBits(GPIOB, GPIO_Pin_14); GPIO_SetBits(GPIOB, GPIO_Pin_15); Delay(50); GPIO_ResetBits(GPIOB, GPIO_Pin_15); } } ``` 5. 完成代码编写后,进行编译。在编译成功后,将STM32F103C8T6开发板通过USB数据线连接到电脑上。然后在Keil C语言开发环境中,点击“Options for Target”选项,进入Target选项卡,在“Settings”栏目下的“Debug”选项中选择“ST-Link Debugger”。 6. 在Keil C语言开发环境中,点击“Flash”选项卡,然后将编译成功后生成的HEX文件下载到STM32F103C8T6开发板中。 7. 完成下载后,拔掉USB数据线,然后将开发板的电源接通。此时,流水灯就会开始工作。 实验结果: 当STM32F103C8T6开发板的电源接通后,流水灯就会开始工作。LED灯会依次点亮和熄灭,形成一种流动的效果。 实验总结: 通过本次实验,我对STM32F103C8T6主控芯片的IO口控制有了更深入的了解,同时也熟悉了Keil C语言开发环境的使用。通过编写代码,我成功地实现了流水灯的效果,加深了我对流水灯实现原理的理解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

真的是aaa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值