最近,在做一块继电器控制的板子(stm32f103),通过采集数据,数据分析,做出判断,控制继电器开/闭状态,遇到一个很简单确经常容易忽略的问题;蜂鸣器驱动IO电压始终在1V左右,导致9013s无法导通,无法形成回路,蜂鸣器没工作,原理如下:
最开始,一直没考虑程序的问题,担心偏置电阻有问题,也排除过是三极管损坏,,反复焊接测试,均会出现无法导通,最后,改用Pmos来驱动,但是依然无效;当时很疑惑,单片机IO控制肯定没问题,初始化完全OK,但是最后在反复审视电路图的时候发现,IO使用的PA15,截图如下:
好吧,原来默认是JTAG功能,换句话说它不是一般的IO,需要做重新映射!
问题确认了,开始改:
涉及函数如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); // 注意!词语局会导致无法烧写,禁用了jtag swd;如果仍想继续烧写,需要将boot0拉高,boot1拉低,此时,可以烧写做更改;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //最终锁定使用次函数来实现普通IO功能,第一JTAG不常用,禁用了不影响,并且保留了SWD烧写模式,因此,作为最佳初始化PA15的途径;
最后,感慨一下,做了很多年硬件,当你有一天突然发现一个蜂鸣器居然不想了,真的是会开始质疑自己的设计,质疑自己的一切认知,有种重新再去看电路分析的冲动! 搞定后~~~ 继续码农生涯