【STM32H7教程】第18章STM32H7的GPIO应用之跑马灯

【STM32H7教程】第18章STM32H7的GPIO应⽤之跑马灯
第18章      STM32H7的GPIO应⽤之跑马灯
本章教程为⼤家介绍STM32H7的GPIO应⽤之跑马灯,跑马灯作为经典的测试例程,可以让⼤家对STM32H7应⽤有个简单的整体认识。18.1 初学者重要提⽰
18.2 跑马灯硬件设计
18.3 跑马灯软件驱动设计
18.4 跑马灯板级⽀持包(bsp_led.c)
18.5 实验例程设计框架
18.6 跑马灯驱动移植和使⽤
18.7 实验例程说明(MDK)
18.8 实验例程说明(IAR)
18.9 总结
18.1 初学者重要提⽰
1. 学习本章节前,务必保证已经学习了第15,16和17章。
2. 虽然是跑马灯的初级例程,但有必要掌握程序的基本设计框架,后⾯的例⼦都是建⽴在这个框架的基础上。
3.  LED不是⽤CPU的IO直接驱动,⽽是由74HC574驱动的,74HC574是⼀个8路并⼝缓冲器,挂在FMC总线上,实现IO扩展。也许初
学者会问为什么要做IO扩展,不是已经⽤了240脚的STM32H743XIH6吗?因为开发板使⽤了32位SDRAM和RGB888硬件接⼝,消耗IO巨⼤,所以必须得扩展了。
4. 对于初学者来说,仅需掌握LED驱动的实现⽅法和对应的API调⽤即可,需要深⼊的理解IO扩展部分,会在后⾯的第48章节进⾏详细
讲解。
5.  FMC总线扩展32路⾼速IO理解成GPIO的ODR寄存器就很简单了,其实就是⼀个东西。
6. FMC扩展IO是对地址0x60001000的32bit数据空间的0和1的操作。GPIOA的ODR寄存器是对地址 0x40000000 + 0x18020000 + 0x14
空间的操作。但只能操作16个引脚。
使⽤总线的优势就在这⾥了,相当于在GPIOA到GPIOK的基础上,⼜扩展出GPIOL和GPIOM。
#define PERIPH_BASE            ((uint32_t)0x40000000)
#define D3_AHB1PERIPH_BASE    (PERIPH_BASE + 0x18020000)
#define GPIOA_BASE            (D3_AHB1PERIPH_BASE + 0x0000)
#define GPIOA                  ((GPIO_TypeDef *) GPIOA_BASE)
typedef struct
{
__IO uint32_t MODER;    /*!< GPIO port mode register,              Address offset: 0x00      */
__IO uint32_t OTYPER;  /*!< GPIO port output type register,        Address offset: 0x04      */
__IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,      Address offset: 0x08      */
__IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
__IO uint32_t IDR;      /*!< GPIO port input data register,        Address offset: 0x10      */
__IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
__IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
__IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
__IO uint32_t LCKR;    /*!< GPIO port configuration lock register, Address offset: 0x1C      */
__IO uint32_t AFR[2];  /*!< GPIO alternate function registers,    Address offset: 0x20-0x24 */
} GPIO_TypeDef;
18.2 跑马灯硬件设计
跑马灯的硬件设计如下:
通过这个硬件设计,有如下四点需要学习:
18.2.1 灌电流驱动⽅式
关于拉电流、灌电流和相关的电⽓特性,在第15章的15.4⼩节做了专门的讲解。对于STM32H7来说,使⽤拉电流和灌电流驱动LED都是可以的,因为拉电流和灌电流时,STM32H7总的拉电流和灌电流都是不可超过140mA,单个引脚最⼤不可超过20mA。
开发板这⾥是采⽤的灌电流⽅式。
18.2.2 LED的压降和驱动电流
这种采⽤的是灌电流⽅式,⽽流经LED的电流⼤⼩是多少呢?这⾥需要先补充⼀个基础的知识点。
直插超亮发光⼆极管压降,主要有三种颜⾊,然⽽三种发光⼆极管的压降都不相同,具体压降参考值如下:
红⾊发光⼆极管的压降为2.0V-2.2V。
黄⾊发光⼆极管的压降为1.8V-2.0V。
绿⾊发光⼆极管的压降为3.0V-3.2V。
正常发光时的额定电流约为20mA。
贴⽚LED压降:
红⾊的压降为1.82-1.88V,电流5-8mA。
绿⾊的压降为1.75-1.82V,电流3-5mA。
橙⾊的压降为1.7-1.8V,电流3-5mA。
蓝⾊的压降为3.1-3.3V,电流8-10mA。
⽩⾊的压降为3-3.2V,电流10-15mA。
实际测试开发板红⾊贴⽚LED的压降的确是1.8V左右,那么流过LED的电流就是
(3.3 – 1.8)/ 1K = 1.4mA
在不考虑⼆极管本⾝电阻的情况下,流过LED的电流就是1.4mA。
18.2.3 总线扩展
在教程第48章节详细讲解了这个问题,对于初学者来说,可以先不⽤看,等后⾯学习了FMC总线后再去看,就容易掌握多了。
18.2.4 贴⽚LED的正负极区分
仔细查看开发板版上⾯所使⽤的贴⽚LED,会发现⼀端有绿点,有绿点的这端是负极,⽽另⼀端就是正级了。
格栅井
跑马灯的软件驱动实现⽐较简单,主要是IO初始化,LED亮,LED灭,LED翻转。对应的驱动⽂件也是实现了这⼏个功能,没有特别的技巧,所以⼤家看源代码也⽐较省事。
18.4 跑马灯板级⽀持包(bsp_led.c)
LED驱动⽂件bsp_led.c主要实现了如下⼏个API:
bsp_InitLed
bsp_LedOn
bsp_LedOff
bsp_LedToggle
bsp_IsLedOn
下⾯将这⼏个API逐⼀进⾏说明。
18.4.1 函数bsp_InitLed
函数原型:
/*
*********************************************************************************************************
*    函数名: bsp_InitLed
*    功能说明: 配置LED指⽰灯相关的GPIO,  该函数被 bsp_Init() 调⽤。
*    形参:  ⽆
*    返回值: ⽆
*********************************************************************************************************
*/
void bsp_InitLed(void)
{
bsp_LedOff(1);
bsp_LedOff(2);
bsp_LedOff(3);
bsp_LedOff(4);
}
函数描述:
此函数主要⽤于LED初始化。由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮,因此在改变GPIO为输出前,先关闭LED指⽰灯。
注意事项:
1. ⼤家会有疑惑,为什么这⾥没有初始化GPIO。这是因为V7开发板是由74HC574驱动的,不是⽤CPU的IO直接驱动,74HC574是⼀个
8路并⼝缓冲器,挂在FMC总线上,实现IO扩展。
2. 通过FMC总线扩展出的IO来驱动,不是GPIO直接驱动。
3. 调⽤此函数前,要优先调⽤函数bsp_InitExtIO(),此函数⽤于初始化FMC扩展接⼝,关于这⽅⾯的知识在48章节专门做了讲解
使⽤举例:
调⽤此函数前,务必优先调⽤函数bsp_InitExtIO()。这⾥底层驱动初始化⼀般都是在bsp.c⽂件的函数bsp_Init⾥⾯调⽤。
18.4.2 函数bsp_LedOn
函数原型:
/*
*********************************************************************************************************
*    函数名: bsp_LedOn
*    功能说明: 点亮指定的LED指⽰灯。
*    形参:  _no : 指⽰灯序号,范围 1 - 4
*    返回值: ⽆
*********************************************************************************************************粉末冶金烧结炉
*/
void bsp_LedOn(uint8_t _no)
{
if (_no == 1)
{
HC574_SetPin(LED1, 0);
}
else if (_no == 2)
{
HC574_SetPin(LED2, 0);
}
else if (_no == 3)
{
HC574_SetPin(LED3, 0);
else if (_no == 4)
{
HC574_SetPin(LED4, 0);
}
}
函数描述:
此函数主要⽤于点亮LED。
函数参数:
第1个参数⽤于指定点亮那个LED,范围1-4。
使⽤举例:
此函数的使⽤⽐较简单,需要调⽤的时候直接调⽤即可。另外使⽤前记得先调⽤函数bsp_InitExtIO()和bsp_InitLed。
18.4.3 函数bsp_LedOff
函数原型:
/*
*********************************************************************************************************
*    函数名: bsp_LedOff
*    功能说明: 熄灭指定的LED指⽰灯。
*    形参:  _no 指⽰灯序号,范围 1 - 4
*    返回值: ⽆
*********************************************************************************************************
*/
void bsp_LedOff(uint8_t _no)
{
if (_no == 1)
{
HC574_SetPin(LED1, 1);
}
else if (_no == 2)
{
HC574_SetPin(LED2, 1);
}
else if (_no == 3)
{
HC574_SetPin(LED3, 1);
}
else if (_no == 4)
{
HC574_SetPin(LED4, 1);
}
}
函数描述:
此函数主要⽤于熄灭LED。
函数参数:
第1个参数⽤于指定熄灭那个LED,范围1-4。
使⽤举例:
此函数的使⽤⽐较简单,需要调⽤的时候直接调⽤即可。另外使⽤前记得先调⽤函数bsp_InitExtIO()和bsp_InitLed。
18.4.4 函数bsp_LedToggle
函数原型:
/*
*********************************************************************************************************
*    函数名: bsp_LedToggle
*    功能说明: 翻转指定的LED指⽰灯。
*    形参:  _no 指⽰灯序号,范围 1 - 4
*    返回值: 按键代码
*********************************************************************************************************
*/
void bsp_LedToggle(uint8_t _no)
{
uint32_t pin;
if (_no == 1)
pin = LED1;
}
else if (_no == 2)
{
pin = LED2;
}
else if (_no == 3)
{
pin = LED3;
}
平面音响else if (_no == 4)
{
pin = LED4;
}
else
{
return;
}
if (HC574_GetPin(pin))
{
HC574_SetPin(pin, 0);
}
else
{
HC574_SetPin(pin, 1);
}
}
函数描述:
此函数主要⽤于翻转LED。
函数参数:
第1个参数⽤于指定翻转那个LED,范围1-4。
卷盘
使⽤举例:
此函数的使⽤⽐较简单,需要调⽤的时候直接调⽤即可。另外使⽤前记得先调⽤函数bsp_InitExtIO()和bsp_InitLed。
18.4.5 函数bsp_IsLedOn
函数原型:
/*
毛竹片
*********************************************************************************************************
*    函数名: bsp_IsLedOn
*    功能说明: 判断LED指⽰灯是否已经点亮。
*    形参:  _no 指⽰灯序号,范围 1 - 4
*    返回值: 1表⽰已经点亮,0表⽰未点亮
*********************************************************************************************************
*/
uint8_t bsp_IsLedOn(uint8_t _no)
{
光控密码锁uint32_t pin;
if (_no == 1)
{
pin = LED1;
}
else if (_no == 2)
{
pin = LED2;
}
else if (_no == 3)
{
pin = LED3;
}
else if (_no == 4)
{
pin = LED4;
}
else
{
return0;
}
if (HC574_GetPin(pin))
{
return0;    /* 灭 */

本文发布于:2024-09-23 02:21:48,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/197968.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:LED封装技术
标签:跑马灯   电流   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议