关于wujian100 SDK中GPIO的调试问题

2023-05-16

学习笔记

    • 问题一:引脚电平不稳定
    • 问题二:进入GPIO中断后出不来

第一次在CSDN写博客,用来记录一些学习笔记,小白一只,如有不足之处望大家多多理解和指导!

分享一下关于关于wujian100 SDK中GPIO的调试问题,SDK的源代码链接这里就不放了,相信出现bug的朋友肯定都会人手一份源代码了。

实现声明,我个人觉得源代码有问题,经过我的修改后,调试是成功。(咋也不敢说是源代码的错,也是是自己理解有误,毕竟自己是小白)

在这里先放GPIO源代码的主函数部分代码吧,便于参考:

#include <stdio.h>
#include "soc.h"
#include "drv_gpio.h"
#include "pin_name.h"
#include "pin.h"

volatile static bool int_flag = 1;

static void gpio_interrupt_handler(int32_t idx)
{
    int_flag = 0;
}

void example_pin_gpio_init(void)
{
    drv_pinmux_config(EXAMPLE_GPIO_PIN, EXAMPLE_GPIO_PIN_FUNC);
}

void gpio_falling_edge_interrupt(pin_name_e gpio_pin)
{
    gpio_pin_handle_t pin = NULL;

    example_pin_gpio_init();

    printf("please change the gpio pin %s from high to low\r\n", EXAMPLE_BOARD_GPIO_PIN_NAME);
    pin = csi_gpio_pin_initialize(gpio_pin, gpio_interrupt_handler);

    csi_gpio_pin_config_mode(pin, GPIO_MODE_PULLNONE);
    csi_gpio_pin_config_direction(pin, GPIO_DIRECTION_INPUT);
    csi_gpio_pin_set_irq(pin, GPIO_IRQ_MODE_FALLING_EDGE, 1);

    while (int_flag);

    int_flag = 1;
    csi_gpio_pin_uninitialize(pin);
    printf("gpio falling_edge test passed!!!\n");
    printf("test gpio successfully\n");
}

/*****************************************************************************
test_gpio: main function of the gpio test

INPUT: NULL

RETURN: NULL

*****************************************************************************/
int example_gpio(pin_name_e gpio_pin)
{
    gpio_falling_edge_interrupt(gpio_pin);
    return 0;
}

int main(void)
{
    return example_gpio(EXAMPLE_GPIO_PIN);
}

还有就是工程文件图:
Alt

问题一:引脚电平不稳定

这个问题其实很简单,开发板XC7A200T的工作频率有20MHz,线路之间有很强的电路干扰。
当引脚悬空时,如果芯片工作在恶劣的环境下(如有电磁干扰)或者刚上电期间电源供电不稳定,引脚的电平值就会产生波动,这就是不确定信号。
神奇地,我用读引脚电平函数获取到的电平值是个周期的波动值周期在5s左右,以前玩32的时候还真没遇到过。
所以需要上下拉电阻,但是wujian100平台的FPGA源代码可能并没有内部上下拉的设计,所以代码中的这句
csi_gpio_pin_config_mode(pin, GPIO_MODE_PULLNONE);并无任何作用,最终还是需要自己外接上下拉电阻,电平才会真正稳定。

问题二:进入GPIO中断后出不来

首先要明白出不来的原因:中断标志位不清除, 结果是完成中断处理程序后, 它就继续再进中断, 根本不会回到主程序。
那么中断标志位在哪,怎么清楚?要了解到两个寄存器

  • 中断状态寄存器
    当产生对应中断时,这里的寄存器对应标志位会置1
    在这里插入图片描述
    注意:其绝对地址为60018040
  • 中断清除寄存器
    给它写1,中断状态寄存器的标志位会清0
    在这里插入图片描述
    注意:其绝对地址为6001804C
    绝对地址可以通过看数据手册查看!
    那么问题来了
    isr.c->ATTRIBUTE_ISR void GPIO0_IRQHandler(void)->wj_oip_gpio_irqhandler(0);->gpio_irq_clear(gpio_pin_priv, (1 << i));中的这个GPIO中断清楚函数本该具有清楚函数这个功能,但是实际上见过我的调试发现,(代码步骤没错)中断清除寄存器虽为只写寄存器但实际上,根本写不进数据,所以产生中断后并不能通过这个函数有效地清楚中断位。

我一度接近奔溃,本以为无路可走。。。
后来意外地发现中断状态寄存器不仅可读而且可以写,这一切和数据手册说的完全不一样,所以我个人认为数据手册不对应FPGA的源程序。
除此之外经过调试还发现一个特点,要想直接改中断状态寄存器的数据,得暂时把中断关掉,改了中断状态寄存器数据后再打开。
总上所述可以得到解决方案:

  1. wj_oip_gpio.h中先把寄存器INTSTATUS改为__IOM
__IOM  uint32_t INTSTATUS;      /* Offset: 0x010 (R)    Interrupt status of Port */	//IM
  1. isr.c->ATTRIBUTE_ISR void GPIO0_IRQHandler(void)->wj_oip_gpio_irqhandler(0);中把gpio_irq_clear(gpio_pin_priv, (1 << i))替换成以下代码
gpio_pin_handle_t pin = (gpio_pin_handle_t *)&gpio_pin_handle[pin_idx];
gpio_irq_disable(pin);
gpio_control_reg->INTSTATUS = 0;//注意:这是把所有的中断位都清除
gpio_irq_enable(pin);			

这样应该是不会产生跳不出中断的问题了,不知道代码有没有总结漏,但思路没毛病。

但至今仍有一个奇怪的疑问就是,为什么源测试代码就可以跳出中断一次。感觉主要还是引脚的不稳定和寄存器的共同毛病造成的,导致眼见不一定为实。今天先记录到这里,至少程序是按预期正常工作了,关于这个问题有空再深入理解,以上只是为了给各位朋友在遇到类似问题时提供一个想法,谢谢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于wujian100 SDK中GPIO的调试问题 的相关文章

  • 安装 SDK 后如何配置 Android 模拟器

    我正在尝试在我的 64 位 Ubuntu 12 04 发行版上启动并运行 Android 模拟器 首先 我必须安装 ia32 libs 来解决我在之前 失败的 尝试中遇到的一些早期问题 然后我下载并安装了 64 位 Linux 发行版 我导
  • 将 Android CheckBox 设置为不同的图像...然后返回原始图像

    我正在使用以下 非常常见 代码来更改 Android 应用程序中的复选框图像 mCheck CheckBox findViewById R id chkMine mCheck setButtonDrawable R drawable my
  • 以编程方式更改 iOS 锁定屏幕

    我正在构建一个应用程序 它必须能够在 iPhone 锁定屏幕上显示我自己的视图 我见过很多应用程序可以让你自定义锁屏等等 这些都是应用程序商店应用程序 所以我猜它一定是可能的 我只是不知道在 iOS SDK 中使用什么来尝试实现这个 哦 还
  • 从内核模块向用户空间通知 GPIO 中断[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一段代码可以检测内核模块中的 GPIO 中断 现在 我正在寻找一种机制 在检测到来自内核模块的 gpio 中断时通知用户空间 任何与不同选项
  • 在实际设备中安装.apk文件仅用于测试

    我想在实际设备上测试我的应用程序 那么我该如何进行呢 它是附件吗sign in并使用zipalign为此目的 或者它们在准备发布我的申请时有用吗 有没有办法在不使用 eclipse 的情况下在实际设备上测试我的应用程序 下载并安装安卓软件开
  • 如何自动加载键盘(iOS SDK)?

    非常简单的问题 我得到一个由两个文本字段组成的视图 当视图加载时 我希望键盘自动弹出并聚焦第一个字段 我怎么做 在代码中 在 IB 中 多谢 芥末 In your viewDidAppear 方法调用 yourTextField becom
  • Windows 7 OCR API

    我一直在审查 Office 2007 MODI OCR 的替代品 OneNote 2010 解决方案的质量 结果低于 2007 我注意到 一旦您安装了可选 tiff 过滤器 http technet microsoft com en us
  • 捕获Like按钮的点击事件

    我正在尝试订阅 赞 按钮点击 这是我的代码 div div
  • GPIO-Hog声明的目的和用途

    问题 其目的和用例是什么gpio hog宣言 可以从用户空间连接 占用 的 GPIO 引脚吗 如果 占用 GPIO 引脚无法与用户空间交互 那么是否有任何机制可以在 dts 文件中配置 GPIO 引脚以进行用户空间交互 背景 我正在尝试配置
  • Python使用sudo启动时找不到模块

    我有一个使用 Google Assistant 库的脚本 并且必须从那里导入一些模块 我发现这只适用于 Python 虚拟环境 这真的很奇怪 在同一个文件夹中 我有一个使用 GPIO 引脚并且必须使用 root 的脚本 它们相互交互 因此当
  • NSOperation、观察者和线程错误

    我有一个问题NSOperation和观察员 I ve a tabbarcontroller and a splashController 我想要启动画面加载并下载文件 并在下载文件时使tabbarcontroller出现在屏幕上 问题是我有
  • 未收到从 MFMailComposer 发送的附件

    我正在尝试在 iPad 上发送一封带有 csv 附件的电子邮件 我根据下面显示的许多示例使用 MFMailComposer 发送电子邮件时 我可以在 MFMailComposer 窗口中看到正确的文件附件 但是当我收到电子邮件时 没有附加任
  • 如何使用Android SDK插件?

    任何人都可以分享一些开发新 SDK 附加组件 例如 Google 地图 API 的详细信息吗 我没有找到有关如何构建新 SDK 附加组件的任何详细信息 使用 SDK 插件连接到 Twitter Facebook YouTube 应用程序是个
  • Android SDK 管理器未安装组件

    不确定我在这里做错了什么 我安装了 Android SDK Manager 现在正在尝试安装 Android Dev 网站建议的平台 单击安装后 我收到一条错误消息 指出管理器无法在 Android 目录中创建临时文件夹 所以我创造了它 现
  • 如何设置IntelliJ IDEA项目SDK

    我刚刚安装了 IntelliJ IDEA 当我尝试创建我的第一个项目时 它要求我设置项目 SDK 当我单击 JDK 时 它要求我选择 JDK 的主目录 如下图所示 我无法找到它在哪里 对于新项目 选择 jdk 的主目录 eg C Java
  • Beaglebone Black 上的 GPIO

    我目前遇到了 Beaglebone black GPIO 引脚的问题 我正在寻找一种正确的方法来读取 C 中的 GPIO 引脚 p8 4 的值 如果我理解正确的话 我尝试使用一个库 该库使用了在引入设备树之前不支持的旧方法 我尝试寻找其他解
  • Android SDK 构建工具、平台工具和工具是什么?应该使用哪个版本?

    我知道这是一个非常基本的问题 但令我惊讶的是 我找不到任何有关 Android SDK Build tools 的文档 除了 Android SDK 工具和 Android SDK 平台工具之外 还有一堆 Android SDK 构建工具
  • android studio 错误:缺少功能:WATCH

    我尝试在我的智能手表上使用 android studio 运行一个简单的应用程序 并收到以下消息 我的智能手表运行 Android 4 4 2 其 API 级别为 19 我尝试过但没有帮助的事情 将最低 SDK 版本更改为 API 19 r
  • 无法启动 UI Automator 查看器

    我无法启动 UI Automator 查看器 任何人都可以帮助我吗 我怎样才能启动它 当我双击 uiautomatorviewer 一段时间时 黑色窗口打开但自动关闭 即使我在 Windows 路径变量中设置了变量 ANDROID HOME
  • 如何将我的应用程序的目标 API 级别从 23 更改为 26

    当我尝试将我的应用程序上传到 Google Play 控制台时遇到问题 API 级别必须为 26 而我的应用程序刚刚使用 23 版本开发 现在我不知道如何从 23 更改此 API 版本到 26 使其正常工作 请帮帮我 Steps Go to

随机推荐

  • RestTemplate和Feign的区别

    文章目录 1 远程调用方法 xff08 RestTemplate和Feign xff09 1 RestTemplate简单的远程调用原型2 Feign远程调用 1 远程调用方法 xff08 RestTemplate和Feign xff09
  • PostgreSQL创建物化视图并刷新

    1 创建物化视图 视图hnqyhxv person CREATE MATERIALIZED VIEW hnqyhxv person TABLESPACE sys default as SELECT FROM E PRI PERSON WHE
  • java实现判断当前时间,是否在指定时间范围

    目录 文章目录 java实现判断当前时间 xff0c 是否在三月的最后一个星期日到十月的最后一个星期六1 问题提出2 问题解决 java实现判断当前时间 xff0c 是否在三月的最后一个星期日到十月的最后一个星期六 1 问题提出 事情是这样
  • 记一次activiti审批意见字段乱码问题

    目录 文章目录 记一次activiti审批意见字段乱码问题问题描述解决思路1 数据源连接配置问题2 检查数据库存储字段是否乱码3 查看部署环境的编码4 程序启动命令直接指定编码方式 记一次activiti审批意见字段乱码问题 问题描述 项目
  • KEIL MDK平台 S3C2440 汇编语言软件仿真

    KEIL MDK平台 S3C2440 汇编语言软件仿真 KEIL MDK平台 S3C2440 汇编语言软件仿真建立工程 xff0c 编辑汇编语言程序编译链接源程序调试博客同款例程https download csdn net downloa
  • matlab 语法_MATLAB中的语法

    matlab 语法 The syntax is the method by which the programmer give various commands to the system or the software These com
  • 什么是SSR/SSG/ISR?如何在AWS上托管它们?

    概述 在这篇文章中 xff0c 我们将讨论如何在AWS上运行SSR SSG ISR以及App Runner的魅力 内容 我们将首先分别解释传统和现代网络应用 接下来 xff0c 我们将介绍如何在AWS上托管SSR SSG ISR 传统网络应
  • 一篇让你上手mysql安装以及my.ini配置

    mysql目前已经作为我们常用的数据库了 xff0c 今天我们学习来安装一下它 1 下载 从官网上下载安装包 xff08 也可以公众号回复mysql可以获取 xff09 https dev mysql com downloads mysql
  • ESP8266型号、下载、接线、烧录等怕忘总结

    ESP8266型号 下载 接线 烧录等怕忘总结 1 不同模块参数 下载接线等 xff08 1 xff09 ESP01 xff08 2 xff09 ESP01S xff08 3 xff09 ESP07 xff08 4 xff09 ESP07S
  • github下载慢

    方法一 xff1a 从GitHub下载文件一直非常慢 xff0c 查看下载链接发现最终被指向了Amazon的服务器 xff0c 下载地址是 http github cloud s3 amazonaws com xff0c 从国内访问Amaz
  • 再次安装Arch Linux!(Vmware,KDE\Gnome桌面,EFI/BIOS引导,双系统配置)更新时间2018/11/11

    1 下载Arch Linux镜像 下载地址 xff1a https xff1a www archlinux org download 可以看到一个磁力一个种子 xff0c 任意下载一个并使用支持的下载软件进行镜像的下载 2 1 xff08
  • ozone调试

    对于keil编译的工程没法用gdb调试 xff08 我没发现方法 xff09 xff0c 那就用Ozone调试 xff0c 官网 https www segger com products development tools ozone j
  • pat1068

    对于计算机而言 xff0c 颜色不过是像素点对应的一个 24 位的数值 现给定一幅分辨率为 M N 的画 xff0c 要求你找出万绿丛中的一点红 xff0c 即有独一无二颜色的那个像素点 xff0c 并且该点的颜色与其周围 8 个相邻像素的
  • windows7系统下如何升级powershell(2.0升级到3.0版本)

    最近在使用vagrant命令时提示2 0的版本不支持需要升级powershell操作如下 查看本机powershell版本号 开始 运行 xff0c 输入powershell进入命令行窗口 在命令行中输入 PSVersionTable PS
  • python+pytesseract 中文识别

    继写了第一篇 包含验证码识别的自动化登录脚本后在一次与朋友聊天中谈到中文识别 想起Tesseract OCR是有这个包的 xff0c 然后我就搞了搞 coding 61 utf 8 from PIL import Image import
  • Codeforces1153A-Serval and Bus(数学)

    原题链接 xff1a http codeforces com contest 1153 problem A 题目原文 xff1a A Serval and Bus time limit per test 1 second memory li
  • tinode登录流程

    登录 交互消息 out是客户端发出 in是客户端接收 客户端发出hi消息 里面主要包括了版本 ua lang消息out span class token punctuation span span class token punctuati
  • While(true)无限循环

    while true 作为无限循环 xff0c 经常在不知道循环次数的时候使用 xff0c 并且需要在循环内使用break才会停止 run 方法中基本都会写while true 的循环 xff0c 如下 xff1a public class
  • python 判断两个字符串的相似度

    import difflib import Levenshtein def get equal rate 1 str1 str2 return difflib SequenceMatcher None str1 str2 quick rat
  • 关于wujian100 SDK中GPIO的调试问题

    学习笔记 问题一 xff1a 引脚电平不稳定问题二 xff1a 进入GPIO中断后出不来 第一次在CSDN写博客 xff0c 用来记录一些学习笔记 xff0c 小白一只 xff0c 如有不足之处望大家多多理解和指导 xff01 分享一下关于