基于标准外设库的LED流水灯

一、实验要求

在之前实验的基础上,改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒。

(1)写出工程项目创建文件夹、添加STM32标准外设库文件(*.c,*.h)的详细过程;

(2)LED灯的亮/灭周期是通过软件循环延时完成的,其准确周期大致是多少呢? 

  在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察GPIO端口的输出波形,并分析时序状态正确与否、高低电平转换周期(LED闪烁周期)实际为多少。

二、实验步骤

1.下载STM32官方固件库(标准固件库)

1.1标准外设库简介

标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器,是针对某一系列芯片而言的,没有可移植性。标准外设库由程序、数据结构和宏组成,覆盖了微控制器所有外设的性能特征,为开发者访问底层硬件提供了一个中间API。它实现了各外设的基本操作接口,将一些基本的寄存器操作封装成了C函数,使得开发者无需深入掌握底层硬件细节,就可以轻松应用每一个外设。

1.2标准外设库下载

STM32标准外设库官方下载地址: 

STM32标准外设软件库 - 意法半导体STMicroelectronics

 实验使用STM32F103C8单片机,选择F1

 在邮箱邮件中点击下载

1.3标准外设库文件介绍

 (1)_htmres:

官方Logo图片

 (2)Libraries:

这两个文件夹都是STM32F1标准外设库中的重要组成部分,它们对外提供了一套简单统一的API,使用这套API可以方便地操作STM32F1系列微控制器的各个外设。

CMSIS(ARM Cortex Microcontroller Software Interface Standard)是一个通用的规范,它定义了CMSIS兼容的设备驱动程序的接口。在STM32F1系列微控制器的标准外设库中,CMSIS文件夹包含了符合CMSIS规范的特定于芯片的外设访问层代码、DSP软件库、RTOS API以及芯片上外设访问层代码等。

STM32F10xx_StdPeriph_Driver是STM32F1标准外设固件库的源码文件和对应的头文件。这个文件夹包含STM32F1xx标准外设固件库源码文件(.c文件)和对应的头文件(.h文件),其中inc目录下的stm32f1xx_ppp.h是头文件,src目录下面的stm32f1xx_ppp.c是源码文件。每一个.c文件和一个相应的.h文件对应。

 (3)Project:

通过对这两个示例文件的学习,能帮助使用STM32CubeMX软件和STM32F1系列微控制器时,快速创建和配置工程,并实现各种外设模块的功能。

STM32F1xx_StdPeriph_Examples包含了基于STM32CubeMX软件生成的初始化代码,以示例的形式提供了很多外设模块的运用,比如GPIO、USART、SPI等等。

STM32F1xx_StdPeriph_Template是利用STM32CubeMX软件创建新工程时的模板文件夹。其中包含了基于IAR或Keil的工程模板,这些模板中已经配置好了与STM32CubeMX相关的选项,可以直接使用。除此之外,这个文件夹中还包含了用于配置STM32CubeMX选项的配置文件,以及用于生成初始化代码的脚本文件。

 (4)Utilities:

包含官方评估板源码文件STM32_EVAL

 (5)Package_license.html:

STM32F10x标准外设库软件许可协议


 

 (6)Package_license.md:
同上

 (7)Release_Notes.html:
STM32F10x标准外设库的发行说明

 (8)stm32f10x_stdperiph_lib_um.chm:

STM32F10x 标准外设库的帮助文件

1.4标准库的使用

在实验中我们主要使用CMSIS子目录CM3以及STM32F10x_StdPeriph_Driver子目录 inc src

重点头文件介绍
(1)stm32f10x.h

 包含主要的宏定义以及结构体定义

(2)system_stm32f10x.c和system_stm32f10x.h

 系统初始化(含有时钟配置)

2.Keil5工程文件创建

2.1创建工程

(1)新建文件夹LED1,并创建子目录CMSIS、MDK、USER、STDLIB

(2)将所需标准库文件进行复制粘贴

CMSIS文件:

STDLIB文件:

USER文件:

(3)点击 Project → New uVision Project …

(4)选择在LED1文件夹下的MDK文件夹并命名为bigLED

(5)选择STM32F103C8芯片

(6)本实验在添加库文件窗口无需操作,取消即可

(7)右键Target 1,选择Manage Project Items

(8)在Manage Project Ltems中创建并添加USER、CMSIS、STDLIB的组(Groups)

 (9)在所属组下添加文件


2.2修改目标设置

(1)点击魔术棒

(2)在C/C++中添加Define(标准库没有对宏定义的声明);在IncludePaths中选择文件路径

(3)文件路径添加如下

(4)注意事项
包含多个sartup——stm32f10x_xx.x的启动文件可能使程序报错 

本实验使用中等容量的starup_stm32f10x_md.s作为启动文件

 使用ARM Compiler为V5.06

2.3代码编写 

(1)将主程序改为空循环并编译:

 编译通过

(2) 主程序
#include "stm32f10x.h"                  // Device header
void Delay_ms(u32 i)
 {
     u32 temp;
	 SysTick->LOAD=9000*i;      //设置重装数值, 72MHZ时
     SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源
    SysTick->VAL=0;            //清零计数器
     do
   {
        temp=SysTick->CTRL;       //读取当前倒计数值
    }
    while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
     SysTick->CTRL=0;    //关闭计数器
    SysTick->VAL=0;        //清空计数器
}
int main(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001
		Delay_ms(1000);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(1000);
	}
}

 3.实况 

3.1接线

3.2烧录

3.3实况视频

流水灯

4.利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形

4.1环境配置

4.2仿真

(1)点击Start/Stop Debug Session

(2)选择逻辑观察仪和引脚

 

(3)运行

三、回答

LED灯的亮/灭周期主要由软件循环延时和硬件时钟频率共同决定 。

LED灯的亮/灭周期大致为:

循环延时(ms) / 硬件时钟频率(Hz) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值