目录
一、题目要求
在实验1的基础上,改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒。
1)写出工程项目创建文件夹、添加STM32标准外设库文件(*.c,*.h)的详细过程;
2)LED灯的亮/灭周期是通过软件循环延时完成的,其准确周期大致是多少呢?
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察GPIO端口的输出波形,并分析时序状态正确与否、高低电平转换周期(LED闪烁周期)实际为多少。
二、过程呈现
1、stm32工程文件夹的创建
1.1.st标准库的下载
参考博文
下载完成后如图所示
1.2.创建文件夹
1)创建好如下文件夹
2)CMSIS文件夹
将下载好的ST标准库中的相应文件复制粘贴到该文件夹中,如下图所示
同时,startup文件放置如下文件
3)Doc文件夹
其用于存放项目说明文件,同样从下载的ST标准库中复制粘贴如下图所示的相应文件
4)Libraries文件夹
我们这里直接将ST标准库的中的两个文件夹复制到此处,如下图
复制到创建的Librarles文件夹
5)project文件夹
这里我们先不要动
6)Usr文件夹
将下载的ST标准库的如下文件复制粘贴到文件夹中,如下图所示
同时新建一个txt文件,并修改后缀为.c,上图已经显示
2、STM32工程创建
打开keil,新建项目,其文件目录选择创建的文件夹,如图
然后选择自己使用的芯片即可
点击Target1,选择第二项,
按所创建的文件夹添加,如下
然后点击ok即可
双击上诉文件夹,添加c文件,
最终添加的文件如下所示
点击魔法棒进行配置
添加宏定义
添加头文件路径
3、工程代码
我们可以在keil打开之前创建文件夹时所新建的main.c文件,然后我们编译,输入以下代码
#include "stm32f10x.h"
#include "bsp_led.h"
//软件延时函数1ms
void delay_ms(uint32_t time)
{
uint32_t i;
while(time--)
{
i=12000;
while(i--);
}
}
int main(void)
{
while(1)
{
//直接调用复位置位函数
LED_GPIO_Config();
while(1)
{
//来到这里的时候,系统的时钟已经被配置成72M了
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); //点亮
// LED_G(ON);
delay_ms(100);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); //熄灭
// LED_G(OFF);
delay_ms(100);
GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
delay_ms(100);
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
delay_ms(100);
GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
delay_ms(100);
GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
delay_ms(100);
}
}
}
在keil中如下所示
新建一个文件以对每一个灯进行宏定义,并编译如下代码
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "stm32f10x.h"
#define LED1_GPIO_PIN GPIO_Pin_0 //绿灯
#define LED1_GPIO_PORT GPIOB
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN GPIO_Pin_1 //蓝灯
#define LED2_GPIO_PORT GPIOB
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN GPIO_Pin_5 //红灯
#define LED3_GPIO_PORT GPIOB
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
#define ON 1
#define OFF 0
#define LED1_G(a) if(a) \
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
else GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
#define LED2_B(a) if(a) \
GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
else GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
#define LED3_R(a) if(a) \
GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
else GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
void LED_GPIO_Config(void);
#endif
在软件中如下图所示
新建一个bsp_led.c文件些GPIO配置函数
然后再打开的窗口中输入如下代码
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 定义初始化结构体
RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE); //开时钟
GPIO_InitStructure.GPIO_Pin=LED1_GPIO_PIN; //选择GPIO要控制的引脚0
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=LED2_GPIO_PIN; //选择GPIO要控制的引脚1
GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=LED3_GPIO_PIN; //选择GPIO要控制的引脚5
GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);
//熄灭所有灯
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
}
再keil软件中如下
同时,创建上述文件时,要将其放在User文件夹下,并且后缀一定要选择.c与.h文件,此外,也要将其加入到User文件夹下
4、LED流水灯实验
板子的连接
PA0-绿,PA1-黄,PA2红
实物连接
配置keil
点击魔法棒,选择debug,勾选如图所示选项
点击setting后勾选第三项
然后点击add,选择如图所示的选项
同时不要忘了勾选创建hex文件的选项
点击编译即可生成hex文件,然后我们通过ST-link进行烧录即可
最终结果如下图所示
5、LED流水灯仿真实验
下面进入keil仿真
点击放大镜
进入页面后选择逻辑分析仪
点击view菜单,symbols windows选项,找到查看波形的引脚
添加引脚信息,,然后我们选择好对应的颜色,完成配置后即可点击左上角进行仿真
仿真效果演示
三、总结
这次实验对自身的能力要求还是有些高,我自己在完成实验时遇到了很多的问题,自己要解决,还是必须要参考相关资料文章才可以勉强完成,特别是后面的keil仿真,希望下次实验可以做的更好。
四、参考网址
https://blog.csdn.net/qq_43279579/article/details/110320013
https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html