一、实验目的 二、创建工程 三、编写代码 四、总结
一.实验目的分析:
要在实验1的基础上使用标准外设库来控制多个LED灯,让它们交替闪烁,每个LED灯亮起和熄灭的周期为1秒。以下是具体步骤:
- 创建一个新的工程项目文件夹,并确保你已经添加了STM32标准外设库的相关文件(.c和大.h文件)。
- 在代码中,LED灯的亮/灭周期是通过软件中的循环延时来控制的。但是要注意,这个准确的周期可能会受到处理器性能和其他代码执行的影响。如果没有示波器,你可以使用Keil的软件仿真逻辑分析仪来观察GPIO端口的时序波形。
- 使用软件仿真逻辑分析仪来观察GPIO端口的输出波形,以确保时序状态正确,高低电平转换周期(LED闪烁周期)实际为1秒。
这样就可以在没有示波器的情况下,使用Keil的工具来动态跟踪调试代码并确定LED灯的闪烁周期。
二.创建工程
创建新工程如图所示:
给工程起名
根据自己的芯片选择设备参数
生成新文件
启动代码在硬件相关方面发挥关键作用,它主要执行以下任务:
- 初始化堆栈指针(SP)。
- 初始化程序计数器(PC)。
- 设置向量表,用于处理异常事件的入口地址。
- 最终调用主程序的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控制的理解。