RT-Thread STM32F429 armfly-v6开发板BSP说明

RT-Thread STM32F429 armfly-v6开发板BSP说明简介开发板介绍外设支持使用说明快速上手硬件连接编译下载运行结果

进阶使用

注意事项示例代码源码下载维护人:

RT-Thread STM32F429 armfly-v6开发板BSP说明

简介

本文档为 RT-Thread 开发团队为 STM32F429 armfly-v6 开发板提供的 BSP (板级支持包) 说明。

主要内容如下:

开发板资源介绍BSP 快速上手进阶使用方法

通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。

开发板介绍

armfly-v6 STM32F429 是安富莱推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 180Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32F429 的芯片性能。

开发板外观如下图所示:

该开发板常用 板载资源 如下:

MCU:STM32F429IGT6,主频 180MHz,2048KB FLASH ,256KB RAM外部 RAM:MT48LC4M32B2(SDRAM,16MB,32bit)外部 FLASH:W25Q64BVSSIG(SPI,8MB)、HY27UF081G2A(NAND,128MB)常用外设

LED:4个,扩展IO LED1 - LED4按键:4个,k1(PI8),K2(PC13),k3(PH4),五向摇杆 常用接口:USB 转串口、SD 卡接口、以太网接口、LCD 接口调试接口:SWD

开发板更多详细信息请参考安富莱 STM32 v6 开发板介绍。

外设支持

本 BSP 目前对外设的支持情况如下:

板载外设支持情况备注USB 转串口支持扩展IO支持SPI Flash支持以太网支持MPU6050支持SDRAM支持SD卡支持LCD支持支持 RGB 屏CAN暂不支持片上外设支持情况备注GPIO支持PA0, PA1… PK15 —> PIN: 0, 1…176UART支持UART1SPI支持SPI1/2/5I2C支持软件 I2CADC支持RTC支持支持外部晶振和内部低速时钟WDT支持FLASH支持已适配 FALSDIO支持PWM支持USB Device暂不支持即将支持USB Host暂不支持即将支持扩展模块支持情况备注ad7606暂不支持

使用说明

使用说明分为如下两个章节:

快速上手 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 进阶使用 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。

快速上手

本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。

硬件连接

使用数据线连接开发板到 PC,打开电源开关。

编译下载

双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。

工程默认配置使用 JLink 下载程序,在通过 JLink 连接开发板的基础上,点击下载按钮即可下载程序到开发板

运行结果

下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,LED2 - 4 常亮、LED1 会周期性闪烁。

连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息:

\ | /

- RT - Thread Operating System

/ | \ 3.1.1 build Nov 19 2018

2006 - 2018 Copyright by rt-thread team

msh >

进阶使用

此 BSP 默认只开启了 GPIO 和 串口1 的功能,如果需使用 SD 卡、Flash 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下:

在 bsp 下打开 env 工具。 输入menuconfig命令配置工程,配置好之后保存退出。 输入pkgs --update命令更新软件包。 输入scons --target=mdk4/mdk5/iar 命令重新生成工程。

本章节更多详细的介绍请参考 STM32 系列 BSP 外设驱动使用教程。

注意事项

暂无

示例代码

…\components\finsh\cmd.c

#ifdef RT_USING_MAILBOX

long list_mailbox(void)

{

rt_base_t level;

list_get_next_t find_arg;

struct rt_object_information *info;

rt_list_t *obj_list[LIST_FIND_OBJ_NR];

rt_list_t *next = (rt_list_t *)RT_NULL;

int maxlen;

const char *item_title = "mailbox";

list_find_init(&find_arg, RT_Object_Class_MailBox, obj_list, sizeof(obj_list) / sizeof(obj_list[0]));

info = rt_list_entry(find_arg.list, struct rt_object_information, object_list);

maxlen = RT_NAME_MAX;

rt_kprintf("%-*.*s entry size suspend thread\n", maxlen, maxlen, item_title);

object_split(maxlen);

rt_kprintf(" ---- ---- --------------\n");

do

{

next = list_get_next(next, &find_arg);

{

int i;

for (i = 0; i < find_arg.nr_out; i++)

{

struct rt_object *obj;

struct rt_mailbox *m;

obj = rt_list_entry(obj_list[i], struct rt_object, list);

level = rt_spin_lock_irqsave(&info->spinlock);

if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)

{

rt_spin_unlock_irqrestore(&info->spinlock, level);

continue;

}

rt_spin_unlock_irqrestore(&info->spinlock, level);

m = (struct rt_mailbox *)obj;

if (!rt_list_isempty(&m->parent.suspend_thread))

{

rt_kprintf("%-*.*s %04d %04d %d:",

maxlen, RT_NAME_MAX,

m->parent.parent.name,

m->entry,

m->size,

rt_list_len(&m->parent.suspend_thread));

show_wait_queue(&(m->parent.suspend_thread));

rt_kprintf("\n");

}

else

{

rt_kprintf("%-*.*s %04d %04d %d\n",

maxlen, RT_NAME_MAX,

m->parent.parent.name,

m->entry,

m->size,

rt_list_len(&m->parent.suspend_thread));

}

}

}

}

while (next != (rt_list_t *)RT_NULL);

return 0;

}

#endif /* RT_USING_MAILBOX */

#ifdef RT_USING_MESSAGEQUEUE

long list_msgqueue(void)

{

rt_base_t level;

list_get_next_t find_arg;

struct rt_object_information *info;

rt_list_t *obj_list[LIST_FIND_OBJ_NR];

rt_list_t *next = (rt_list_t *)RT_NULL;

int maxlen;

const char *item_title = "msgqueue";

list_find_init(&find_arg, RT_Object_Class_MessageQueue, obj_list, sizeof(obj_list) / sizeof(obj_list[0]));

info = rt_list_entry(find_arg.list, struct rt_object_information, object_list);

maxlen = RT_NAME_MAX;

rt_kprintf("%-*.*s entry suspend thread\n", maxlen, maxlen, item_title);

object_split(maxlen);

rt_kprintf(" ---- --------------\n");

do

{

next = list_get_next(next, &find_arg);

{

int i;

for (i = 0; i < find_arg.nr_out; i++)

{

struct rt_object *obj;

struct rt_messagequeue *m;

obj = rt_list_entry(obj_list[i], struct rt_object, list);

level = rt_spin_lock_irqsave(&info->spinlock);

if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)

{

rt_spin_unlock_irqrestore(&info->spinlock, level);

continue;

}

rt_spin_unlock_irqrestore(&info->spinlock, level);

m = (struct rt_messagequeue *)obj;

if (!rt_list_isempty(&m->parent.suspend_thread))

{

rt_kprintf("%-*.*s %04d %d:",

maxlen, RT_NAME_MAX,

m->parent.parent.name,

m->entry,

rt_list_len(&m->parent.suspend_thread));

show_wait_queue(&(m->parent.suspend_thread));

rt_kprintf("\n");

}

else

{

rt_kprintf("%-*.*s %04d %d\n",

maxlen, RT_NAME_MAX,

m->parent.parent.name,

m->entry,

rt_list_len(&m->parent.suspend_thread));

}

}

}

}

while (next != (rt_list_t *)RT_NULL);

return 0;

}

#endif /* RT_USING_MESSAGEQUEUE */

#ifdef RT_USING_MEMHEAP

long list_memheap(void)

{

rt_base_t level;

list_get_next_t find_arg;

struct rt_object_information *info;

rt_list_t *obj_list[LIST_FIND_OBJ_NR];

rt_list_t *next = (rt_list_t *)RT_NULL;

int maxlen;

const char *item_title = "memheap";

list_find_init(&find_arg, RT_Object_Class_MemHeap, obj_list, sizeof(obj_list) / sizeof(obj_list[0]));

info = rt_list_entry(find_arg.list, struct rt_object_information, object_list);

maxlen = RT_NAME_MAX;

rt_kprintf("%-*.*s pool size max used size available size\n", maxlen, maxlen, item_title);

object_split(maxlen);

rt_kprintf(" ---------- ------------- --------------\n");

do

{

next = list_get_next(next, &find_arg);

{

int i;

for (i = 0; i < find_arg.nr_out; i++)

{

struct rt_object *obj;

struct rt_memheap *mh;

obj = rt_list_entry(obj_list[i], struct rt_object, list);

level = rt_spin_lock_irqsave(&info->spinlock);

if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)

{

rt_spin_unlock_irqrestore(&info->spinlock, level);

continue;

}

rt_spin_unlock_irqrestore(&info->spinlock, level);

mh = (struct rt_memheap *)obj;

rt_kprintf("%-*.*s %-010d %-013d %-05d\n",

maxlen, RT_NAME_MAX,

mh->parent.name,

mh->pool_size,

mh->max_used_size,

mh->available_size);

}

}

}

while (next != (rt_list_t *)RT_NULL);

return 0;

}

#endif /* RT_USING_MEMHEAP */

源码下载

…\bsp\stm32\stm32f429-armfly-v6\project.uvproj

RT-Thread STM32F429 armfly-v6开发板BSP说明 源码下载

维护人:

华为奋斗者精神, 邮箱:1992152446@qq.com

相关阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。