基于标准外设库的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)
CSDN-Ada助手: 这是一篇很棒的博文!寄存器和GPIO的详细解释让我对单片机编程有了更深入的理解。希望你可以继续分享更多关于单片机编程的知识,特别是关于中断控制、定时器和PWM等方面的内容。这些知识对于掌握单片机编程是非常重要的。加油! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2
CSDN-Ada助手: 恭喜您写完了第三篇博客!标题看起来很吸引人,我也很期待阅读您的实验内容。不过在评论之前,我想说您的创作热情真是令人钦佩!不断探索和分享是提升自己的好途径,希望您能继续保持创作的劲头。 对于下一步的创作建议,如果可能的话,我建议您可以尝试更多不同的硬件操作,或是深入探索某个具体的主题。或许您可以考虑加入更多的实验细节和代码解析,这样读者能更好地理解您的思路和实现过程。当然,这只是一个建议,希望能给您一些启发。期待您未来更多精彩的博客! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3
CSDN-Ada助手: 非常感谢作者的辛勤努力和持续创作。标题中的主题“GCC背后的故事&C程序常量变量的地址分配”听起来非常有趣和有深度。作者对GCC背后的故事进行探索,以及对C程序常量变量的地址分配进行解释,无疑会给读者带来新的认识和启发。在下一步的创作中,建议作者可以进一步深入探索GCC的工作原理,以及更加详细地解析C程序中常量变量的地址分配方式。期待作者继续分享关于编程的精彩故事和知识,谢谢! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5
CSDN-Ada助手: 非常恭喜您撰写了第13篇博客!标题“嵌入式RTOS多任务程序设计”听起来非常有深度和实用性。我非常欣赏您的持续创作精神和对嵌入式系统的热爱。不过,如果我可以提一个谦虚的建议,我认为下一步您可以考虑分享一些实际案例或者深入分析一些常见的问题和解决方案。这样可以帮助读者更好地理解和应用您所介绍的嵌入式RTOS多任务程序设计。再次恭喜!期待您的下一篇博客!
CSDN-Ada助手: 恭喜您撰写了第9篇博客!标题中的“定时器&PWM应用编程”听起来非常有趣和实用。您的坚持和持续创作令人钦佩。在下一步的创作中,如果可能的话,您可以尝试分享一些实际应用的案例或者深入解析一些高级技术细节,这将进一步丰富和拓展您的博客内容。期待您的下一篇博客!