您的当前位置:首页正文

【ARM嵌入式】漂亮的跑马灯

2024-11-07 来源:个人技术集锦

一、学习指南

在ARM嵌入式系统中,漂亮的跑马灯通常指的是LED(Light Emitting Diode)数组的一种动态显示效果,它可以用于指示状态、增加设备的视觉吸引力或者作为简单的用户交互元素。实现这种跑马灯效果的基本步骤如下:

1. LED硬件配置:选择合适的LED模块,将其连接到嵌入式系统的GPIO(General Purpose Input/Output)引脚上,以便控制每个LED的开关。

2. 控制算法:编写控制代码,使用循环或延时函数,逐个点亮和关闭LED,形成前进或后退的动画。可以设置不同速度、颜色变化或闪烁模式,增强视觉效果。

3. 软件设计:可以使用C语言或其他支持的编程语言编写控制程序,通常会利用中断或定时器来精确控制LED的切换。有时还会配合微控制器的PWM(Pulse Width Modulation)功能,实现更平滑的颜色过渡。

4. 示例代码:很多开源的ARM嵌入式开发板,如STM32或树莓派,都提供了跑马灯的示例代码,开发者可以直接参考学习并根据需要进行修改。

 二、GPIO基本原理

1、GPIO基本结构和工作方式 

1.1 基本结构:

(1)保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。 当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。 但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。

(2)P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式 。 这里的电路会在下面很详细地分析到。

(3)TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。 但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。 ADC外设要采集到的原始的模拟信号。

1.2工作方式

GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。

每个I/O口可以自由编程,但I/O口寄存器必须按32位字被访问。

GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出

2、GPIO寄存器说明

GPIO的相关配置寄存器
STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这7个寄存器分别为:

GPIOx_CRL:端口配置低寄存器(32位)
GPIOx_CRH:端口配置高寄存器(32位)
GPIOx_IDR:端口输入寄存器(32位)
GPIOx_ODR:端口输出寄存器(32位)
GPIOx_BSRR:端口位设置/清除寄存器(32位)
GPIOx_BRR:端口位清除寄存器(16位)
GPIOx_LCKR:端口配置锁存寄存器(32位)

3、STM32F10x GPIO引脚说明

STM32F10x微控制器中,每个GPIO引脚都有一个对应的配置寄存器(CRL或CRH)和输入/输出数据寄存器(IDR或ODR)。 配置寄存器用于设置引脚的工作模式、输出类型、输出速度和上拉/下拉电阻。 数据寄存器用于读取或写入引脚的状态。

所有的IO口都可以作为中断输入

3.1端口复用功能:

3.2端口重映功能

 

 三、项目实施

1、硬件连接

2、库函数介绍 

库函数(Library function)是将函数封装入库,供用户使用的一种方式。 方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。 调用的时候把它所在的文件名用#include<>加到里面就可以了。 一般是放到lib文件里的。

函数库:函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的,以及连接过程中所需的信息。用户也可以根据自己的需要建立自己的用户函数库。

库函数:存放在函数库中的函数。库函数具有明确的功能、入口调用参数和返回值。

:将生成的连接在一起生成一个。

头文件:有时也称为包含文件。与之间进行信息通信时要使用的数据和,在使用某一库函数时,都要在程序中嵌入(用#include)该函数对应的头文件。

由于C语言应提供的函数库尚无国际标准。不同版本的C语言具有不同的库函数,用户使用时应查阅有关版本的C的库函数参考手册。我们以Turbo C为例简介一下C的库函数,并附录中给出了Turbo C的部分常用库函数。 [1]

四、代码演示

在ARM嵌入式系统中,跑马灯(也称为七段数码管)通常用于显示简单的数字和字符,其编程涉及到硬件初始化、数据驱动以及循环控制。以下是一个基本的C语言示例,展示了如何在STM32这样的微控制器上实现一个简单的跑马灯效果:

#include "stm32f10x.h" // 假设使用STM32F1系列

// 定义数码管的映射表
#define LCDSEG(a) (LCD_DB0##a | LCD_DB1##a | LCD_DB2##a | LCD_DB3##a)
const uint8_t digit_map[] = {LCDSEG(7), LCDSEG(6), LCDSEG(5), LCDSEG(4), LCDSEG(3), LCDSEG(2), LCDSEG(1), LCDSEG(0)};

void lcd_init(void); // 初始化函数
void lcd_putchar(uint8_t char_to_display); // 显示字符的函数
void run_marquee(const char* message, uint8_t delay_ms); // 跑马灯显示函数

int main(void) {
    lcd_init();
    while (1) {
        run_marquee("Hello, World!", 100); // 消息滚动显示,每100ms移动一位
    }
}

void lcd_init() {
    // 这里省略了具体的GPIO和液晶初始化代码,你需要根据实际硬件配置
    // 参考STM32官方文档或第三方库如Keil.STM32CubeMX等
}

void lcd_putchar(uint8_t char_to_display) {
    for (int i = 7; i >= 0; i--) {
        if (digit_map[char_to_display] & (1 << i)) {
            // 数据线驱动高电平
            LCD_SET_BIT(port, i);
            // 等待一段时间让显示稳定
            HAL_Delay(1);
        } else {
            LCD_CLR_BIT(port, i);
        }
    }
}

void run_marquee(const char* message, uint8_t delay_ms) {
    for (int i = 0; message[i] != '\0'; i++) {
        lcd_putchar(message[i]);
        HAL_Delay(delay_ms);
    }
}

五、项目总结

在嵌入式开发中,"跑马灯"通常指的是一种通过控制LED灯按照一定顺序依次点亮或熄灭,形成一种动态效果的程序。这种效果可以是灯的顺序点亮、闪烁、流水式移动等,通常用于展示微控制器的GPIO(通用输入输出)控制能力,也是初学者学习STM32微控制器时的一个经典入门项目。跑马灯项目可以帮助初学者理解GPIO的基本概念,学习如何通过编程控制硬件。通过编写控制LED灯的代码,学习者可以更好地理解微控制器的时序控制和中断机制。跑马灯是一个动手实践的好项目,可以让学习者从理论走向实践,加深对STM32硬件和软件的理解。跑马灯可以作为展示STM32编程能力的一个有趣方式,也可以激发学习者进一步探索更复杂的嵌入式系统设计。

Top