先前曾参与一次新唐M471开发板的测评,后来便得到了一次优惠购置NuMaker--PFM--M487的机会,该开发板的外观如图1所示。
图1 开发板外观
在往常,对新唐产品的开发多轻车熟路地使用MDK来进行,随着几次参赛发现主办方多在要求使用RT_Thread来开发,于是也打算以RT_Thread来开发NuMaker--PFM--M487。
起初试了几次并不成功,几乎要放弃这种开发方式,后来还是逐渐入了门。
有人也许会问就必须赶这个风潮吗?
其实还真不完全是,主要是采用RT_Thread开发有其相对的优势,主要体现在:
(1)它支持线程化处理编程
(2)它所支持的芯片和开发板越来越丰富
(3)它提供了功能库的支持方式
就RT_Thread来讲,它最初所支持的开发板并不多,仅有AB32VG1、AT32F403、CH32V307等,如今却丰富了许多,新增的开发板有N32G457、M487、CH32V103、CPK-RA6M4、HPM6750等。
由于它与MDK一样可以随着版本的升级而推出新的支持包来扩展所支持的开发板,故能省去使用一种开发板就需要安装一种软件的烦恼。
此外,使用同一种工具开发可以免去往复步入由生到熟的学习过程。
当然最主要的还是它所提供的功能库支持,以往不同的厂家每推出一款新品,都要推出相应的软件升级包、驱程及相关例程等。尽管通过例程可以帮助使用者开始的了解和掌握片内资源的性能及用法,但在外设的扩展方面还是需要用户自己去拓展和丰富。而有了功能库的支持就不同了,在支持库中它对外设进行了相应的归类,使用时对其加以添加和调用即可,这样就可以省去相对重复性的劳动,达到高度的共享。
这里吹了这么多的RT_Thread,那我们如何用它来开发M487呢?
目前来讲,RT_Thread对M487所支持的板卡有2款,即NuMaker--PFM--M487和NuMaker--IOT--M487。
除开发板所侧重的功能方向不同外,2款板子的区别如下:
(1)结构布局的差异
尽管2款开发板的器件差异不大,但在结构布局上却差异较大,见图2和图3所示。
(2)价格的差异
在价格上,2款开发板的差异也是很大的,一款是127元,另一款却是426元。
(3)开发模板差异
在开发模板方面,2款开发板也是有差异,对于NuMaker--IOT--M487是提供LED测试的,而对于NuMaker--PFM--M487则是一个空函数,见图4和图5所示。
图2 NuMaker--IoT--M487
图3 NuMaker--PFM--M487
图4 NuMaker--IoT--M487
图5 NuMaker--PFM--M487
有了前面概括性的认识,那该如何使用RT_Thread呢?
1.创建RT_Thread项目
使用“文件”菜单下的“RT_Thread项目”选项来创建一个项目,见图6所示。
图6 创建项目
对于初次使用M487者,需在选取“基于开发板”方式后,选取“添加更多”选项以添加相应的支持包,见图7所示。
图7 添加支持包
随后需要按图8所示,添加开发板支持包和调试器支持包。
由于2款开发板的MCU是相同的,测试时自然是使用NuMaker--IoT--M487模板来创建项目,见图9所示。
图8 添加内容
图9 创建项目
2.编译程序
在完成项目创建,经编译其结果见图10所示。此时,在“Debug”的目录下会得到一个名为“rtthread.bin”的生成文件。
图10 完成创建与编译
为了进行程序下载,应安装开发板的驱动Nu-Link_USB_Driver 1.6。在完成安装后,将板上的设置开关置到指定位置,则可见到图11所示的虚拟串口。
图11 虚拟串口
3.程序下载
将生成的文件rtthread.bin拖入开发板所虚拟的U盘中,即可实现程序的下载,其运行效果如图 13所示,即红色指示灯不停地闪动10次。
图12 虚拟U盘
图 13 运行效果
对于一款开发板要掌握它的性能和使用方法,最基本的就是从GPIO口开始。
板载的LED与KEY ,恰好为GPIO的学习提供了条件,板载的3个LED和2个按键的电路见图14所示。
图14 原理图
具体的引脚连接关系为:
LEDR----PH0
LEDY----PH1
LEDG----PH2
SW2 ----PG15
SW3 ----PF11
以按键SW2控制LEDY,按键SW3控制LEDG的程序为:
#include <rtconfig.h>
#include <rtdevice.h>
#include <drv_gpio.h>
#define LEDR NU_GET_PININDEX(NU_PH, 0)
#define LEDY NU_GET_PININDEX(NU_PH, 1)
#define LEDG NU_GET_PININDEX(NU_PH, 2)
#define K2 NU_GET_PININDEX(NU_PG, 15)
#define K3 NU_GET_PININDEX(NU_PF, 11)
int main(int argc, char **argv)
{
#if defined(RT_USING_PIN)
int counter = 0;
rt_pin_mode(LEDR, PIN_MODE_OUTPUT);
rt_pin_mode(LEDY, PIN_MODE_OUTPUT);
rt_pin_mode(LEDG, PIN_MODE_OUTPUT);
rt_pin_mode(K2, PIN_MODE_INPUT);
rt_pin_mode(K3, PIN_MODE_INPUT);
while (1)
{
rt_pin_write(LEDR, PIN_HIGH);
if(rt_pin_read(K3)==0)rt_pin_write(LEDY, PIN_HIGH);
else rt_pin_write(LEDY, PIN_LOW);
if(rt_pin_read(K2)==0) rt_pin_write(LEDG,PIN_HIGH);
else rt_pin_write(LEDG, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(LEDR, PIN_LOW);
rt_thread_mdelay(500);
}
#endif
return 0;
}
经编译,其结果如图15所示。
图15 编译结果
在按下按键后,则会发现相应的LED灯熄灭,否则会处于点亮状态。
有了使用GPIO口的基础,后续这可以进行相应外设的显示功能,如OLED屏的显示等。
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3213432-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。