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用任务查询的方式实现相关功能。