基于i.MX6ULL的掉电检测设计与软件测试

发表时间:2023-11-09 09:30

基于i.MX6ULL的掉电检测设计与软件测试

基于i.MX6ULL平台设计实现掉电检测功能,首先选择一路IO,利用IO电平变化触发中断,在编写驱动时捕获该路GPIO的中断,然后在中断响应函数中发送信号通知应用程序掉电发生了。

3.png

1.1掉电信号IO

       驱动代码:

#include<linux/module.h>

#include<linux/init.h>

#include<linux/types.h>

#include<linux/fs.h>

#include<linux/mm.h>

#include<linux/cdev.h>

#include<linux/errno.h>

#include<linux/sched.h>

#include<linux/device.h>

#include<asm/io.h>

#include<asm/switch_to.h>

#include<asm/uaccess.h>

#include<asm/gpio.h>   

#include<linux/interrupt.h>

#include<linux/irq.h>


#definepower_MAJOR 200

staticstruct class *my_class;

staticstruct fasync_struct *fasync_queue; //异步通知队列

#defineGPIO_NUM 1   //中断引脚为:GPIO1_1

staticunsigned int irq_num;


                                                                                         

/* 打开 */

intpower_open(struct inode *inode,struct file *filp){

         return 0;

}

/* 关闭 */

intpower_release(struct inode *inode,struct file *filp){

         return 0;

}

ssize_tpower_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos){

         return count;

}

ssize_tpower_write(struct file *file,const char __user *buf,size_t count,loff_t*f_pos){

         return count;

}

staticint my_fasync(int fd, struct file * filp, int on)

{

    int retval;

   retval=fasync_helper(fd,filp,on,&fasync_queue);

    /*将该设备登记到fasync_queue队列中去*/

    if(retval<0)

      return retval;

    return 0;

}


staticconst struct file_operations simple_fops={

         .owner=THIS_MODULE,

         .open=power_open,

         .release=power_release,

    .read=power_read,

         .write=power_write,

    .fasync=my_fasync,

};

/* 在中断服务函数中向应用层发送消息-异步通知 */

staticirqreturn_t irq_callback (int irqno, void *dev_id){

                  printk("irq power-detectworking !\n");

                  if (fasync_queue) {

            kill_fasync(&fasync_queue, SIGIO,POLL_IN);

                  }

         return IRQ_HANDLED;

}

intpower_init_module(void){

         int rtn;

         int ret;

         /* 注册设备驱动 */

         ret =register_chrdev(power_MAJOR,"power-detect-test",&simple_fops);

         if(ret<0){

                  printk("Unable toregister character device %d!/n",ret);

                  return ret;

         }

         /* 自动创建设备节点 */

         my_class = class_create(THIS_MODULE,"my_class");

         device_create(my_class, NULL,MKDEV(power_MAJOR, 0), NULL,"powerdetect");

         

         /*gpio申请*/

         rtn = gpio_request(GPIO_NUM,"my_irq");

         if(rtn!=0){

                  printk("my_irq irq pinrequest io failed.\n");

         }

         rtn = gpio_direction_input(GPIO_NUM);

         if(rtn<0){

                  printk("gpio_direction_input()failed !\n");  

         }

         /*获取gpio中断号*/

         irq_num = gpio_to_irq(GPIO_NUM);

         

         /*GPIO中断服务函数注册,*/                    /*下降沿触发*/               

         rtn = request_irq(irq_num,irq_callback,IRQF_TRIGGER_FALLING,"my_irq", NULL);

         if (rtn<0) {

                  printk("my_irq requestirq false\n");

         } else {

                  printk("my_irq requestirq success: %d\n",irq_num);

         }

         

    printk("module_initsucessful!!!\n");

         return 0;

}

/* 卸载 */

voidpower_cleanup_module(void){

         /* 卸载相应的设备驱动 */

         unregister_chrdev(power_MAJOR,"power-detect-test");     

         device_destroy(my_class,MKDEV(power_MAJOR,0));

         class_destroy(my_class);

         

         /*释放GPIO*/

         gpio_free(GPIO_NUM);

    printk("module_exitsucessful!!!\n");

}

/* 宏实现 */

module_init(power_init_module);

module_exit(power_cleanup_module);

/* 开源许可声明 */  

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Zou");

应用代码:

#include<stdio.h>

#include<fcntl.h>

#include<stdlib.h>

#include<signal.h>

#include<unistd.h>

#include<fcntl.h>

staticint fd;

/* 内核产生异步通知,调用该应用层函数处理 */

voidsigterm_handler(int signo)

{

         printf("app irq work !!!\n");

}

intmain(void)

{

    int oflags;

   fd=open("/dev/powerdetect",O_RDWR);   //打开设备文件

         

    /* 启动异步通知信号驱动机制 */

    signal(SIGIO, sigterm_handler);

    fcntl(fd, F_SETOWN, getpid());

    oflags = fcntl(fd, F_GETFL);

    fcntl(fd, F_SETFL, oflags | FASYNC);

         

    /*建立一个死循环,防止程序结束 */

    while(1)

    {

        printf("sleep\n");

        usleep(200000);   //2ms

    }

         

    close(fd);

    return 0;

}

将驱动编译成模块,上电加载并执行应用程序后,将电压缓慢下调至掉电临界点。触发GPIO下降沿中断,并提供应用程序掉电信号。

4.png

1..2掉电检测


文章列表
RK3506 AMP简介及万象奥科AMP方案介绍RK3506是瑞芯微公司推出的一款高性能处理器,该芯片采用三核Cortex-A7与单核Cortex-M0的异构设计,A7核主频可达1.5GHz,M0核可达200MHz,支持在物理隔离的核心上部署不同操作系统:A7可运行Linux系统处理复杂应用,M0核则运行RT-Thread实时系统或MCU-HAL层驱动,实现计算资源与实时性的最优配置。这种混...
样品信息产品名称:HD-RK3506G-IOT评估板(基于RK3506核心板)产品厂商:武汉万象奥科电子有限公司1. 概述1.1     试验仪器试验项目型号规格设备名称厂商校准有效期EFTEFT61004TA-2216脉冲群发生器Prima2025-10-14ESDESD61002TA静电放电发生器Prima2025-10-14EATGT-TH-S-225Z恒温恒湿试验箱高天2025-10...
RK3506,运行Linux系统,上电开机到显示界面启动完成到底有多快?基于万象奥科HD-RK3506-IoT评估板,一起看一下实测数据!测试准备:HD-RK3506-IoT评估板一套RGB接口5寸显示屏一套电源(带开关)一套上电准备,设置好录像与计时。上电开机,启动观察。启动完成!不到2秒完成界面启动!武汉万象基于瑞芯微RK3506G处理器的核心板(35mm*35mm)震撼上市,首件特价2...
工业网关(Industrial Gateway)是工业物联网(IIoT)的核心枢纽,负责连接现场设备(如PLC、传感器、仪器仪表)与云端管理系统,实现数据采集、协议转换、边缘计算等功能。瑞芯微推出的RK3506处理器,凭借多核异构架构、工业级可靠性、丰富外设接口,成为新一代工业网关的理想计算平台。本文将解析RK3506如何解决工业网关的关键需求,并探讨其典型应用场景。  一、工业网关的核心挑...
在工业自动化领域,HMI+PLC一体机正成为越来越多设备制造商的选择。这种将人机界面(HMI)和可编程逻辑控制器(PLC)集成在一起的设备,不仅节省了空间,还简化了系统架构。而要实现这样的集成设计,处理器的选择尤为关键。一、HMI+PLC一体机的核心需求现代工业设备对HMI+PLC一体机提出了更高要求:1. 实时控制能力:PLC部分需要确保控制周期在1ms以内2. 流畅的人机交互:HMI界面...
在电力自动化领域,DTU(配电终端单元)和FTU(馈线终端单元)是配电网智能化升级的核心设备。它们负责实时监测电力运行状态、快速隔离故障、优化电能分配,是保障电网稳定运行的“神经末梢”。  然而,随着智能电网的发展,传统单片机方案已难以满足多任务并行处理、高精度数据采集、低延迟通信等需求。此时,瑞芯微RK3506凭借多核异构架构、工业级可靠性、丰富外设接口,成为新一代DTU/FTU的理想计算...
这款“单片机”有些特殊!硬件资源集成了:ü   1.5GHz超高主频ü   1Gb内存、2Gb Flashü   支持2路百兆网口ü   6路串口、2路CAN FDü   MIPI与LCDü   USB、SPI、IIC、PWM、SAI、IO…软件资源支持:ü   RT-Threadü   Linuxü   RT-Thread + Linux混合部署还有一大特点:ü   支持在Windows下...
1、RK3506 CAN总线测试概述使用USBCANFD-200U测试HD-RK3506-EG1200网关的CAN接口性能与稳定性。HD-RK3506-EG1200 的CAN接口同时支持CAN2.0和CANFD模式。所以分别进行测试。2、RK3506 CAN总线测试步骤HD-RK3506-EG1200网关的CAN接口支持CAN2.0和CANFD硬件传输协议,分开测试两种硬件接口协议的收发功能...
武汉万象奥科电子有限公司
服务热线:027-59218026
销售邮箱:sales@vanxoak.com
主营产品:ARM核心板、ARM工控板
工业网关、软硬件定制设计
地址:武汉东湖新技术开发区大学园路长城园路8号海容基孵化园B5

扫描二维码
关注公众号
产品及方案咨询
专业专注   合作共赢
移动电话:181 2058 0511 (湖北)
移动电话:175 7010 9551 (华南、华中)
移动电话:133 0386 9667 (华东、华北)