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);

     

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值