Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
GPIO
Numaker-IoT-M487
UART
【开发板评测】Nuvoton M487 GPIO和UART评测
发布于 2022-04-24 11:15:32 浏览:1169
订阅该版
##1 前言 感谢RT-Thread联合Nuvoton发起的开发板评测任务挑战活动,提供了很好的了解RT-thread和Nuvton产品的机会。本人领取了GPIO+UART的测试任务,本文介绍了评测任务的完成情况,针对自己领取的功能模块介绍了功能模块的硬件、 功能模块的使用说明、外设性能指标测试、给出了已完成模块功能的演示和视频。以及可编译下载的代码链接。 介绍了测试过程中遇到问题及解决过程。 ##2 硬件资源介绍 借用一下官方对开发板的介绍文档上的图片如下图,可以看到资源相当丰富。 ![硬件资源.jpg](https://oss-club.rt-thread.org/uploads/20220424/d40cfc8f72a70323dfa6de8529dd5b17.jpg.webp) 根据本次测试任务,重点针对GPIO和UART的功能进行了测试。后面再逐步对其他资源试用一下,以对此器件有更深了解,为后续项目应用奠定基础。 ##3 GPIO测试 ##3.1 输入和中断触发 利用板上2个按键测试GPIO输入模式和中断模式。根据电路图确定2个按键对应引脚为PF.11和PG.5: ![339eb2aa32e228b07f97f60875bf8c1c.jpg.webp](https://oss-club.rt-thread.org/uploads/20220424/339eb2aa32e228b07f97f60875bf8c1c.jpg.webp) ``` /* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2022-04-24 Withitech the first version */ #include
#include
#include
#include
#define STACK_SIZE 512 #define THREAD_PRIORITY 25 #define TIMESLICE 5 #define BTN1 NU_GET_PININDEX(NU_PF, 11) #define BTN2 NU_GET_PININDEX(NU_PG, 5) /* 中断回调函数 ---------------------------------------------------------------------------- */ static void btn1_callback(void *args) { char *str = args; rt_kprintf("BTN1 pressed. %s\n", str); } /* 中断回调函数 ---------------------------------------------------------------------------- */ static void btn2_callback(void *args) { char *str = args; rt_kprintf("BTN2 pressed. %s\n", str); } /* irq线程入口函数 -------------------------------------------------------------------------*/ static void irq_thread_entry(void *parameter) { /* 配置BTN1引脚为上拉输入 */ rt_pin_mode(BTN1, PIN_MODE_INPUT_PULLUP); /* 绑定中断回调函数,下降沿模式,回调函数参数为字符串"--By Jone" */ rt_pin_attach_irq(BTN1, PIN_IRQ_MODE_FALLING, btn1_callback, (void*)"--By Jone"); /* 使能引脚中断 */ rt_pin_irq_enable(BTN1, PIN_IRQ_ENABLE); /* 配置BTN2引脚为上拉输入 */ rt_pin_mode(BTN2, PIN_MODE_INPUT_PULLUP); /* 绑定中断回调函数,下降沿模式,回调函数参数为字符串"--By Jone" */ rt_pin_attach_irq(BTN2, PIN_IRQ_MODE_FALLING, btn2_callback, (void*)"--By Jone"); /* 使能引脚中断 */ rt_pin_irq_enable(BTN2, PIN_IRQ_ENABLE); } /* 主函数 ----------------------------------------------------------------------------------*/ int gpio_int_init(void) { /* 定义线程句柄 */ rt_thread_t tid; /* 创建动态pin线程 :优先级 25 ,时间片 5个系统滴答,线程栈512字节 */ tid = rt_thread_create("irq_thread", irq_thread_entry, RT_NULL, STACK_SIZE, THREAD_PRIORITY, TIMESLICE); /* 创建成功则启动动态线程 */ if (tid != RT_NULL) { rt_thread_startup(tid); } return 0; } INIT_APP_EXPORT(gpio_int_init); ``` ###3.2 GPIO 输出 经典的点灯测试了,代码如下: ``` #include
#include
#include
/* defined the LEDR pin: PH0 */ #define LEDR NU_GET_PININDEX(NU_PH, 0) #define LEDY NU_GET_PININDEX(NU_PH, 1) #define LEDG NU_GET_PININDEX(NU_PH, 2) int main(int argc, char **argv) { #if defined(RT_USING_PIN) int counter = 0; /* set LEDR1 pin mode to output */ rt_pin_mode(LEDR, PIN_MODE_OUTPUT); rt_pin_mode(LEDY, PIN_MODE_OUTPUT); rt_pin_mode(LEDG, PIN_MODE_OUTPUT); while (counter++ < 10) { rt_pin_write(LEDR, PIN_HIGH); rt_thread_mdelay(50); rt_pin_write(LEDR, PIN_LOW); rt_thread_mdelay(50); } counter = 0; while(1){ rt_pin_write(LEDR, PIN_HIGH); rt_thread_mdelay(50); rt_pin_write(LEDY, PIN_HIGH); rt_thread_mdelay(50); rt_pin_write(LEDG, PIN_HIGH); rt_thread_mdelay(50); rt_pin_write(LEDR, PIN_LOW); rt_thread_mdelay(50); rt_pin_write(LEDY, PIN_LOW); rt_thread_mdelay(50); rt_pin_write(LEDG, PIN_LOW); rt_thread_mdelay(500); } #endif return 0; } ``` ##4 UART测试 ###4.1 串口资源 看TMR芯片共有10个硬件串口资源,官方库代码提供了UART0-2的初始化 需要对UART3-7和uuart0-uuart1共7个串口进行初始化 UART0 -- FINSH 调试串口 UART1 -- ESP8266 WIFI模块串口 UART2 -- MikroBUS 串口 其余串口利用Arduino接口的引出脚进行分配,对照TMR说明分配如下图: ![串口分配.jpg](https://oss-club.rt-thread.org/uploads/20220424/8d783f1f2a838a99559ead4814f9507d.jpg.webp) 在RT-Thread Settings页面中使能所有串口,如下图所示: ![打开所有串口设置.jpg](https://oss-club.rt-thread.org/uploads/20220424/9a30616ead295cafb9b265e7b2acb2a4.jpg.webp) ###4.2 完善代码 在nutool_pincfg.c中增加引脚初始化代码,将引脚功能设置为串口模式。 ``` #if defined(BSP_USING_UART0) void nutool_pincfg_init_uart0(void) { SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB13MFP_Msk | SYS_GPB_MFPH_PB12MFP_Msk); SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB13MFP_UART0_TXD | SYS_GPB_MFPH_PB12MFP_UART0_RXD); return; } void nutool_pincfg_deinit_uart0(void) { SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB13MFP_Msk | SYS_GPB_MFPH_PB12MFP_Msk); return; } #endif #if defined(BSP_USING_UART1) void nutool_pincfg_init_uart1(void) { SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH9MFP_Msk | SYS_GPH_MFPH_PH8MFP_Msk); SYS->GPH_MFPH |= (SYS_GPH_MFPH_PH9MFP_UART1_RXD | SYS_GPH_MFPH_PH8MFP_UART1_TXD); return; } void nutool_pincfg_deinit_uart1(void) { SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH9MFP_Msk | SYS_GPH_MFPH_PH8MFP_Msk); return; } #endif #if defined(BSP_USING_UART2) void nutool_pincfg_init_uart2(void) { SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE15MFP_Msk | SYS_GPE_MFPH_PE14MFP_Msk); SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE15MFP_UART2_RXD | SYS_GPE_MFPH_PE14MFP_UART2_TXD); return; } void nutool_pincfg_deinit_uart2(void) { SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE15MFP_Msk | SYS_GPE_MFPH_PE14MFP_Msk); return; } #endif #if defined(BSP_USING_UART3) void nutool_pincfg_init_uart3(void) { SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC9MFP_Msk | SYS_GPC_MFPH_PC10MFP_Msk); SYS->GPC_MFPH |= (SYS_GPC_MFPH_PC9MFP_UART3_RXD | SYS_GPC_MFPH_PC10MFP_UART3_TXD); return; } void nutool_pincfg_deinit_uart3(void) { SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC9MFP_Msk | SYS_GPC_MFPH_PC10MFP_Msk); return; } #endif #if defined(BSP_USING_UART4) void nutool_pincfg_init_uart4(void) { SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk); SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA2MFP_UART4_RXD | SYS_GPA_MFPL_PA3MFP_UART4_TXD); return; } void nutool_pincfg_deinit_uart4(void) { SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk); return; } #endif #if defined(BSP_USING_UART5) void nutool_pincfg_init_uart5(void) { SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk); SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA4MFP_UART5_RXD | SYS_GPA_MFPL_PA5MFP_UART5_TXD); return; } void nutool_pincfg_deinit_uart5(void) { SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk); return; } #endif #if defined(BSP_USING_UART6) void nutool_pincfg_init_uart6(void) { SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC11MFP_Msk | SYS_GPC_MFPH_PC12MFP_Msk); SYS->GPC_MFPH |= (SYS_GPC_MFPH_PC11MFP_UART6_RXD | SYS_GPC_MFPH_PC12MFP_UART6_TXD); return; } void nutool_pincfg_deinit_uart6(void) { SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC11MFP_Msk | SYS_GPC_MFPH_PC12MFP_Msk); return; } #endif #if defined(BSP_USING_UART7) void nutool_pincfg_init_uart7(void) { SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB8MFP_Msk | SYS_GPB_MFPH_PB9MFP_Msk); SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB8MFP_UART7_RXD | SYS_GPB_MFPH_PB9MFP_UART7_TXD); return; } void nutool_pincfg_deinit_uart7(void) { SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB8MFP_Msk | SYS_GPB_MFPH_PB9MFP_Msk); return; } #endif void nutool_pincfg_init_usci0(void) { SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk); // SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC13MFP_Msk); SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA9MFP_USCI0_DAT1 | SYS_GPA_MFPH_PA10MFP_USCI0_DAT0); // SYS->GPC_MFPH |= SYS_GPC_MFPH_PC13MFP_USCI0_CTL0; return ; } void nutool_pincfg_deinit_usci0(void) { SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk); // SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC13MFP_Msk); return ; } void nutool_pincfg_init_usci1(void) { SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB6MFP_Msk | SYS_GPB_MFPL_PB7MFP_Msk); // SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC13MFP_Msk); SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB6MFP_USCI1_DAT1 | SYS_GPB_MFPL_PB7MFP_USCI1_DAT0); // SYS->GPC_MFPH |= SYS_GPC_MFPH_PC13MFP_USCI0_CTL0; return ; } void nutool_pincfg_deinit_usci1(void) { SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB6MFP_Msk | SYS_GPB_MFPL_PB7MFP_Msk); // SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC13MFP_Msk); return ; } ``` ###4.3 多串口测试 编译通过后,在finsh命令窗口输入list_device,查看注册的串口设备,如下图所示: ![10个串口设备列表.jpg](https://oss-club.rt-thread.org/uploads/20220424/c36f1bccb989e3f78c5fe137880a56c2.jpg.webp) 依次测试串口2-7,uuart0,1,测试结果如下: UART3 ![uart3.jpg](https://oss-club.rt-thread.org/uploads/20220424/545c6e47e23d6bfa480c79feed6edbf9.jpg) UART4 ![uart4.jpg](https://oss-club.rt-thread.org/uploads/20220424/2d9bbcd8176fbfb0e697f0c0bc0b0e09.jpg) UART5 ![uart5.jpg](https://oss-club.rt-thread.org/uploads/20220424/e2400ad08d502c552fab091883cea1c1.jpg) ###4.4 存在问题 UART6,UART7 串口测试未正常工作,原因未知。看手册未发现这两个串口和UART2-5有何不同。初始化代码也完全一样,但就是这2个串口没有反应。希望高手或厂家技术支持能指导一下。 ##5 Wifi模块联网功能测试 顺带测试了WIFI模块联网功能,ping命令结果如下: ![ping.jpg](https://oss-club.rt-thread.org/uploads/20220424/d988543330266e28b0b1bdff266efa0e.jpg) ##6 代码下载链接 [M487_UART_GPIO.zip.001](https://oss-club.rt-thread.org/uploads/20220504/58a02ad67fef01c7aadcf07162704ca5.001) [M487_UART_GPIO.zip.002](https://oss-club.rt-thread.org/uploads/20220504/531233fcb1a625c477d7d24c06d14320.002) 文件压缩后超过20M了,故分成2个包,2个文件一起解压。 ##7 视频演示 审核中
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
witsoft
嵌入式攻城狮
文章
2
回答
1
被采纳
0
关注TA
发私信
相关文章
1
drivers- pin
2
bsp 里面的drivers/gpio.c 少了一个功能
3
stm32f407移植RTT中gpio设备驱动问题
4
config PB4(NJTRST) to GPIO
5
RT-Thread的GPIO设备驱动问题
6
关于pin.c文件中语句可能出现的bug
7
RT-Thread学习笔记--线程创建与官方Pin设备驱动调用
8
【应用笔记】小白也能玩转RT-Thread之通用GPIO设备【官方出品
9
串口引脚定义中的GPIO_Pin_sources是社么意思?
10
RTT -GPIO 使用例程
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部