使用TIMER计算外部脉冲个数方法

2019年07月25日 16:30    发布者:Tronlong818
1        前言本例程介绍使用TIMER的寄存器实现最基本的定时功能,输入捕获,输入捕获模式可以用来测量脉冲宽度或者测量频率。AM335x开发板有8个32位通用定时器,DMTIMER1是用于操作系统(OS)毫秒定时器,用于操作系统时钟,DMTIMER4-DMTIMER7作为输出引脚。 图 1 例程源码位于光盘资料”Demo\pps-dmtimer\src”下。本次编译生成的设备树文件以及pps-dmtimer.ko驱动模块和脚本文件gpio.sh位于光盘资料”Demo\pps-dmtimer\bin”下。1 编译pps-dmtimer.ko驱动模块2.1        修改Makefile文件工程源码位于光盘”Demo\pps-dmtimer\src”下,将pps-dmtimer工程源码拷贝到Ubuntu任意目录下。进入pps-dmtimer工程源码目录,修改Makefile配置文件。Host#                vi Makefile 图 2 将KDIR修改为kernel源码所在目录(kernel必须已经编译过,如果没编译,可以参照用户手册下《Linux内核编译方法》来编译内核)。 图 3 2.2        修改pps-gmtimer.c文件在pps-gmtimer.c文件中添加头文件:#include "dmtimer.h"。Host#                vi pps-gmtimer.c 图 4 图 5 如下图,将timespec修改为timespec64,修改完成后保存退出。 图 6 将内核源码下的”arch/arm/plat-omap/include/plat/dmtimer.h”文件拷贝到pps-dmtimer工程源码根目录下。Host#                cp /home/tronlong/AM335x/kernel/Linux-4.4.12/arch/arm/plat-omap/include/plat/dmtimer.h ./ 图 7 2.3        编译pps-dmtimer.ko驱动执行如下指令进行编译,编译完成后在源码根目录下生成pps-dmtimer.ko驱动模块:Host#                cp /home/tronlong/AM335x/kernel/Linux-4.4.12/arch/arm/plat-omap/include/plat/dmtimer.h ./ 图 8 将生成的pps-dmtimer.ko拷贝到SD系统启动卡的boot分区。3        修改设备树(1) 修改内核源码下的设备树文件am335x-icev2.dts,添加以下Timer4节点。Host#                vi arch/arm/boot/dts/am335x-icev2.dts 图 9 添加节点:&pps_gmtimer {        status = "okay";        pinctrl-names = "default";        pinctrl-0 = <&gps_pps_pins>;}; 图 10 添加PINMUX,将开发板上的”GPIO/eHRPWM/eQEP/I2C”接口引出的GPMC_ADVN_ALE配置为TIMER4功能(GPMC_ADVN_ALE和TIMER4复用),将开发板引出的XDMA_EVENT_INTR1口配置为TCLKIN,接口以及详细配置请查阅光盘资料”Datasheet\核心板芯片\CPU”下的数据手册以及开发板底板原理图。配置如下:gps_pps_pins: gps_pps_pins {                pinctrl-single,pins = <                        AM33XX_IOPAD(0x9b4, PIN_INPUT | MUX_MODE2)   //TCLKIN                        AM33XX_IOPAD(0x890, PIN_INPUT | MUX_MODE2)   //TIMER4              >;}; 图 11 (2) 修改内核源码下设备树文件am33xx.dtsi。Host#                vi arch/arm/boot/dts/am33xx.dtsi 图 12 增加Timer4结点:pps_gmtimer:pps_gmtimer {               compatible = "pps-gmtimer";                timer = <&timer4>;                 use-tclkin = <1>;                 status = "okay";                 }; 图 13 (3) 修改am335x-icev2.dts文件,加入PINMUX。Host#                vi arch/arm/boot/dts/am335x-icev2.dts 图 14 将开发板上的”GPIO/eHRPWM/eQEP/I2C”接口引出的IO口作为脉冲输出,这里是选取GPIO1作为外部脉冲输出。gpio_pins: gpio_pins {                pinctrl-single,pins = <                        AM33XX_IOPAD(0x83c, PIN_OUTPUT | MUX_MODE7) /* (U13) GPIO1 */                >;        }; 图 15 在gpio_keys节点下加上PINMUX的说明。将pinctrl-0 = <&user_keys_default>;修改为pinctrl-0 = <&user_keys_default &gpio_pins>; 图 16 如果是eMMC的核心板,按照如上修改完成后保存退出,编译设备树,将编译生成的设备树拷贝到SD系统启动卡的”rootfs/boot”目录。如果是NAND FLASH的核心板,除了做如上修改,还需要修改am335x-icev2-nand.dts文件,因为在am335x-icev2-nand.dts中已经将GPMC_ADVN_ALE配置为了gpmc_advn_ale功能,将该配置注释掉,如下图。 图 17 修改完成后,保存退出,编译生成am335x-icev2-nand.dtb文件,将am335x-icev2-nand.dtb重命名为am335x-icev2.dtb并拷贝至SD系统启动卡的”rootfs/boot”目录。

网友评论

Tronlong818 2019年07月25日
更多帮助
销售邮箱:sales@tronlong.com       
技术邮箱:support@tronlong.com
创龙总机:020-8998-6280
技术热线:020-3893-9734
创龙官网:www.tronlong.com
技术论坛:www.51ele.net
线上商城:https://tronlong.taobao.com