新唐NUC980使用记录(5.10.y内核):在用户应用中使用GPIO

目的

GPIO是最基础的外设,使用频率也非常高,这篇文章将简单体验在NUC980 Liunx用户应用中使用GPIO功能。

这篇文章中内容均在下面的开发板上进行测试:
《新唐NUC980使用记录:自制开发板(基于NUC980DK61YC)》

开发板中提供了两组共四个直连到GPIO口上的轻触按钮和发光二极管,可以方便地进行GPIO功能测试:
在这里插入图片描述

这篇文章是在下面文章基础上进行的:
新唐NUC980使用记录(5.10.y内核):访问以太网(LAN8720A) & 启用SSH

使用参考与演示

使用参考

在用户应用中使用GPIO完全可参考之前的文章:
新唐NUC980使用记录:在用户应用中使用GPIO

根据上面文章这里用到的几个GPIO口编号换算如下:
PB13 = 32 x 1(PA) + 13 = 45
PF10 = 32 x 5(PA/PB/PC/PD/PE) + 10 = 170
PE10 = 32 x 4(PA/PB/PC/PD) + 10 = 138
PE12 = 32 x 4(PA/PB/PC/PD) + 12 = 140

存在的问题

前面的文章中有一些引脚和其它功能有冲突,通过修改内核选项来避开冲突。这篇文章中因为 5.10.y内核 默认使用设备树了,所以通过修改设备树来处理该问题。首先尝试下看看会有哪些引脚有冲突:
在这里插入图片描述

可以看到除了 PF10 ,其它引脚都被占用了。

问题定位

查看内核目录下 arch/arm/boot/dts/nuc980.dtsi 文件,可以看到相关引脚引用情况:
在这里插入图片描述

上面 pins = < ... > 中每一行代表一个 pin 。每个 pin 第一个值表示第几组,GPIOA = 0、GPIOB = 1、GPIOC = 2,以此类推;第二个值表示这组的第几个口,这里0xD=13,结合前面的这个 pin 就是 PB13 ;第三个值表示 multi-function ,可以看到这里等于2,和前面冲突信息中一致。

在这里插入图片描述

可以看到 PB13 默认是被用于 外部中断2 了。

同样方法我们可以找到 PE10 和 PE12 :
在这里插入图片描述
在这里插入图片描述

可以看到PE10和PE12被usbh_ehci占用了。

修改设备树

定位到问题之后就可以处理的,这里修改我们使用的设备树文件 nuc980-dev-v1.0.dts

# cd ~/nuc980-sdk/NUC980-linux-5.10.y/
gedit arch/arm/boot/dts/nuc980-dev-v1.0.dts

内容修改要点如下(完整的文件可以参考本文结尾):

/ {
	apb {
		gpio: gpio@b0004000 {
			pinctrl-0 = <>;
			eint2-config = <0 0 0>;
			eint3-config = <0 0 0>;
		};
	};
	ahb {
		usbh_ehci@b0015000 {
			pinctrl-0 = <>; /*disable PWREN and OVC*/
			ov_active = <1>; /*disable PWREN and OVC*/
			status = "okay";
		};
	};
};

修改完成后编译:

# 设置编译工具链
# export ARCH=arm; export CROSS_COMPILE=arm-buildroot-linux-gnueabi-
# export PATH=$PATH:/home/nx/nuc980-sdk/buildroot-2023.02/output/host/bin

# 编译生成设备树文件
make dtbs

# 编译完成后拷贝到电脑上再拷贝到SD卡中
# sudo cp arch/arm/boot/dts/nuc980-dev-v1.0.dtb /media/sf_common/

# 我这里开发环境和开发板在同一局域网中,所以可以直接通过网络将dtb文件拷贝到开发板上
# 在开发板中挂载boot分区
# mount /dev/mmcblk0p1 /mnt/
# 在ubuntu中使用scp命令拷贝dtb文件到开发板上
# scp arch/arm/boot/dts/nuc980-dev-v1.0.dtb root@192.168.31.142:/mnt/
# 拷贝完成后重启开发板即可测试
# reboot

使用测试

使用的方式参考之前文章即可,这里稍微演示下几个引脚的导出,证明前面调整确实解决了冲突:
在这里插入图片描述

总结

GPIO是最基础的外设,使用频率非常高,同时在用户应用中使用GPIO也是比较简单的,基础的使用参考上面这些内容就差不多了。

设备树文件内容

/*
 * Device Tree Source for NUC980 DEV board
 *
 * Copyright (C) 2018 Nuvoton Technology Corp.
 *
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following locations:
 *
 * http://www.opensource.org/licenses/gpl-license.html
 * http://www.gnu.org/copyleft/gpl.html
 */
/dts-v1/;

#include "nuc980.dtsi"

/ {
	model = "Nuvoton NUC980 DEV V1.0";
	compatible = "nuvoton,nuc980-dev-v1.0", "nuvoton,nuc980";

	chosen {
		bootargs = "console=ttyS0,115200n8 noinitrd rootfstype=ext4 root=/dev/mmcblk0p2 rw rootwait mem=64M";
	};

	apb {
		uart1: serial@b0071000 {
			status = "disabled";
		};

		uart2: serial@b0072000 {
			status = "disabled";
		};

		uart3: serial@b0073000 {
			status = "disabled";
		};

		uart4: serial@b0074000 {
			status = "disabled";
		};

		uart5: serial@b0075000 {
			status = "disabled";
		};

		uart6: serial@b0076000 {
			status = "disabled";
		};

		uart7: serial@b0077000 {
			status = "disabled";
		};

		uart8: serial@b0078000 {
			status = "disabled";
		};

		uart9: serial@b0079000 {
			status = "disabled";
		};

		can0: can@b00a0000 {
			status = "disabled";
		};

		can1: can@b00a1000 {
			status = "disabled";
		};

		rtc: rtc@b0041000 {
			status = "disabled";
		};

		gpio: gpio@b0004000 {
			pinctrl-0 = <>;
			eint2-config = <0 0 0>;
			eint3-config = <0 0 0>;
		};

		nadc: nadc@b0043000 {
			status = "disabled";
		};

		pwm0: pwm@b0058000 {
			status = "disabled";
		};

		pwm1: pwm@b0059000 {
			status = "disabled";
		};


		etimer0: etimer0@b0050000 {
			status = "disabled";
		};

		etimer1: etimer1@b0050100 {
			status = "disabled";
		};

		etimer2: etimer2@b0051000 {
			status = "disabled";
		};

		etimer3: etimer3@b0051100 {
			status = "disabled";
		};

		i2c0: i2c0@b0080000 {
			status = "disabled";
		};

		i2c1: i2c1@b0081000 {
			status = "disabled";
			pinctrl-0 = <&pinctrl_i2c1_PB>;
		};


		i2c2: i2c2@b0082000 {
			status = "disabled";
			pinctrl-0 = <&pinctrl_i2c2_PB>;
		};

	};

	ahb {

		usbh_ehci@b0015000 {
			pinctrl-0 = <>; /*disable PWREN and OVC*/
			ov_active = <1>;/*disable PWREN and OVC*/
			status = "okay";
		};
		usbh_ohci@b0017000{
			status = "okay";
		};

		usbdev@b0016000 {
			status = "okay";
		};

		fmi@b0019000 {
			status = "disabled";
		};

		sdh@b0018000 {
			status = "okay";
		};

		emac0@b0012000 {
			status = "okay";
		};
		emac1@b0022000 {
			status = "disabled";
		};
		ccap0@b0024000 {
			status = "disabled";
		};
		i2c_gpio0: i2c-gpio-0 {
			status = "disabled";
		};
		ccap1@b0014000 {
			status = "disabled";
		};
		i2c_gpio1: i2c-gpio-1 {
			status = "disabled";
		};
		dma@b0008000 {
			status = "okay";
		};

		i2s: i2s@b0020000 {
			status = "disabled";
		};

		i2s_pcm: i2s_pcm {
			status = "disabled";
		};

		sound {
			compatible = "nuvoton,nuc980-audio";
			i2s-controller = <&i2s>;
			i2s-platform = <&i2s_pcm>;
			status = "disabled";
		};
		ebi: ebi@b0010000 {
			status = "disabled";
		};
	};
};
NuTiny-SDK-M451开发板简介: NuMicro:registered: M451系列是基于ARM Cortex:registered:-M4内核一代32位的微控制器,含有浮点运算单元和DSP的Cortex:registered:--M4内核,最高可运行至72 MHz,内建128K/256K字节FLASH存贮器、32K字节SRAM,快速USB OTG、CAN和其它外设单元。宽工作电压(2.5V ~ 5.5V),工业级温度(-40℃ ~ 105),内置22.1184MHz晶振(在25℃,5V时精度1%),可配置Data Flash,强抗干扰性(ESD 8KV、EFT 4KV),封装类型有LQFP48、LQFP64和LQFP100。应用领域可以用于工业自动化、PLCs、变频器、智能家居、安防系统、数据采集、USB应用、智能卡读卡器、马达控制等应用领域。 许多系统级外设功能,如I/O 端口、 EBI (外部总线接口)、 PDMA ( 外设 DMA) 、 Timer 、 PWM 、看门狗定时器、窗口看门狗定时器、 RTC 、 UART 、智能卡接口、 SPI 、 I2C 、 I2S 、 CAN 2.0 、 USB 2.0 全速控制器、 EADC 、 DAC 、模拟比较器、循环冗余计算单元,都已经被集成在NuMicro:registered: M451系列,以减少系统外围元器件数量,节省电路板空间和系统成本.这些功能使NuMicro:registered: M451系列适用于广泛应用。 此外,NuMicro:registered: M451系列带有ISP(在系统编程)、ICP(在电路编程)和IAP(在应用编程)功能,允许用户无需取下芯片,直接在电路板上对程序存储器进行升级。 实物展示: 内核特点: ARM Cortex:registered:-M4 内核最高可运行到 72 MHz 支持带硬件除法器的 DSP 扩展功能 支持 IEEE 754 兼容浮点运算单元 (FPU) 支持内存保护单元 (MPU) 一个 24 位系统定时器 支持通过 WFI 和 WFE 指令进入低功耗睡眠模式 单周期 32 位硬件乘法器 支持可编程嵌套中断控制器 (NVIC)16 级优先级 支持可编程屏蔽中断 内建 LDO, 支持从 2.5V 到 5.5V 的宽电压操作 外设功能: 支持 I/O 端口、 EBI (外部总线接口)、 PDMA ( 外设 DMA) 、 Timer 、 PWM 、看门狗定时器、窗口看门狗定时器、 RTC 、 UART 、智能卡接口、 SPI 、 I2C 、 I2S 、 CAN 2.0 、 USB 2.0 全速控制器、 EADC 、 DAC 、模拟比较器、循环冗余计算单元 NuMicro M451基本系列选型指南: https://www.nuvoton.com/hq/products/microcontrollers/arm-cortex-m4-mcus/m451-base-series/?__locale=zh NuMicro M451M系列(M051管脚兼容)选型指南: https://www.nuvoton.com/hq/products/microcontrollers/arm-cortex-m4-mcus/m451m-series/?__locale=zh NuMicro M452 USB系列选型指南: https://www.nuvoton.com/hq/products/microcontrollers/arm-cortex-m4-mcus/m452-usb-series/?__locale=zh NuMicro M453 CAN系列(CAN+USB)选型指南: https://www.nuvoton.com/hq/products/microcontrollers/arm-cortex-m4-mcus/m453-can-series/?__locale=zh 附件内容包括: 1. 开发环境(包括Keil RVMDK评估版、IAR EWARM评估版以及Coocox) 2. 程序范例 3. 开发板电路原理图、PCB源文件、BOM、gerber文件 4. 开发数据(包括Datasheet、Product Brief、Technical Reference Manual) 5. Nuvoton公用程序(包括ICP、ISP、NuGang Programmer等等) 6. 学习教材 7. 应用手册 8. NuMicro选型表 NuTiny-SDK-M451开发板原理图和PCB截图,PCB用PADS9.5导入打开: 实物购买链接:https://detail.tmall.com/item.htm?spm=a22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值