提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
基于标准外设库的LED流水灯
一、实验要求
在之前实验的基础上,改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒。
(1)写出工程项目创建文件夹、添加STM32标准外设库文件(.c,.h)的详细过程;
(2)LED灯的亮/灭周期是通过软件循环延时完成的,其准确周期大致是多少呢?
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察GPIO端口的输出波形,并分析时序状态正确与否、高低电平转换周期(LED闪烁周期)实际为多少。
二、使用步骤
1.下载STM32官方固件库(标准固件库)
标准外设库是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器,是针对某一系列芯片而言的,没有可移植性。标准外设库由程序、数据结构和宏组成,覆盖了微控制器所有外设的性能特征,为开发者访问底层硬件提供了一个中间API。它实现了各外设的基本操作接口,将一些基本的寄存器操作封装成了C函数,使得开发者无需深入掌握底层硬件细节,就可以轻松应用每一个外设。
STM32F1xx_StdPeriph_Examples包含了基于STM32CubeMX软件生成的初始化代码,以示例的形式提供了很多外设模块的运用,比如GPIO、USART、SPI等等。
STM32F1xx_StdPeriph_Template是利用STM32CubeMX软件创建新工程时的模板文件夹。其中包含了基于IAR或Keil的工程模板,这些模板中已经配置好了与STM32CubeMX相关的选项,可以直接使用。除此之外,这个文件夹中还包含了用于配置STM32CubeMX选项的配置文件,以及用于生成初始化代码的脚本文件。
2.Keil5工程文件创建
代码如下:
#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);
}
}
总结
LED灯的亮/灭周期主要由软件循环延时和硬件时钟频率共同决定。
本次实验学习了 STM32F103VCT6 单片机的通用 GPIO的基本输入输出功能,受益匪浅。