STM32F103R8T6 PB3 作拨码开关输入时无效的原因和处理方法

  • 整理之前公司前人留下的代码时,检查出诸多错误,其实做嵌入式程序员是很严谨的事,但很可惜,接触到大多的程序员都很随性,可能跟这个浮躁的时代有关,看代码写得好不好,看注释就可以了解十之八九。切入正题: 作为拨码开关输入信号,最简单就是将IO设置成弱上拉,免上拉电阻。GPIO模式设置如下:
    gpio_conf.GPIO_Mode  = GPIO_Mode_IPU;

    同时使用的有PB3、PB4、PB5。完成编译后测试发现PB3对应的开关没有响应,让拨码开关悬空,用万用表测电压PB3只有2~3百毫伏,其他引脚都可以达到3V以上,开始怀疑芯片、线路有问题,换了几块板故障相同,判断应该是软件问题。

  • 上网查了一下,发现很多人都遇到了这个问题,主要原因是PB3默认情况下是JATG的JTDO引脚,原理图上可清楚的标示为:PB3/JTDO。所以要把PB3做普通GPIO必须功能复用,那么无法使用JATG调试了。我们使用的是SWD调试所以没有影响,网上给出的解决方案是:1、需要开启APB2总线上的 AFIO 和 GPIOB 时钟。2、关闭JTAG调试开启SWD调试。
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE); 
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

    在设置GPIO的代码前加入以上两行,编译下载后测试PB3做普通GPIO使用正常,把第一行注释掉测试也是可以正常工作。代码如下:

        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, 
        ENABLE); 
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
        gpio_conf.GPIO_Pin   = GPIO_Pin_3;
        GPIO_Init(GPIOB, &gpio_conf);

     

你可能感兴趣的:(STM32F103R8T6 PB3 作拨码开关输入时无效的原因和处理方法)