imx6 开启PPS脉冲

本文详细介绍了如何开启内核PPS功能,修改设备树以配置GPIO端口,然后编译内核和设备树模块,并更新到开发板中。在重启后,通过dmesg命令检查PPS接口,并使用中断查看PPS信号。最后,编写了一个名为pps_test.c的程序,该程序会在接收到PPS信号时每秒输出一次。
摘要由CSDN通过智能技术生成

一,开启内核PPS

在这里插入图片描述

二、修改设备树

1、设置PPS使用的IO口
在这里插入图片描述
在这里插入图片描述

pinctrl_pps_pins: pps_pins {
                       	fsl,pins = <
                                MX6UL_PAD_CSI_HSYNC__GPIO4_IO20        0x17059
                        >;
                };
pps_pins {
		compatible = "pps-gpio";	//必须为pps-gpio
		pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_pps_pins>;
		gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;//必须gpios
		status = "okay";
	};

编译内核,设备树,模块,并更新开发板

三、重启开发板

1、输入:

dmesg |grep pps

在这里插入图片描述
如上图所示pps3即为设置的pps接口
在这里插入图片描述

2、查看pps中断
接上PPS信号,使用如下指令查看pps中断

date #查看日期

cat /proc/interrupts |grep pps #查看中断次数

在这里插入图片描述

四、程序测试

新建pps_test.c,接上PPS信号(1S一次)编译生成pps_test可执行文件,1S输出一次pps
在这里插入图片描述

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <poll.h>
#include <signal.h>



static int fd;
static void sig_func(int sig)
{
	int val;
	read(fd, &val, 4);
	printf("pps\n");
}

/*
 * ./pps_test /dev/pps3
 *
 */
int main(int argc, char **argv)
{
	int val;
	struct pollfd fds[1];
	int timeout_ms = 5000;
	int ret;
	int	flags;
	
	/* 1. 判断参数 */
	if (argc != 2) 
	{
		printf("Usage: %s <dev>\n", argv[0]);
		return -1;
	}

	signal(SIGIO, sig_func);

	/* 2. 打开文件 */
	fd = open(argv[1], O_RDWR);
	if (fd == -1)
	{
		printf("can not open file %s\n", argv[1]);
		return -1;
	}

	fcntl(fd, F_SETOWN, getpid());
	flags = fcntl(fd, F_GETFL);
	fcntl(fd, F_SETFL, flags | FASYNC);

	while (1)
	{
		sleep(2);
	}
	
	close(fd);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值