拿到这块绿油油的板子,似乎跟之前的开发板并没有啥区别,但打开例程之后就感觉到一阵来自外太空的透心凉。因为前面一直都是在使用Arduino的环境进行学习,还没有其他环境的编程经验。这个块板子的MCU是Arm Cortex-M4 Processor with FPU,光看名字这么长就知道很厉害。
一、Vscode 环境搭建。
按照官方Vscode指引,可以使用Vscode 开展工作。
https://github.com/Analog-Devices-MSDK/VSCode-Maxim
注意: 并没有文档中的 所说的 “open setting json”这里选了 open user settings (JSON)
(1)指向工作路径,最主要的修改内容。
{
// There may be other settings up here...
"MAXIM_PATH":"C:/MaximSDK", // Only use forward slahes '/' when setting this path!
"update.mode": "manual",
"extensions.autoUpdate": false,
// and/or other settings down here...
}
(2)修改settings.json
(3)运行上传任务
打开项目后,可通过终端>运行生成任务...或快捷键Ctrl+Shift+B使用4个可用的生成任务。
二、featherwing 扩展板
https://www.seeedstudio.com/Grove-Shield-for-Wio-Lite-p-4156.html
由于手上有很多grove接口的传感器,于是在网上找到了一款兼容的grove扩展板。但是插上主板后,原本正常运行的程序就终止了,异常诡异。
这个扩展板PWR一直是接地的,所以导致强行关机,解决办法简单粗暴,把该处已经焊接好的,引脚掰断,即可正常使用。
三、GPIO使用
根据Arduino系列及esp32系列开发板的学习经验,最基础入门是要获得gpio的控制权,学习和了解各个引脚的功能。与Arduino运行方式对比,控制一个引脚只需要知道引脚的编号即可”digitalWrite(pin,HIGH)”,而maxin这里对应的引脚需要两个信息,一个端口,一个引脚,例如P2_0,P2_1,P2_2,对应的是RBG_LED的引脚,一个端口下可以有多个引脚,这样的管理方式。 基于上面的理解就可以顺利的入门GPIO例程了。 原本例程的功能是:连续扫描P1_7(SW2)引脚,然后将该引脚上读取的任何值输出到P2_0(RGB LED中的红色LED)。在P0_2(SW1)上设置中断,P0_9在该中断发生时切换。在这里实验了通过引脚控制外部的器件,而不是继续使用板载原生的器件,更加深刻地理解GPIO的运行机理,实验使用了一个双键按钮,一个震动执行器,两个器件均为grove接口可以非常便利的接在扩展板上。
#define MXC_GPIO_PORT_INTERRUPT_IN MXC_GPIO2
#define MXC_GPIO_PIN_INTERRUPT_IN MXC_GPIO_PIN_4 //(AIN4)
// #define MXC_GPIO_PORT_INTERRUPT_STATUS MXC_GPIO2
// #define MXC_GPIO_PIN_INTERRUPT_STATUS MXC_GPIO_PIN_1
#define MXC_GPIO_PORT_INTERRUPT_STATUS MXC_GPIO2
#define MXC_GPIO_PIN_INTERRUPT_STATUS MXC_GPIO_PIN_7 //(TX)
将按键设置为P2_4,中断响应GPIO为P2_7,(对应开发板管脚说明在扩展板上找到对应grove接口,把传感器接上。
三、guiLite移植
GuiLite是一个开源的Gui框架,只依赖于一个头文件(GuiLite.h),不需要很复杂的文件管理,代码量平易近人,GuiLite由5K行C++代码编写,单片机上也能流畅运行
其最低的硬件运行要求:
24MHZ | 29KB | 9KB |
且GuiLite有很强的跨平台性
- 支持的操作系统:iOS/macOS/WatchOS,Android,Linux(ARM/x86-64),Windows(包含VR),RTOS… 甚至无操作系统的单片机
- 支持的开发语言:C/C++, Swift, Java, Javascript, C#, Golang…
- 支持的第3方库:Qt, MFC, Winforms, CoCoa…
1.step1
K:\MaximSDK\Libraries\MiscDrivers\Display
在tft_ili9341.c 库文件中构造 MXC_TFT_Pixel 函数。
void MXC_TFT_Pixel(int pixelX, int pixelY, uint32_t color)
{
pixel(pixelX, pixelY, color);
}
在tft_ili9341.h 中声明 void MXC_TFT_Pixel(int pixelX, int pixelY, uint32_t color) 函数
这样就可以在 main.c里面为guiLite提供一个画图的数据接口:
//画点函数接口
void gfx_draw_pixel(int x, int y, unsigned int rgb)
{
// OLED_DrawPoint(x,y,rgb);
// MXC_TFT_WritePixel(x, y,1, 1, rgb);
}
//画面函数(未使用)
void gfx_draw_fill(int x, int y,int w, int h, unsigned int rgb)
{
MXC_TFT_WritePixel(x, y,w, h, rgb);
}
//创建一个函数指针结构体
struct EXTERNAL_GFX_OP
{
void (*draw_pixel)(int x, int y, unsigned int rgb);
void (*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb);
} my_gfx_op;
extern void startHelloCircle(void* phy_fb, int width, int height, int color_bytes, struct EXTERNAL_GFX_OP* gfx_op);
//设定延时函数接口
void delay_ms(int milli_seconds)
{
//HAL_Delay(milli_seconds);
MXC_Delay(MSEC(milli_seconds));
}
int main(void)
{
#if defined(BOARD_FTHR_REVA)
// Wait for PMIC 1.8V to become available, about 180ms after power up.
MXC_Delay(200000);
#endif
/* Enable cache */
MXC_ICC_Enable(MXC_ICC0);
/* Set system clock to 100 MHz */
MXC_SYS_Clock_Select(MXC_SYS_CLOCK_IPO);
SystemCoreClockUpdate();
#ifdef BOARD_FTHR_REVA
#ifdef ENABLE_TFT
/* Initialize TFT display */
MXC_TFT_Init(MXC_SPI0, 1, NULL, NULL);
TFT_Feather_test();
#endif
#endif // #ifdef BOARD_FTHR_REVA
//传递函数指针
my_gfx_op.draw_pixel = NULL; //gfx_draw_pixel
my_gfx_op.fill_rect = gfx_draw_fill;//gfx_draw_fill;
//启动画圆
startHelloCircle(NULL, 320, 240, 1, &my_gfx_op);
}
Step2 (非常重要,放在其他地方不起作用)
将例程放到src文件夹中。
例程已放代码包里,也可以到官方网站去查看使用移植说明。
Step3.
貌似没有编译Unicode.cpp文件。
需要在 Makefile文件里面,补充 ".cpp" 文件 编译。
总结:!
对于本项目真正的内容只做了对于一个新上手的开发板进行原始的探索,还有很多功能没有开发。任务没有很好地完成,只能找个理由来背锅,我想肯定是疫情,把我重金购买的主板,显卡,cpu,天各一方,然后中毒后,状态不佳,昏昏浩浩的没有战斗,等我恢复了点元气,已经11点59分了。
充分吸取经验,实验需要及时总结,不然到最后都忘了当初是怎么实现的,目标不能太高,每天进步一点就好!
代码:
链接:https://pan.baidu.com/s/11HKzp0rWlUQAewbXwR88kg?pwd=anyh
提取码:anyh