0015:如何将晶振引脚变成GPIO使用?【洋桃技术支持】
问:
我想把STM32F103单片机中的4个晶振引脚复用成普通GPIO,但发现PC14、PC15在程序中设置为推挽输出之后,却不能使用,不能向其他GPIO一样驱动LED点亮。请问是哪里没有设置对?为什么?
答:
如【图1】所示,STM32F103单片机在LQFP48封装中共有4个引脚是与外部晶振连接的,其中3、4脚连接32.768KHz晶振,5、6脚连接8MHz晶振。另外第2脚虽然没有连接晶振,但它的复用功能也与RTC有关。这5个引脚在上电时默认为外部晶振功能,但也可以通过程序复用到GPIO功能,复用的IO接口组是PC和PD,这两组GPIO在48脚单片机并没有整组引出来,只有100脚及以上单片机中才能使用整组的PC和PD。那么这里只有从2脚到6脚的PC13、PC14、PC15、PD0、PD1接口。
【图1】单片机晶振相关接口
接下来我们打开《STM32F103X8-B数据手册(中文)》文档,在手册第17页可以找到如【图2】所示的引脚定义图表。这里面写明了定义的编号和功能。请注意在“引脚名称”一列中,PC13、PC14、PC15的上角标有“(4)”,这是对其进行特别说明的标注。表示我们可以在表格的下方找到一系列注意文字,其中第4个说明就是关于这3个GPIO的说明。于是表格下方的说明文字如【图3】所示,第4条对PC13、PC14、PC15的说明是:
4. PC13,PC14和PC15引脚通过电源开关进行供电,而这个电源开关只能够吸收有限的电流(3mA)。因此这三个引
脚作为输出引脚时有以下限制:在同一时间只有一个引脚能作为输出,作为输出脚时只能工作在2MHz模式下,
最大驱动负载为30pF,并且不能作为电流源(如驱动LED)。
其中可以看出这3个IO并不同于普通的IO接口,它在内部的供电电源比较特别,当工作在灌电流状态时,最大的吸收电流只有3mA。这是很小的电流呀,因为正常的IO接口都能吸收20mA的电流。另外,当这3个引脚用于推挽输出时,不能作为电流源。意思是不能对外输出大电流。而LED灯正是很常用的电流驱动器件。所以这3个IO接口如果接了LED灯,设置推挽输出不能做电流源,设置灌电流模式只能吸收3mA电流,这个小的电流LED根本不会亮。
所以说回答最初的问题,PC13、PC14、P15这3个IO接口本身性能就确定了不能驱动LED,只能做电平通信或电平输入。不过PD0和PD1接口的性能要比前3个接口要强很多,可见【图3】中的第8条,PD0和PD1如果要输出时只能工作在50MHz的速度下,但其他的性能则和普通PA、PB组接口一样。也就是说PD0和PD1可以驱动LED灯。
大家如果在使用IO接口时出现问题,请先查看《数据手册》和《参照手册》,仔细阅读标注的说明,里面能有很多重要的信息,如果没有关注到可能会导致因认识不到而无法解决问题。
【图2】数据手册中的引脚定义
【图3】对晶振引脚的特别说明