CH582F GPIO读取不到电平值

CH582F GPIO读取不到电平值

CH582F使用EC11编码器,PA8 PA9两个脚读不到电平值

去除了复杂的中断处理等,就剩下如下最简单的GPIO读取操作也读不出来

????GPIOA_ModeCfg(GPIO_Pin_8,?GPIO_ModeIN_Floating);
????GPIOA_ModeCfg(GPIO_Pin_9,?GPIO_ModeIN_Floating);

????while(1)
????{
????????EC11B?=?GPIOA_ReadPortPin(GPIO_Pin_8);
????????Uart0_printf("B?%d\r\n",?EC11B);
????????EC11A?=?GPIOA_ReadPortPin(GPIO_Pin_9);
????????Uart0_printf("A?%d\r\n",?EC11A);
????????DelayMs(100);
????}

以上操作读出来的PA8 PA9 都是0?

但是下降沿中断是可以正常触发的,万用表测量电压也有3.3V,说明内部的上拉电阻有在生效


换了两片芯片都是一样的现象


但是PA5 PA4就可以正常读取到高低电平


以下是原理图

1675426346431219.png

1675426346168279.png


想问一下有大佬知道是什么原因导致的吗,以及该怎么处理,谢谢


贴在开发板试一下

int main( ){
  GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_PD); //设置模式 下拉输入
  GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeOut_PP_5mA); //设置模式 输出
  GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PD); //配置GPIO中断
  GPIOA_ITModeCfg(GPIO_Pin_12, GPIO_ITMode_HighLevel);
  PFIC_EnableIRQ( GPIO_A_IRQn );
  while(1)
  {
    //输入
    PRINT("%x\n",GPIOB_ReadPortPin(GPIO_Pin_7)); //读取电平状态
    //输出
    GPIOB_ResetBits(GPIO_Pin_10); //高低电平翻转
    mDelaymS(5);
    GPIOB_SetBits(GPIO_Pin_10);
    mDelaymS(5);
  }
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOA_IRQHandler(void)
{
  GPIOA_ClearITFlagBit(GPIO_Pin_12);
  printf("Inter\n");
}



跑2#的代码是正常的,我测试了一下,

直接串口打印GPIO读取到的电平值是正常的

Uart0_printf("%x\n",GPIOA_ReadPortPin(GPIO_Pin_8));

但是像这样用一个变量获取GPIO电平值后再打印,打印出来的一直是0

        uint8_t EC11B;
        EC11B = GPIOA_ReadPortPin(GPIO_Pin_8);
        Uart0_printf("B %x\r\n", EC11B);

这是什么原因


GPIOA_ReadPortPin

返回的是int,32位,你定义的uint8_t是8位,类型转换时信息丢失


只有登录才能回复,可以选择微信账号登录