历史上的今天
返回首页

历史上的今天

今天是:2025年05月06日(星期二)

正在发生

2021年05月06日 | STM32库开发和流水灯

2021-05-06 来源:eefocus

一、库开发


这里指的库开发使之调用库函数接口完成对相应寄存器的设置,相比较与51单片机编程中直接对寄存器操作而言,代码量跟查找手册看寄存器位再去配置,能节约很多时间。但是相对的对寄存器的位操作看得就没拿明白了,不知道库函数接口是如何配置各个寄存器位的了,这个时候可以将函数名复制下来去STM32固件库使用手册中查看相应了用法了。如下图所示复制了库函数之后,打开STM32固件库使用手册,复制到这里


然后回车,就会跳到相应的库函数说明那里,一下就清楚了它是如何配置寄存器位的,如下图

这个函数解释的很清楚了,使能和失能APB1的外设时钟,如果不理解参数是什么,可以复制参数能在末尾的表中找到相应的参数解释。


说一下我对库开发的理解,最好的办法就是在别人的例程上修改,节约时间,框架已经搭建好了,只用配置成和自己开发板对应的就行了。这是上上之策,新手最好选择这个办法,现在网上的例程还是挺多的,不然作为一个连函数名都不知道的新手难道要去固件库一个一个翻看函数,浪费时间不说,还不一定有效果,太打消积极性了。至于对寄存器直接进行配置,我个人不反对也不支持,感觉各有各的优点,如果你老手了,可以建议选择用直接配置寄存器去写程序,这样代码自己看得清晰明了。下图显示了库开发个直接配置寄存器开发的区别

二、点亮流水灯


首先我们需要用到第一讲中的建立好的模板,这里我一步一步很详细的教你如何去点亮流水灯


1. 看开发板原理图找到LED灯连接的GPIO( 通用输入输出)口,我这里使用的是神州三号开发板,


可以看到,对应 GPIO分别为GPIOF6 GPIOF7 GPIOF8 GPIOF9,而且是上拉输入,只要控制GPIO端为低电平,就会点亮LED了,为高电平,LED灭。


找到了对应的GPIO了,然后该用到我们的模板了,这个时候新手可能会问该从哪里下手啊,怎么配置GPIO啊,用什么函数啊等等。方法就是我上面说的上上之策:使用别人写好例程框架,修改成自己的。又会问:拿第一讲新建的工程模板不就用不到了?此言差矣,个人认为新建工程模板不仅能让初学者弄清楚各个文件的作用,而且对库开发整体的框架理解会更加深入,最好是对照例程将别人的程序在自己的工程模板中重新编写一份,这样你对各个函数会更加熟悉,基本框架也会有自己的理解。


下面开始介绍如何编写程序,首先打开别人的例程,看到工程文件目录



可以看到在工程目录下USER目录下相比于我们自己建立的工程模板多了led.c led.h两个文件,没错,这就是我们需要编写的两个文件,首先打开led.h


看到代码如下:


led.h


#ifndef __LED_H

#define __LED_H


#include "stm32f10x.h"


#define ON0

#define OFF 1


#define LED1(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_6);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_6)


#define LED2(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_7);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_7)


#define LED3(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_8);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_8)


#define LED4(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_9);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_9)


void LED_GPIO_Config(void);


#endif





这里用到了两个库函数和一个用户自定义函数


分别是:GPIO_SetBits(GPIOF,GPIO_Pin_x);


GPIO_ResetBits(GPIOF,GPIO_Pin_x);


void LED_GPIO_Config(void);


很明显前面两个是对相应的GPIO管脚进行配置高地电平的,Set = 1 , Reset = 0


同时看上的宏定义和条件编译,LED(ON)显然就是对应的GPIO_ResetBits(GPIOF,GPIO_Pin_x);为什么呢?因为前面已经介绍过电路原理图了,低电平是点亮LED,所以Reset对应的是LED(ON);




接下来我们去看看led.c中用户自定义的函数是如何编写的吧




led.c


#include "led.h"


void LED_GPIO_Config(void)

{


GPIO_InitTypeDef GPIO_InitStructure;



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);



GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_Init(GPIOF,&GPIO_InitStructure);



GPIO_SetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);

}






虽然上面有注释了,我还是一句一句来讲解下


1. 定义了一个GPIO_InitTypeDef类型的结构体,要想看到结构体中的内容,可以从stm32f10x.h中找到其结构体内部包含了哪些变量


2.开启GPIOF的外设时钟,为什么要开启外设时钟呢?这里有必要解释一下,因为STM32为了实现低功耗,设计了很复杂的时钟系统,每个外设配置使用前都要开启外设时钟,如果对stm32时钟树不是很了解,去看看STM32中文参考手册吧,里面很详细的介绍了STM32时钟。


3. 连着看下面的三句,选择要控制的GPIOF引脚、设置引脚模式为通用推挽输出、设置引脚速率为50MHz。这里是选择对应的GPIO管脚,设置输出方式和配置引脚速率,因为stm32的GPIO有8中工作方式,不详细介绍了,可自行去看stm32中文参考手册。出现了两个新的结构体GPIO_InitStructure.GPIO_Mode 和GPIO_InitStructure.GPIO_Speed,找其出处参考前面寻找GPIO_InitTypeDef


4.GPIO_Init(GPIOF,&GPIO_InitStructure);很明显是把上面配置的信息写入这个结构体中,也叫对引脚配置的初始化


5. 置为高电平,关闭LED灯




照着上面的例子将看是否对应你自己开发板的GPIO和LED,如果不会一样的,修改GPIO引脚就可以了,别忘了led.h中也要修改,等修改成中自己开发板对应的之后,我们去写main函数,因为我们知道,程序的起点是从main函数开始执行的


main.c




#include "stm32f10x.h"

#include "led.h"


void Delay(__IO u32 nCount);




int main(void)

{


LED_GPIO_Config();


while(1)

{

LED1(ON);

Delay(0x0FFFEF);

LED1(OFF);


LED2(ON);

Delay(0x0FFFEF);

LED2(OFF);


LED3(ON);

Delay(0x0FFFEF);

LED3(OFF);


LED4(ON);

Delay(0x0FFFEF);

LED4(OFF);

}

}


void Delay(__IO u32 nCount)

{

for(; nCount !=0; nCount--);

}


这个程序就不详细介绍了,就是点亮一个灯,延时然后关掉,唯一要是的是延时程序中 __IO u32这个数据类型,32对应就是32位数据了,我们使用库开发时,库文件中已经把原本的unsigned intchar宏定义为u32 u16 u8等等数据类型了,这样我们使用起来是不是很方便,这就是库开发的好处之一了。


如果到了这一步,恭喜你,可以点亮流水灯了,我们编译的时候只选择编译的前两个编译按钮就行了,第三个是将所有的文件都重新编译一次,耗时巨大。然后插上J-Link仿真线接通开发板电源,点击Load,程序就会自动下载到开发板了,我们就会看到开发板上的四个LED灯循环的亮起来了,是不很开心!这就对了,当一个新手第一次完成一个小程序而且能看到自己的成果出现在眼前时确实是很激动的,想当初我在大学的时候学习51,点亮LED灯那个激动!跨出第一步,先给自己信心和力量,相信自己你可以的!


推荐阅读

史海拾趣

AURORA公司的发展小趣事

AURORA公司成立于2016年,初出茅庐便面临着巨大的挑战。然而,公司的三位联合创始人Chris Urmson、J. Andrew Bagnell和Sterling Anderson均来自自动驾驶汽车领域的顶尖团队,拥有丰富的经验和深厚的技术背景。他们凭借对自动驾驶技术的深刻理解和前瞻性眼光,为AURORA的发展奠定了坚实的基础。在初创时期,AURORA通过与多家汽车制造商合作,共同设计和开发传感器、软件和数据服务,逐渐在自动驾驶领域崭露头角。

Hirose Electric公司的发展小趣事

AURORA公司一直致力于提升自动驾驶技术的安全性和可靠性。通过不断研发和创新,AURORA在自动驾驶算法、传感器融合、数据处理等方面取得了显著进展。公司的技术团队不断攻克技术难题,推动自动驾驶技术向更高等级迈进。同时,AURORA还积极与高校和研究机构合作,共同推动自动驾驶技术的研发和应用。

DZUS公司的发展小趣事

为了提高产品质量和客户满意度,DZUS公司决定建立质量管理体系。公司引进了先进的生产设备和检测设备,并制定了严格的生产流程和检验标准。此外,公司还加强了员工培训和技能提升工作,确保每一个员工都能熟练掌握操作技能和产品质量要求。这些措施的实施使DZUS公司的产品质量得到了显著提升,并赢得了客户的广泛赞誉。

DBM REFLEX公司的发展小趣事

在全球环保意识日益增强的今天,DBM REFLEX积极响应可持续发展的号召。公司不仅在生产过程中注重环保和节能,还积极推广绿色产品和技术。同时,DBM REFLEX还积极参与社会公益事业,通过捐款捐物等方式回馈社会。这种对环保和社会责任的关注,使DBM REFLEX在电子行业树立了良好的企业形象。

C-MAX Time Solutions公司的发展小趣事

C-MAX Time Solutions公司自创立以来,一直致力于电子时间同步技术的研发。在某一时期,公司推出了一款革命性的高精度时钟同步芯片,这款芯片凭借其卓越的稳定性和低延迟特性,迅速在通信、金融和交通等领域获得了广泛应用。这一技术创新不仅提升了C-MAX的市场竞争力,也推动了整个电子行业时间同步技术的发展。

Global Connector Technology公司的发展小趣事
根据电动机和电源系统的要求,检查并调整继电器的参数设置。

问答坊 | AI 解惑

DSP集成开发环境CCS开发指南

《DSP集成开发环境CCS开发指南》可以让初学者快速熟悉CCS集成开发环境,强烈推荐!…

查看全部问答>

基础问题:FPGA中寄存器的长度有限制吗?

FPGA 是硬件编程器件,器寄存器的长度理论上没有限制,受限与硬件容量,以及对寄存器的时钟速率要求。比如要实现一个256位的串并转换。只需如下编程即可:     din :  in   std_logic_vector(255 downto 0);   ...…

查看全部问答>

仿真正常 固化后不正常

我用的伟福仿真器,p89c51的片子,通过串口写入数据,控制液晶屏的显示 在同一块板子上,仿真完全正常 固化后液晶屏就没有反映 检查发现串口通讯是正常的,在程序中加入测试点,证明程序运行也正常 仿真时就用的板子上的晶振 给液晶屏的控制管脚加了 ...…

查看全部问答>

STM32能跑72M是真是假?

                                 有人说,ST 的FLASH最快24M,CPU 在72M时还要等上2个周期,那就是达不到72M了,如果说在SRAM里能跑就没 ...…

查看全部问答>

从万文数据库下载的一个关于Q格式应用的资料

从万文数据库下载的一个关于Q格式应用的资料 …

查看全部问答>

程序没写多少怎么出现了这样的错误.

 ERRO[e89]:too much object code produced[more than 0x800 byte] for this pack-age  我用的是EW430,147的片子.…

查看全部问答>

求解决啊·~~

用STM32的开发板 做一个无线光通信系统  STM32要完整的功能就是用串口中断方式接收PC机发送的数据 然后把接收到的数据进行OOK调制 去控制PWM的输出…

查看全部问答>

07年A题——音频分析仪

本帖最后由 paulhyde 于 2014-9-15 03:26 编辑 最近在做这个题目,07年A题。音频分析仪。有没有大神有资料的。求助。  …

查看全部问答>

【TI经典】LMK0480X holdover 功能分析

亲爱的朋友们,新的一周开始了,希望大家在工作学习生活中能有更多收获哦!今天小编为大家带来由德州仪器中国工程师团队所创作的《LMK0480X holdover 功能分析》。 本文首先主要介绍了TI 的新一代时钟产品LMK0480X 的holdover 功能和指标,以及在 ...…

查看全部问答>

使用ASF在不同MCU中创建CDC项目的比较

很多人不喜欢用AS6和ASF,因为AS6+ASF的组合运行程序慢、打开项目文件慢、编译速度慢,的确是不够方便。但是AS6和ASF毕竟是ATMEL官方的主要开发工具,还是有它的一些优点的,比如使用ASF快速建立项目、通过ASF向导添加新的功能模块、程序在不同MCU ...…

查看全部问答>