CH592用PB10做GPIO输入中断问题记录

        PB10和PB22正常用作烧录,但是可以正常做GPIO口使用的,同时支持输入中断。因实际layout问题最终使用PB10做GPIO输入中断功能。

        主要功能:PB10检测充电芯片状态,并根据充电芯片状态切换芯片自身的工作模式,进行不同的任务。

        充电芯片Charg脚属于漏极输出,充电状态时会拉低呈低电平。PB10配合配置为输入上拉模式即可。读取PB10管脚状态,高电平时表示未处于充电状态,低电平状态表示当前处于充电状态。

//判断当前的PB10连接的充电芯片状态情况if (GPIOB_ReadPortPin(GPIO_Pin_10)==0){mDelaymS(2);if (GPIOB_ReadPortPin(GPIO_Pin_10)==0)//低电平,充电中{ChargingFlg=1;//正在充电//如果在程序一开始就配置中断,可能会误触发无法正常进入工作流程。//最终中断设置放在HAL任务运行之后}else{ChargingFlg=0;//没有充电		}}else{ChargingFlg=0;//没有充电	}
//HAL开启了相应的任务后再进行中断配置
if (GPIOB_ReadPortPin(GPIO_Pin_10)==0)
{mDelaymS(2);if (GPIOB_ReadPortPin(GPIO_Pin_10)==0)//低电平,充电中{GPIOB_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_HighLevel); //已经在充电了,上升沿唤醒}else{GPIOB_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_LowLevel); //已经在充电了,上升沿唤醒}
}
else
{GPIOB_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_LowLevel); //已经在充电了,上升沿唤醒
}
__INTERRUPT
__HIGH_CODE
void GPIOB_IRQHandler(void)
{//对于休眠必须要加哦SetSysClock(CLK_SOURCE_PLL_60MHz);mDelaymS(2);//可实现边沿触发if (GPIOB_ReadPortPin(GPIO_Pin_10)==0){GPIOB_ClearITFlagBit(GPIO_Pin_10);GPIOB_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_HighLevel);//相应标志位,用于判断执行相应逻辑}else{GPIOB_ClearITFlagBit(GPIO_Pin_10);GPIOB_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_LowLevel);//相应标志位,用于判断执行相应逻辑}
}

        实际调试中出现的脑水肿问题:PB10要么无法进入中断,要么各种乱触发

        最终找到问题:之前为了优化低功耗问题,将所有不需要外部触发的管脚(除了32K晶振管脚)都配置成了“关闭数字输入”。此次调试PB10作为输入中断功能时,忘记这茬了,废了半天功,真脑水肿了....R32_PIN_CONFIG2寄存器PB10对应位置配置为0则功能全通了哎,文字记载下,避免下次再犯。共勉!

 补充说明:为了进一步降低功耗,建议对寄存器R32_PIN_CONFIG2进行配置,将不需要作为输入的GPIO管脚位配置为1,即关闭数字输入。重点:若要用到X32K则PA10位务必为0!

补充测试记录:

当同时使用PB6和PB10做中断时,出现异常。

PB6输入上拉,接按键,下降沿触发,主要功能用于开机(掉电模式唤醒)和关机(标志位,程序判断标志位进入掉电模式);

PB10输入上拉,接充电芯片charg管脚,边沿触发,只要进入中断就执行软件重启;

__INTERRUPT
__HIGH_CODE
void GPIOB_IRQHandler(void)
{//对于休眠必须要加哦SetSysClock(CLK_SOURCE_PLL_60MHz);mDelaymS(1);if(((GPIOB_ReadITFlagBit(GPIO_Pin_6)>>6)&0x0001)==1)//表示有中断{GPIOB_ClearITFlagBit(GPIO_Pin_6);GPIOInturrptflg=1;}if(((GPIOB_ReadITFlagBit(GPIO_Pin_10)>>6)&0x0001)==1)//表示有中断{GPIOB_ClearITFlagBit(GPIO_Pin_10);SYS_ResetExecute();//实际发现在正常模式下,按开关键也能执行到这句。为什么?}}

进入掉电模式时配置如下:

	GPIOB_ModeCfg(GPIO_Pin_6,GPIO_ModeIN_PU ); GPIOB_ITModeCfg(GPIO_Pin_6, GPIO_ITMode_FallEdge); // 下降沿唤醒GPIOB_ModeCfg(GPIO_Pin_10,GPIO_ModeIN_PU ); GPIOB_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_FallEdge); PFIC_EnableIRQ(GPIO_B_IRQn);RTC_ModeFunDisable(0);//关闭RTC触发中断PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);DelayMs( 2 );LowPower_Shutdown(0);

实际测试发现要么开不了机,要么关不了机。总觉得问题出在了中断函数对于多个中断的处理上。

最终未解决,修改程序为PB6中断用于开关机功能,PB10用任务查询的方式实现相关功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20.LMAX-DDD的极致性能架构

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 历史起源架构目标架构要素 时序对比传统时序事件溯源时序LMAX时序 单线程非阻塞异步IO(reactor)多线程单…

Docker单机网络:解锁本地开发环境的无限潜能

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

【前端】深入解析 JavaScript 中的 instanceof 运算符与 number 数据类型 和 Number 对象 区别辨析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯理论基础:instanceof 运算符的设计初衷与核心功能基础定义与应用示例解析代码分解 💯typeof 与 instanceof:两种类型检测方法的语义与…

UI自动化测试框架:PO模式+数据驱动

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1. PO 设计模式简介 什么是 PO 模式? PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Pa…

在ensp中ACL路由控制实验

一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…

AlohaKit:一组.NET MAUI绘制的开源控件

前言 今天大姚给大家分享一组.NET MAUI绘制的开源、免费(MIT License)UI控件库:AlohaKit。 MAUI介绍 .NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运…

SpringBoot【一】零基础入门 springboot 及 idea 搭建

一、前言 springboot是什么? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解&#xff0…

Grule前端表单post后端执行grule引擎规则

Grule前端表单post后端执行grule引擎规则 编写前端表单和后端接口 编写test.go执行grule引擎规则 示例都是 go test 执行的测试代码,所以将里面的测试代码去除 由于之前 NumberExponentExample_test.go 已经验证可运行, 所以将 err 的异常处理去除 package mai…

文献补充材料怎么查找下载

最近很多同学求助问补充文献怎么查找下载,补充文献一般会在文献的详情页,参考文献的上面。需要注意以下这些词汇:Supplementary data、Supplementary material、Appendix、Supplementary Information、Appendix A. Supplementary data、suppl…

PHP语法学习(第七天)-循环语句,魔术常量

老套路了,朋友们,先回忆昨天讲的内容PHP语法学习(第六天)主要讲了PHP中的if…else语句、关联数组以及数组排序。 想要学习更多PHP语法相关内容点击“PHP专栏!” 下列代码都是在PHP在线测试运行环境中得到的!! 还记得电…

ue5 motion matching

ue5.5 gameanimationsample 先看动画蓝图 核心两个node 第一个是根据数据选择当前的pose 第二个是缓存一段历史记录,为第一个node选择的时候提供数据。 在animinstance的update方法中 每帧都更新这个函数,每帧更新trajectory的数据 看看第一个node的…

YOLO系列发展历程:从YOLOv1到YOLO11,目标检测技术的革新与突破

文章目录 前言一、YOLOv1:单阶段目标检测的开端二、YOLOv2:更精准的实时检测三、YOLOv3:阶梯特征融合四、YOLOv4:性能和速度的新平衡五、YOLOv5:易用性和扩展性的加强六、YOLOv6:工业部署的利器七、YOLOv7&…

ConcurrentLinkedQueue<>实现生产者-消费者问题理解和简易demo

1.ConcurrentLinkedQueue<> ConcurrentLinkedQueue 是 Java 中的一个线程安全的无界队列实现。它基于无锁&#xff08;lock-free&#xff09;的算法&#xff0c;采用了一个高效的、非阻塞的、可伸缩并发控制机制。这使得在高并发场景下能够实现较高的吞吐量。 无界性质…

开发 UEFI 驱动

服务型驱动的特点&#xff1a; 1&#xff09;在 Image 的入口函数中执行安装&#xff1b; 2&#xff09;服务型驱动不需要驱动特定硬件&#xff0c;可以安装到任意控制器上&#xff1b; 3&#xff09;没有提供卸载函数。 一个设备 / 总线驱动程序在安装时首先要找到对应的硬件…

java时间处理SimpleDateFormat详解

文章目录 常用构造函数日期格式模式常见用法1. 格式化日期2. 解析日期字符串 注意事项示例扩展&#xff1a;指定区域和时区 SimpleDateFormat 是 Java 中用于日期和时间格式化的类&#xff0c;属于 java.text 包。它允许开发者将日期对象格式化为字符串&#xff0c;或者将字符…

夜莺运维指南之故障自愈

注意: 夜莺v7版本已内置故障自愈, 只需要更给n9e下的config.yaml 文件有关ibex配置即可 所谓的告警自愈&#xff0c;典型手段是在告警触发时自动回调某个 webhook 地址&#xff0c;在这个 webhook 里写告警自愈的逻辑&#xff0c;夜莺默认支持这种方式。另外&#xff0c;夜莺还…

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…

python rstrip 的迷惑行为

在项目中&#xff0c;我需要把字符串末尾的一部分去掉&#xff0c;类似截断&#xff0c;我用ide的随笔提示&#xff0c;发现了rstrip这个方法&#xff0c;然后我试了下&#xff0c;满足我的需求&#xff0c;但在测试过程中&#xff0c;我发现了rstrip的一些行为很让我迷惑。 开…

计算机网络编程(Linux):I/O多路转接之 select,poll

I/O多路复用&#xff08;I/O Multiplexing&#xff09;是一种高效的网络编程技术&#xff0c;允许一个线程同时监控多个文件描述符的状态&#xff0c;当某个文件描述符就绪时进行相应处理。这种技术在高并发服务器中广泛使用。本文将介绍I/O多路复用的核心概念及在Linux中的实现…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…