Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
GPIO
国民技术_N32G45x
PIN_GPIO通用驱动
【N32G457】用rt_pin_get优雅的点灯
发布于 2022-01-23 19:35:20 浏览:1776
订阅该版
[tocm] # 【N32G457】用rt_pin_get优雅的点灯 元旦假期报名了[国民技术N32G457 RT-Thread设计大赛](https://club.rt-thread.org/ask/article/3236.html),7号早上收到了国民技术寄来的开发板。本文的主要内容是8号做的开箱和点灯、以及为N32G457添加rt_pin_get接口支持的过程记录(由于年底比较忙,所以鸽到今天这个才整理了这篇帖子)。 ## 开发板简单开箱 前面已经有不少小伙伴开箱过了,这里就直接贴几张图了。 包装盒很大气: ![nations-box.jpg](https://oss-club.rt-thread.org/uploads/20220123/5c14d6a40e256494e39e3c81e3b347be.jpg.webp) 打开盒子,里面是一个包装袋和一根蓝色USB线: ![n32-tip.jpg](https://oss-club.rt-thread.org/uploads/20220123/0d6c2f241d78ebe3c0f01f1c178ba30c.jpg.webp) 拆开包装袋就是开发板了: ![n32-board.jpg](https://oss-club.rt-thread.org/uploads/20220123/2a5bfac96520776939ebf326f4a22f06.jpg.webp) 可以看到,开发板上主控芯片的型号是——**N32G457VEL7**。 ## N32G457芯片简介 国民技术官网的简介: > N32G457系列 (工业互联型) 采用32-bit ARM Cortex-M4内核,集成高达512KB 片内FLASH,144KB SRAM,多达17个高性能模拟器件,18个数字通讯接口,同时集成10/100M以太网接口,数字摄像头接口,内置10余种密码算法硬件加速引擎,支持存储加密、用户分区保护、安全启动等多种安全特性,可广泛应用于网络打印机、3D打印机、门禁考勤系统、LED户外显示屏、工业小型网关、DTU、PLC、充电桩等消费及工业互联应用领域。 以及该系列不同信号芯片的参数表: ![](https://oss-club.rt-thread.org/uploads/20220714/145a21381a92069eb374f726be82e55b747ed013.jpg) 本次活动开发板的主控芯片是——**N32G457VEL7**,对照上面的表格,可以知道: 1. 片内Flash容量是512KB,片内SRAM容量是144KB; 2. CPU是ARM Cortex M4,最高频率144MHz; 3. 有80个GPIO; 其他参数也可以在表格上看到。 ## 直接通过pin id点灯 RT-Thread Studio创建项目后,简单修改一下`drv_gpio.c`和`main.c`就可以了,具体参考社区这篇帖子: [RT-Thread-国民技术N32G457 io口实验测试,流水灯RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/3294.html) 总结起来就是以下几处修改: 1. `drv_gpio.c`里面的`N32G45X_PIN_NUMBERS`宏的值修改为100; 2. `LED1_PIN`的具体数字参考`drv_gpio.c`里面`pins`数组各成员第一列的值; 3. `PB4`复位的默认功能是`JTAG`复位功能(`NJTRST`),需要重新设置才能作为`GPIO`使用; 改完的`main.c`为: ```c #include
#include
#include
#define LED1_PIN 91 // PB5 //#define LED1_PIN 90 // PB4 //#define LED1_PIN 67 // PA8 int main(void) { uint32_t Speed = 200; RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE); GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE); /* set LED1 pin mode to output */ rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED1_PIN, PIN_LOW); rt_thread_mdelay(Speed); rt_pin_write(LED1_PIN, PIN_HIGH); rt_thread_mdelay(Speed); } } ``` ## 添加rt_pin_get支持 上面的点灯已经可以正常运行了,但是总觉得手动查引脚编号使用起来不是很方便,于是想着能不能像之前的AB32那样——通过`rt_pin_get`接口查询编号?看了一眼`drv_gpio.c`发现`n32_hw_pin_init`函数里面注册的`_n32_pin_ops`没有赋值`get_pin`函数指针,那就意味着——`rt_pin_get`不能直接使用。 于是我在原有代码的基础上实现了一个简单的`n32_get_pin`,实现方式也很简单: 1. 在原有pin上下文`struct pin_index`类型中,添加一个`const char* name`成员; 2. 在`__N32_PIN`宏中,添加对`name`成员值的填充,采用宏拼接的方式实现; 3. 添加`n32_pin_get`函数,函数中遍历`pins`数组,查到`name`匹配的条目后,返回下标; 4. 将`n32_pin_get`函数绑定到`struct rt_pin_ops _n32_pin_ops `变量的`pin_get`函数指针上; 具体修改: ```diff diff --git a/Libraries/rt_drivers/drv_gpio.c b/Libraries/rt_drivers/drv_gpio.c index 87975f9..cc81bec 100644 --- a/Libraries/rt_drivers/drv_gpio.c +++ b/Libraries/rt_drivers/drv_gpio.c @@ -15,14 +15,14 @@ #ifdef RT_USING_PIN -#define N32F10X_PIN_NUMBERS 64 //[48, 64, 100, 144 ] +#define N32F10X_PIN_NUMBERS 100 //[48, 64, 100, 144 ] #define __N32_PIN(index, rcc, gpio, gpio_index) \ { \ 0, RCC_##rcc##_PERIPH_GPIO##gpio, GPIO##gpio, GPIO_PIN_##gpio_index \ -, GPIO##gpio##_PORT_SOURCE, GPIO_PIN_SOURCE##gpio_index \ +, GPIO##gpio##_PORT_SOURCE, GPIO_PIN_SOURCE##gpio_index, "P" #gpio "." #gpio_index \ } -#define __N32_PIN_DEFAULT {-1, 0, 0, 0, 0, 0} +#define __N32_PIN_DEFAULT {-1, 0, 0, 0, 0, 0, ""} /* N32 GPIO driver */ struct pin_index @@ -33,6 +33,7 @@ struct pin_index uint32_t pin; uint8_t port_source; uint8_t pin_source; + const char* name; }; static const struct pin_index pins[] = @@ -473,6 +474,23 @@ const struct pin_index *get_pin(uint8_t pin) return index; }; +rt_base_t n32_pin_get(const char *name) +{ + rt_base_t i; + + for (i = 0; i < ITEM_NUM(pins); i++) + { + if (rt_strcmp(pins[i].name, name) == 0) + { + /* in get_pin function, use pin parameter as index of pins array */ + return i; + } + } + + /* refers content of pins array, map to __N32_PIN_DEFAULT */ + return 0; +} + void n32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value) { const struct pin_index *index; @@ -754,6 +772,7 @@ const static struct rt_pin_ops _n32_pin_ops = n32_pin_attach_irq, n32_pin_dettach_irq, n32_pin_irq_enable, + n32_pin_get }; int n32_hw_pin_init(void) ``` 目前这个修改已在github提交PR,并被合并了——本人的第一个RT-Thread PR,虽然有点水。 ## 验证rt_pin_get接口 简单修改完成后,测试了一下,工作正常,终于可以优雅的点灯了: ```c #include
#include
/* defined the LED1 pin: PB5 */ #define LED1_PIN_NAME "PB.5" rt_base_t led1_pin; int main(void) { rt_uint32_t delay = 500; RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE); GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE); led1_pin = rt_pin_get(LED1_PIN_NAME); /* set LED1 pin mode to output */ rt_pin_mode(led1_pin, PIN_MODE_OUTPUT); while (1) { rt_pin_write(led1_pin, PIN_LOW); rt_thread_mdelay(delay); rt_pin_write(led1_pin, PIN_HIGH); rt_thread_mdelay(delay); } } ``` ## 点亮全部LED灯 有了`rt_get_pin`之后,点灯的程序看着舒服多了: ```c #include "n32g45x.h" #include
#include
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) static const char* led_pin_names[] = { "PB.5", "PB.4", "PA.8" }; rt_base_t led_pin_ids[ARRAY_SIZE(led_pin_names)]; int main(void) { rt_size_t i; rt_uint32_t delay = 200; RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE); GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE); for (i = 0; i < ARRAY_SIZE(led_pin_names); i++) { rt_base_t pin = rt_pin_get(led_pin_names[i]); led_pin_ids[i] = pin; rt_pin_mode(pin, PIN_MODE_OUTPUT); } while (1) { for (i = 0; i < ARRAY_SIZE(led_pin_names); i++) { rt_pin_write(led_pin_ids[i], PIN_HIGH); rt_thread_mdelay(delay); rt_pin_write(led_pin_ids[i], PIN_LOW); rt_thread_mdelay(delay); } } } ``` ## 更优雅的方式——使用RT-Thread主线代码 上面的点灯代码里面还有两行关于`JTAG`的设置,显得不太优雅,不过GitHub上已经有小伙伴修改为KConfig配置了。所以使用最新GitHub代码的话,则可以更加优雅,具体操作步骤如下: 1. 克隆RT-Thread的GitHub代码:`git clone https://github.com/RT-Thread/rt-thread.git` 2. 打开env控制台,跳转到`n32g452xx-mini-system`子目录:`cd bsp/n32g452xx/n32g452xx-mini-system/` 3. 使用`scons`命令创建`RT-Thread Studio`项目:`scons --dist-ide --project-name=n32_blink --project-path=D:\n32_blink` 4. 跳转到刚刚创建的目录内,编译:`cd D:\n32_blink; scons -j 9`
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
xusiwei1236
https://blog.csdn.net/xusiwei1236
文章
11
回答
33
被采纳
4
关注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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
3
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部