STM32学习笔记一(LED,跑马灯,呼吸灯)

发布者:RainbowPromise最新更新时间:2018-08-15 来源: eefocus关键字:STM32  LED  跑马灯  呼吸灯 手机看文章 扫描二维码
随时随地手机看文章

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工程模版的建立,方便我们后续的开发。


关键字:STM32  LED  跑马灯  呼吸灯 引用地址:STM32学习笔记一(LED,跑马灯,呼吸灯)

上一篇:STM32-点亮LED灯(GPIO配置)
下一篇:使用STM32GPIO端口点亮LED灯(库函数)

推荐阅读最新更新时间:2024-03-16 16:11

ST联手Fieldscale为基于STM32的智能设备带来简单直观的触控体验
半导体供应商意法半导体(STMicroelectronics,简称ST; 纽约证券交易所代码:STM)与ST授权合作伙伴、仿真软件提供商Fieldscale合作,简化基于STM32微控制器(MCU)的智能设备的触控用户界面开发过程。 触控功能方便省事,对最终用户很有吸引力,并且可以提高产品的可靠性、入口防护级别和成本效益。另一方面,触控界面开发具有挑战性。当采用常规的迭代设计方法时,优化系统,消除意外影响并确保触控响应性在任何操作条件下都保持一致,用户可能需要开发多个原型。 现在,意法半导体和Fieldscale公司合作,让Fieldscale的SENSE开发平台支持意法半导体的Arm® Cortex®-32位MCU
[单片机]
ST联手Fieldscale为基于<font color='red'>STM32</font>的智能设备带来简单直观的触控体验
滴答时钟开刀了解STM32库操作
  STM32的库函数操作给设计开发人员带来了诸多的便利,开发人员不必十分了解STM32的内部寄存器及硬件机制,只要有C语言基础,即可完成单片机的开发,缩短了开发周期,降低了开发难度,因而备受工程师喜爱。   基于库函数的开发模式,与基于API(Application Programming Interface)的软件开发有着异曲同工之处,程序员通过调用 API 函数对应用程序进行开发,而又无需访问源码,或理解内部工作机制的细节,可以减轻编程任务。STM32的基于函数库的开发模式也是一样的道理,因此对于有单片机开发经验的工程师来说,学习STM32,很容易就可以上手。   虽然可以不考虑库函数内部的细节,不考虑如何实现硬件寄存器
[单片机]
单片机中LED数码管的介绍
LED 小灯是一种简单的 LED,只能通过亮和灭来表达简单的信息。而这节课我们要来学习一种能表达更复杂信息的器件——LED 数码管。 先给大家提供一张原理图看一下,如图 5-3 所示。 图 5-3 数码管原理图 这是比较常见的数码管的原理图,我们板子上一共有 6 个数码管。前边有了 LED 小灯的学习,数码管学习就会轻松的多了。从图 5-3 可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。我们看一下数码管内部结构的示意图,如图 5-4。 图 5-4 数码管结构示意图 数码管分为共阳和共阴两种,共
[单片机]
单片机中<font color='red'>LED</font>数码管的介绍
LED照明测试技术分析 驱动电源可靠性和能效成关键
  近几年LED作为新型节能光源在全球和中国都赢得得了很高的投资热情和极大关注,并由户外向室内照明应用市场渗透,中国也涌现出大大小小上万家LED照明企业。让LED照明大放异彩的最主要原因正是其宣扬的具有节能、环保、长寿命、易控制、免维护等特点。   然而颇具讽刺意味的是,我们常常听闻由于LED驱动电源本身的寿命直接拖累LED照明灯具变得并不“长寿”,极大地增加了维护/使用成本;或者驱动电源的效率不高导致LED照明灯具的能效转换比并不是想象中那么高,或者由于输出电流纹波没有得到很好的控制影响了发光品质,使得LED照明的绿色节能优势大打折扣,甚至影响了市场普及。   因此,LED产业链的完善和成熟,驱动电源也是其中重要的一环。但现
[电源管理]
<font color='red'>LED</font>照明测试技术分析 驱动电源可靠性和能效成关键
韩国研究人员开发出全新激光LED大灯 减少驾驶员视线阻碍
据外媒报道,韩国光子技术研究所(The Korea Photonics Technology Institute,KOPTI)的研究人员采用超精密光学系统设计开发出新大灯,可以轻松识别远距离的车辆和人员,同时最大限度地减少对驾驶员视线的阻碍。 图片来源:韩国光子技术研究所 据悉,研究人员已将激光发光二极管混合大灯本地化,可应用于商用车和数码灯。激光大灯可以将光线聚焦在狭窄的区域、减小光学系统的尺寸,并实现自由设计。 将LED大灯与激光二极管相结合,能以高光束照亮600多米。该研究所还将其技术与梅赛德斯-奔驰S级、奥迪R8和宝马X6等顶级商业化海外轿车大灯的光束距离进行了比较。 KOPTI移动出行照明研究中心研
[汽车电子]
韩国研究人员开发出全新激光<font color='red'>LED</font>大灯 减少驾驶员视线阻碍
STM32位带操作详细介绍
前言 //在STM32中,如果我们要使PB0端口输出低电平,可以用如下语句 GPIOB- ODR |= 0 0; //在51单片机中我们是这样的 P0 = 0xff; //总线操作 //还有一种方法 sbit LED1 = P0^0; LED1 = 0;//位操作 在STM32中能不能实现位操作呢,当然是可以的,这种方法我们叫做位带操作。位操作就是可以单独的对一个比特位读和写。 1.位带简介 在STM32中,有两个地方实现了位带,一个是 SRAM 区的最低 1MB 空间,另一个是外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区把这 1MB 的空
[单片机]
<font color='red'>STM32</font>位带操作详细介绍
判断STM32 GPIO输入口的输入状态
以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE- IDR& GPIO_IDR_IDR2) { 函数体; } 当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假; ② 判断单个端口是否为低电平: if((~GPIOE- IDR)& GPIO_IDR_IDR2) { 函数体; } 分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法可以同时判断PE2或PE4(甚至更多PE口)是
[单片机]
在单片机上实现动态加载功能
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义 /common/dl_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved