历史上的今天
返回首页

历史上的今天

今天是:2025年08月15日(星期五)

正在发生

2018年08月15日 | STM32学习笔记一(LED,跑马灯,呼吸灯)

2018-08-15 来源:eefocus

1.点亮板上的LED小灯

首先,我先自我介绍一下。我叫华震,今年应届毕业,普通本三的学生。我有在培训机构培训过ARM Cortex-A8,为什么还要掉头来学习STM32(M3的核)呢,因我我发现现在大多数企业都在用STM32,包括裸机开发,跑ucOS-II、ucGUI等等。所以我买了块红牛开发板来学习STM32,当然如果你刚接触STM32只想简单的入个门的话,我建议你买个便宜的开发板就好了,或者买个最小系统也是可以的。有兴趣一起讨论学习的朋友可以加我QQ详聊,我的QQ是1002521871,验证密码是:呵呵。加QQ请发送“STM32学习讨论”验证消息,否则不加。那好前面就说这么多,下面我们来看看如何点亮我开发板的LED小灯吧。

那么我们在点灯之前还要看看LED的硬件连接

 

看到硬件电路后,发现小灯是低电平点亮的,也就说通过给的IO口送低电平就可以点亮LED了。那么我们该如何操作呢,是像51单片机那样直接给直接类似sbit LED = P1 ^ 0;那后在主函数里写个LED = 0;就好了呢?回答没有那么简单,在STM32里面可以通过寄存器的配置来操作IO口,也可以通过STM32的固件库来操作IO口。当然直接操作寄存器的话,感官上比较的直接,但是如果我们要配置很多的IO口以及模式的时候就没那么方便了,或许我输错了一个字符,我们相应的操作就没法实现,所以我个人推荐使用固件库来操作。因为所有的外设的驱动官方都给封装好了,方便直接,至于怎么实现的就要看你学习的深度了,刚开始熟悉固件库的使用就好了。

那么我们操作IO的相应的库函数有哪些呢,下面我来简单的说一下,直说我下面例程里用到的函数,没有用到的我就不讲了,因为库函数很多,要全部都讲的话你我都吃不消。好的,现在我要全部点亮5个LED小灯我需要用到下面的库函数:

1)GPIO_InitTypeDef GPIO;结构体

2)void RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,  ENABLE);时钟配置函数

3)GPIO_Init(GPIOF,  &GPIO);IO初始化函数

4)GPIO_Write(GPIOF,  0XF73F); IO操作函数

5)GPIO_Reset(GPIOF,  GPIO_Pin_6 |  GPIO_Pin_7 | GPIO_Pin_8 |  GPIO_Pin_9 | GPIO_Pin_10); IO操作函数

下面我就来详细说说每个库函数是干嘛的,我们该怎么用。先看第一个,在库函数里面他是如下先表示的:

typedef  struct 

{

Uint16_t  GPIO_Pin;

GPIOSpeed_TypeDef  GPIO_Speed;

GPIOMode_TypeDef  GPIO_Mode;

}GPIO_InitTypeDef;  结构体里的第一个代表是每一个管脚我们填的参数是GPIO_Pin_0 ~ GPIO_Pin_15 或者GPIO_Pin_All;记得每次初始化的时候只能写一个,要初始化多个请参考GPIO_Pin_0 | GPIO_Pin_1;我们把这个结构体又重新定了一个名字叫GPIO;紧接着我们就要给结构体里填东西了 

GPIO.GPIO_Pin  =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |  GPIO_Pin_9 | GPIO_Pin_10;  //初始化6,7,8,9,10管脚

GPIO.GPIO_Mode = GPIO_Mode_Out_PP; //设置IO口为推挽输出

GPIO.GPIO_Speed = GPIO_Speed_50MHz; //设置IO响应速度为 50MHZ;

紧接着初始化时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,  ENABLE);//使能F组IO时钟 设置时钟为72MHZ

再接着初始化IO  GPIO_Init(GPIOF,  &GPIO); &GPIO就是我们定义的结构体;

下面我们看看程序如何编写的:

#include “stm32f10x.h”

void LED_GPIO_Init(void) {

GPIO_InitTypeDef GPIO;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,  ENABLE);

GPIO.GPIO_Pin = GPIO_Pin_6 |  GPIO_Pin_7 | GPIO_Pin_8 |  GPIO_Pin_9 | GPIO_Pin_10;

GPIO.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOF, &GPIO);

GPIO_Write(GPIOF, 0XFFFF);

}

int main (void) {

LED_GPIO_Init();

while (1) {

GPIO_ResetBits(GPIOF, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8  | GPIO_Pin_9 | GPIO_Pin_10 );

}

}

烧写到开发板上,是不是发现5个灯亮了起来。

其中还有俩个GPIO_Write();跟GPIO_ResetBits();函数,大家看看具体写的参数也应该知道啥意思了,我就不多说了。

 

2.跑马灯

如果小灯点亮起来,那么我们让小灯有点动作,也是初学者常做的跑马灯了,前面都能看懂的话,我就直接上程序有新的东西我会指出的

#include "stm32f10x.h"

void LED_GPIO_Init(void) {

GPIO_InitTypeDef GPIO;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,  ENABLE);

GPIO.GPIO_Pin = GPIO_Pin_6 |  GPIO_Pin_7 | GPIO_Pin_8 |  GPIO_Pin_9 | GPIO_Pin_10;

GPIO.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOF, &GPIO);

GPIO_Write(GPIOF, 0XFFFF);

}

void delay(uint32_t counter) {

while (counter --);

}

int main (void) {

int i;

LED_GPIO_Init();

while (1) {

for (i = 0; i < 5; i ++) {

switch (i) {

case 0: GPIO_ResetBits(GPIOF, GPIO_Pin_6);   break;

case 1: GPIO_ResetBits(GPIOF, GPIO_Pin_7);  

break;

case 2: GPIO_ResetBits(GPIOF, GPIO_Pin_8);   break;

case 3: GPIO_ResetBits(GPIOF, GPIO_Pin_9);   break;

case 4: GPIO_ResetBits(GPIOF, GPIO_Pin_10);  break;

}

delay(0x000fffff);

GPIO_Write(GPIOF, 0XFFFF);

}

}

}

里面也没有啥新鲜的东西,玩过51或者AVR的人这里看看就是一些C语言的操作,其实学习ARM裸机开发跟学习51差不多,因为目前都不需要我们直接操作寄存器,这样显得方便很多

3.呼吸灯

写呼吸灯之前我们先要了解一个概念叫做PWM,什么是PWM呢?上百度去查叫做脉冲宽度调制,说的好高打上看不懂,啊是?下面我找了一张图片,相信大家就能明白了

 

了解一个概念:占空比=高电平所占时间/周期T。我们就是通过控制占空比来控制的灯亮灭情况,看起来就像人在呼吸的样子。程序里该如何实现呢?我们整定一个固定的周期,然后让高低电平延时的时间之和跟这个周期相等就好了,下面也直接上程序吧

#include "stm32f10x.h"

void LED_GPIO_Init(void) {

GPIO_InitTypeDef GPIO;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);

GPIO.GPIO_Pin = GPIO_Pin_6;

GPIO.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOF, &GPIO);

GPIO_Write(GPIOF, 0XFFFF);

}

void delay(uint32_t counter) {

while (counter --);

int main (void) {

int i, b;

LED_GPIO_Init();

b = 20000;

while (1) {

for (i = 0; i < b; i ++) {

GPIO_ResetBits(GPIOF, GPIO_Pin_6);  

delay(b - i);

GPIO_SetBits(GPIOF, GPIO_Pin_6);

delay(i);

}

for (i = 0; i < b; i++) {

GPIO_ResetBits(GPIOF, GPIO_Pin_6);  

delay(i);

GPIO_SetBits(GPIOF, GPIO_Pin_6);

delay(b - i);

}

delay(100);

}

}

烧写到板子上面看到灯的变化没有?如果看到了,那么LED的操作就到这里了,这也是GPIO的基本操作,掌握好了之后,就可以驱动

喇叭,继电器等一些常用的外设了。再者PWM是STM32自带的一个功能,我们现在是模拟PWM,等到时候直接操作STM32的PWM的时候就比这个更加的方便了。

最后我说下,我用的是MDK开发的,至于ARM的工程模版的建立,在以后的学习的过程中我会专门写一篇来介绍ARM工程模版的建立,方便我们后续的开发。


推荐阅读

史海拾趣

Catalyst公司的发展小趣事

Catalyst公司在电子行业的初创期,以其独特的创新理念和前瞻性的技术布局,奠定了坚实的基础。公司创始团队由一群对电子行业充满热情的工程师和科学家组成,他们共同致力于研发高效、稳定的电子产品。通过不断的技术研发和市场调研,Catalyst成功推出了一系列具有竞争力的产品,逐步在市场中崭露头角。

冠西电子(COSMO)公司的发展小趣事

冠西电子(COSMO)公司成立于1981年,起初便专注于光电元件产品的制造。公司创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,逐步将冠西电子打造成光电元件领域的专业制造商。通过不断的技术创新和产品质量提升,冠西电子逐渐在电子行业中崭露头角。

ETC2公司的发展小趣事

为了拓宽市场,ETC2公司积极寻求与其他行业的跨界合作。他们与汽车制造商合作,将ETC设备集成到新车中,实现了出厂即装ETC的目标。这一举措不仅提高了ETC设备的普及率,也为汽车制造商带来了更多的卖点。此外,ETC2公司还与支付公司合作,推出了ETC支付功能,使得用户可以通过ETC设备实现无感支付,进一步提升了用户体验。

EKIT公司的发展小趣事

2023年10月,华为坤灵(HUAWEI eKit)在香港成功举办了分销新品发布会。针对香港市场的特点,HUAWEI eKit展示了面向SOHO办公、酒店餐饮、商业地产、零售商超等场景的新品,并通过整合政策、产品、解决方案、服务和数字工具平台等措施,助力香港区域分销伙伴不断开拓中小企业市场。通过与联强国际(香港)有限公司(SYNNEX)的紧密合作,HUAWEI eKit成功吸引了超过100名香港分销商参与此次发布会,进一步巩固了其在香港市场的地位。

Advanced_Linear_Devices_Inc.公司的发展小趣事

随着全球市场的不断扩大,ALD积极推进国际化战略。公司通过与全球各地的OEM制造商建立合作关系,将产品销往世界各地。同时,ALD还积极参与国际电子展会和论坛,展示其最新技术和产品,与全球同行交流合作。这些举措不仅提升了ALD的国际知名度,还为公司带来了更多的商机和发展空间。

Hendon Semiconductors公司的发展小趣事

Hendon Semiconductors以其强大的定制化集成电路设计能力而闻名。公司拥有一支经验丰富的设计团队,能够为客户提供从概念到量产的一站式解决方案。这种定制化服务不仅满足了客户对特殊功能和高性能的需求,也帮助Hendon Semiconductors在竞争激烈的市场中脱颖而出。通过不断积累成功案例和技术经验,Hendon Semiconductors逐渐在定制化集成电路设计领域建立了良好的口碑。

问答坊 | AI 解惑

工控定义

工控即工业控制计算机,是一种采用总线结构,对生产过程及其机电设备、工艺装备进行检测与控制的工具总称。它具有重要的计算机属性和特征,如:具有计算机CPU、硬盘、内存、外设及接口、并有实时的操作系统、控制网络和协议、计算能力,友好的人机 ...…

查看全部问答>

100427A LabView Based Instrumentation System

看看人家用labview都能做什么…

查看全部问答>

6410硬件解码和Directshow

平台:三星6410 + wince6.0 如何将三星的硬件解码加到Directshow里面. 三星提供的MFCDecoderFilter加了上去好像没用. 请各位指点.…

查看全部问答>

高手请教如何设计交通控制灯

内容:设计一个十字路口的红、绿、黄三色信号交通灯控制电路 设计要求与数据:1. 用红、绿、黄三色发光二极管作信号灯。主干道为东西向,有红、绿、黄三个灯;支干道为南北向,也有红、绿、黄三个灯。红灯亮禁止通行;绿灯亮允许通行;黄灯亮则给 ...…

查看全部问答>

请问有关于机器人的编程方面

因为机械系的同学想做一个机器人,其功能是关于地震搜救的一个机器人实物。 是用单片机还是用arm,那个合适点?? 现在需要一个计算机系的同学帮助其做程序相关的部分。 请问编程的话需要学习哪方面的内容。 而且如果控制端和机器人通信,应该 ...…

查看全部问答>

请教关于找曲线规律的方法?

这是一个温度电压的非线性关系曲线,请问是找方程关系式,还是找规律,温度是0-45℃ …

查看全部问答>

data abort: filesys.exe

串口信息: Data Abort: Thread=87fe80cc Proc=8043d630 \'filesys.exe\' AKY=ffffffff PC=0002dd44(filesys.exe+0x0001dd44) RA=00034954(filesys.exe+0x00024954) BVA=420000e8 FSR=00000005 大家给点意见 网上说的是少了flash驱动。可我的工 ...…

查看全部问答>

TI TMS320VC33 的 浮点运算精度太底 如何解决啊??!!

   各位大虾好,小弟在使用TMS320VC33DSP进行大量浮点运算时,发现其计算精度着实很低,所有的浮点运算大概只有7位有效位(十进制),但是由于该DSP在数据容量、计算速度、价格、功耗等方面具有很大优势,实在让人难于取舍,这么办 ...…

查看全部问答>

Wince6 dat 自定义文件的 多语言

    我目前在用vs2005 pb6.0定制Wince6.0系统。但是多语言的时候发现有些东西就是变不过来,例如控制面板的根目录下的Lnk文件或者桌面的快捷方式,就无法变动。 dat File System File定义目录和指定文件位置。当冷启动CE平台时,file ...…

查看全部问答>

请给推荐一款STM32的开发板

我想用STM32f103的芯片, 有必要买块开发板吗? 请给推荐一款不错的开发板!…

查看全部问答>