文章目录
一、实验目的
基于寄存器的LED流水灯实验的基础上,改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒。
任务:
(1)写出工程项目创建文件夹、添加STM32标准外设库文件(.c,.h)的详细过程;
(2)LED灯的亮/灭周期是通过软件循环延时完成的,测量其准确周期大致是多少;
(3)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察GPIO端口的输出波形,并分析时序状态正确与否、高低电平转换周期(LED闪烁周期)实际为多少。
二、创建基于标准外设库的keil工程
1. 添加STM32标准外设库文件
下载标准库
下载地址:STM32F10x standard peripheral library
解压安装包,得到以下文件
新建工程文件夹,在文件夹中再新建如下文件
将解压的标准库中的文件逐一添加到新建文件夹中
CMSIS:
DOC:
Libaries:
User:
(main.c文件是我们自己建立的)
打开Kil5,点击Project,点击新建Kil工程,工程目录选择我们新建的Project文件夹。然后在如下图中右击taget1,选择Add Group,添加和上文中建立的文件夹同名的文件夹
工程如图:
2. 添加头文件
点击魔法棒,将包含头文件的文件夹添加进来,目的是让工程优先在添加进来的文件夹中搜索头文件
结果如图:
3. 添加宏定义
在Define中添加宏定义USE_STDPERIPH_DRIVER目的是编译#include “stm32f10x.h”
至此,标准库的keil工程创建完成
三、基于标准外设库的程序编写
实验代码:
#include "stm32f10x.h"
void delay_s(void);
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIO
while (1)
{
GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001
delay_s();
GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010
delay_s();
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100
delay_s();
}
}
void delay_s(void)
{
volatile int i=0,j=0,k=0;
for(i=1000;i>0;i--)
{
for(j=1000;j>0;j--)
{
for(k=6;k>0;k--);
}
}
}
编译报错:
出错原因:
工程配置选项中的debug选项卡的dialog dll和对应的parameter配置出了问题。选中MCU后默认的配置如下图
dialog dll默认配置为DCM.DLL,而parameter默认配置为-pCM3,该种配置无法进行正常的仿真调试。
正确配置应该为dialog dll:DARMSTM.dll parameter:-pSTM32F103C8:
这两个参数是根据你使用的MCU不同而不同的,例如本工程使用的MCU为STM系列,那么在dialog DLL选项中就应该使用DARMSTM.dll,名字中的STM就是指厂商,参数则是具体的MCU芯片型号,本项目使用STM32F103C8T6,因此选择为STM32F103C8
参考:
DEBUG类:error 65: access violation at 0x40021000 : no ‘read‘ permission
重新编译,成功
四、程序仿真
1. 设置options for target:
①Target页的设置:
Target界面中,选择跟正确的晶振大小,我使用的是8MHz的外部晶振。这个选项在软件仿真中起到很 重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。此前,我增加默认为72MHz, 结果波形与预料的不一致,原本是1s翻转一次的波形,显示出来的周期比预想的长得多。不过这个参数 只是在软件仿真中起作用,当程序在硬件中运行并没有影响。
②Debug页的设置:
首先应该选择Use Simulator,其次是Run to main()选项打钩,然后分别修改上图中的DDL按照以上步骤设置后点击OK,完成设置。
2. 调试:
点击debug进入调试页面
选择逻辑分析仪,选择要观察的引脚,点击Setup Logic Analyzer,添加要观察的引脚,结果如下
运行程序,观察波形,把光标移动到逻辑分析仪显示波形的区域,上下滚动滑轮,就可以放大和缩小波形.
运行结果:
五、程序烧录
面包板连接实物图
运行,得到结果
基于标准外设库的LED流水灯