Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
GPIO
Numaker-IoT-M487
UART
【开发板评测】Nuvoton M487 GPIO和UART评测
发布于 2022-04-24 11:15:32 浏览:776
订阅该版
##1 前言 感谢RT-Thread联合Nuvoton发起的开发板评测任务挑战活动,提供了很好的了解RT-thread和Nuvton产品的机会。本人领取了GPIO+UART的测试任务,本文介绍了评测任务的完成情况,针对自己领取的功能模块介绍了功能模块的硬件、 功能模块的使用说明、外设性能指标测试、给出了已完成模块功能的演示和视频。以及可编译下载的代码链接。 介绍了测试过程中遇到问题及解决过程。 ##2 硬件资源介绍 借用一下官方对开发板的介绍文档上的图片如下图,可以看到资源相当丰富。  根据本次测试任务,重点针对GPIO和UART的功能进行了测试。后面再逐步对其他资源试用一下,以对此器件有更深了解,为后续项目应用奠定基础。 ##3 GPIO测试 ##3.1 输入和中断触发 利用板上2个按键测试GPIO输入模式和中断模式。根据电路图确定2个按键对应引脚为PF.11和PG.5:  ``` /* * 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说明分配如下图:  在RT-Thread Settings页面中使能所有串口,如下图所示:  ###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,查看注册的串口设备,如下图所示:  依次测试串口2-7,uuart0,1,测试结果如下: UART3  UART4  UART5  ###4.4 存在问题 UART6,UART7 串口测试未正常工作,原因未知。看手册未发现这两个串口和UART2-5有何不同。初始化代码也完全一样,但就是这2个串口没有反应。希望高手或厂家技术支持能指导一下。 ##5 Wifi模块联网功能测试 顺带测试了WIFI模块联网功能,ping命令结果如下:  ##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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
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
串口
LWIP
Env
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
RT-Thread
DMA
SCons
线程
MQTT
RT-Thread Nano
STM32
RTC
rt-smart
ESP8266
flash
ota在线升级
WIZnet_W5500
FAL
I2C
packages_软件包
UART
cubemx
freemodbus
潘多拉开发板_Pandora
定时器
BSP
PWM
ADC
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
SDIO
Debug
AB32VG1
MicroPython
C++_cpp
编译报错
msh
ulog
QEMU
本月问答贡献
出出啊
1500
个答案
338
次被采纳
小小李sunny
1390
个答案
276
次被采纳
张世争
715
个答案
157
次被采纳
crystal266
522
个答案
153
次被采纳
whj467467222
1216
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
12
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
2
篇文章
2
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部