刚到的 ART-Pi 开发板点灯总结

ART-Pi 是 RT-Thread 团队经过半年的精心准备,专门为嵌入式软件工程师、开源创客设计的一款极具扩展功能的 DIY 开源硬件。

官网地址:http://art-pi.gitee.io/website/

MDK5 烧写示例程序

买回来没自信看文档,所以导致板子的 boot_loader 被擦除了,于是乎烧写进去的程序没有反应。

资源下载

首先去 GitHub 下载相关资源:https://github.com/RT-Thread-Studio/sdk-bsp-stm32h750-realthread-artpi

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ sdk-bsp-stm32h750-realthread-artpi 
├── README.md
├── RealThread_STMH750-ART-Pi.yaml
├── debug
├── documents
│   ├── coding_style_cn.md
│   ├── RT-Thread 编程指南.pdf
│   ├── UM5001-RT-Thread ART-Pi 快速上手.md
│   ├── UM5002-RT-Thread ART-Pi 开发手册.md
│   ├── UM5003-RT-Thread ART-Pi BT_WIFI 模块固件下载手册.md
│   ├── UM5004-RT-Thread ART-Pi 代码贡献手册.md
│   ├── board
│   └── figures
├── libraries
│   ├── STM32H7xx_HAL
│   ├── drivers
│   ├── rt_ota_lib
│   └── wlan_wiced_lib
├── projects
│   ├── art_pi_blink_led
│   ├── art_pi_bootloader
│   ├── art_pi_factory
│   ├── art_pi_wifi
│   └── industry_io_gateway
├── rt-thread
└── tools
  • RealThread_STMH750-ART-Pi.yaml 描述 ART-Pi 的硬件信息
  • debug QSPI FLASH 下载算法等
  • documents 图纸,文档,图片以及 datasheets 等
  • libraries STM32H7 固件库,通用外设驱动,rt_ota 固件库,wlan 固件库等
  • projects 示例工程文件夹,包含出厂程序,网关程序等
  • rt-thread rt-thread 源码
  • tools wifi 固件,BT 固件,rbl 打包工具等

符号链接

接下来需要使用 mklink 命令来分别为 rt-threadlibraries 文件创建符号链接。

1
2
3
4
5
E:\project\sdk-bsp-stm32h750-realthread-artpi\projects\art_pi_blink_led>mklink /D rt-thread ..\..\rt-thread
为 rt-thread <<===>> ..\..\rt-thread 创建的符号链接

E:\project\sdk-bsp-stm32h750-realthread-artpi\projects>mklink /D libraries ..\..\libraries
为 libraries <<===>> ..\..\libraries 创建的符号链接

烧写 bootloader

使用 ENV 工具在 art_pi_bootloader 目录执行 scons –target=mdk5 来生成 MDK5 工程。

需要安装 pack 支持包,可以去 keil 官网下载 Keil.STM32H7xx_DFP.2.7.0.pack 并安装,因为我们的板子处理器是 STM32H7 系列。

接下来配置一下 Flash Download:

安装下载算法

接下来我们用同样的方式使用 ENV 将点灯示例 art_pi_blink_led 生成 MDK5 工程。

这里需要注意的是我们需要安装新算法,复制 sdk-bsp-stm32h750-realthread-artpi\debug\flm 目录下的 ART-Pi_W25Q64.FLM 文件到 Keil 的安装目录,例如我的是 C:\Keil_v5\ARM\Flash.

然后去配置 Flash Download:

这里特别需要注意的是 Address Range 的配置一定要从 90000000H 开始到 907FFFFFH。

按键切换 LED 实验

最后送上一个开场小实验,按键切换点灯实验。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"

#define THREAD_STACK_SIZE 200 //线程栈大小(字节)

#define THREAD_TIMESLICE 40   //占用的滴答时钟数

#define NULL_LED -1

#define LED_PIN_RED 		GET_PIN(C, 15)  //红灯管脚
#define LED_PIN_BLUE 		GET_PIN(I, 8)  //蓝灯管脚

#define KEY_SWITCH_LED        GET_PIN(H, 4)  //点亮红灯按钮

static rt_thread_t key_led_thread = RT_NULL;
static rt_uint8_t thread_priority = 20;


//根据下标点亮LED
void change_lighting_led(int lightIndex)
{
    switch(lightIndex){
        case 0:
            rt_pin_write(LED_PIN_RED, PIN_LOW);
            rt_pin_write(LED_PIN_BLUE, PIN_HIGH);
            break;
        case 1:
            rt_pin_write(LED_PIN_RED, PIN_LOW);
            rt_pin_write(LED_PIN_BLUE, PIN_LOW);
            break;
        case 2:
            rt_pin_write(LED_PIN_RED, PIN_HIGH);
            rt_pin_write(LED_PIN_BLUE, PIN_LOW);
            break;
        default:
            rt_pin_write(LED_PIN_RED, PIN_HIGH);
            rt_pin_write(LED_PIN_BLUE, PIN_HIGH); 
            break;
    }

}

//读取按键
void read_key_lighting_led()
{
 
    int lightIndex = NULL_LED;
    change_lighting_led(lightIndex); //熄灭所有LED

    while (1)
    {
       if(rt_pin_read(KEY_SWITCH_LED) == PIN_LOW)
            {
                rt_thread_mdelay(50);  //去抖动
                if(rt_pin_read(KEY_SWITCH_LED) == PIN_LOW)
                {
                    if(lightIndex == NULL_LED){
                        lightIndex = 0;
                    }else{
                        lightIndex = lightIndex % 3;
                    }
                    change_lighting_led(lightIndex);  //切换点亮的LED
                    lightIndex++;
                }
        }
        rt_thread_mdelay(50);
    }
}

//线程函数
void key_control_led_entry(void *param)
{
    //设置管脚的模式
    rt_pin_mode(LED_PIN_RED, PIN_MODE_OUTPUT);
    rt_pin_mode(LED_PIN_BLUE, PIN_MODE_OUTPUT);

    rt_pin_mode(KEY_SWITCH_LED, PIN_MODE_INPUT);

    read_key_lighting_led();
}

//创建键盘控制LED线程
int create_key_control_led_thread(void)
{
    key_led_thread = rt_thread_create("led_test", key_control_led_entry, 
                    RT_NULL, THREAD_STACK_SIZE, thread_priority, THREAD_TIMESLICE);
    if(key_led_thread != RT_NULL)
    {
         rt_thread_startup(key_led_thread);
    }
    return 0;
}

INIT_APP_EXPORT(create_key_control_led_thread);