寄存器配置IO输入输出
- 问题来源:移植原子哥的IIC例程时,想修改一个SDA和SCL的引脚,却发现原子哥有一部分代码使用了寄存器编程。原函数如下:
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
- 我想把这个引脚修改为PB4,原本不熟悉寄存器编程的我被强行学习了一波,接下来记录一下上面两个函数中用到的寄存器:CRL,该寄存器实际上和另外一个寄存器:CRH是一对。CRL负责管理0-7的IO口,CRH负责管理8-15的IO口,各负责了8个IO口
- 简单介绍一下这两个寄存器的使用功方法:CRL 和 CRH 控制着每个 IO 口的模式及输出速率。至于该寄存器的详细介绍在网上一搜一大堆,就不多赘述了,这里主要讲具体使用的方法
例:将该引脚修改为PB4,则修改后的程序如下(其实更规范的写法应该如注释所写)
#define SDA_IN() {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=(u32)8<<16;}
#define SDA_OUT() {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=(u32)3<<16;}
这里简单讲一下代码的使用
GPIOB->CRL&=0XFFF0FFFF;
GPIOB->CRL|=0X00800000;
GPIOB->CRL|=0X00300000;
关于JTAG引脚的使用
- 问题来源:在修改的引脚的时候,发现了PB4引脚不能正常使用
- 经过重重排障与查找手册,发现了我使用的系统板板载了JTAG调试接口,而PB4是JTAG的调试接口,默认被拉高了,所以无法输出低电平,也就不能做普通IO口使用
- 解决方法:在使用该IO口前先禁用JTAG,具体禁用方法使用下面函数:
__HAL_AFIO_REMAP_SWJ_DISABLE();
- 列出默认为JTAG调试接口的IO(使用系统板的时候多加留意原理图):PA13、PA14、PA15、PB3、PB4
|