管脚复用
管脚复用指一个引脚具有多种功能,可以在不同时刻使用不同的功能(时分复用),需要通过配置寄存器来开关芯片外部引脚和内部引脚的连接。
引脚内部情况
引脚 | 寄存器值 | 引脚功能 |
PA1 | 0x00 | GPIO |
0x01 | UART_RX | |
0x10 | PWM |
设置GPIO模式
若要将PA1设置成GPIO模式
首先,需要查询手册找到PA1的寄存器地址,设地址为 0x120F0218
上表中的类似数据也可以在手册查找,GPIO功能寄存器要设置为0x00。可以直接设置该地址值为0x00。
有些芯片手册不会直接告诉该引脚的寄存器地址,会告诉你寄存器基地址,这时候要更具手册告诉的基地址+偏移去设置寄存器
可以看到寄存器基地址为 0xFE030000 ,上图中的引脚要设置为GPIO_0_0使用,就要设置 0xFE030000 + 0x20基地址偏移后地址上的值 ,图中 2..0 是表示该地址下第第0位到第2位,这三位上的数据表示该引脚的复用模式。
但是不能直接往 0xFE030020 地址设置0x0,这样设置会把其他位的值全部置0.
因此,先读取 0xFE030020 地址上的值,假设读出来的值是 0x26fea113。
我们要设置的是前面3位设置为0,第0位到第2位占了3位,要将其置0。111B = 0x7,在第0位开始,所以左移 0 位, (0x7 << 0)。取反~(0x7)即其他位都为1,低3位变0,11111…..111000B。和0x26fea113 进行&运算,就仅仅只会改变低三位的值。
0x26fea113 = 00100110111111101010000100010011B
unsigned int val = 0x26fea113;
val &= ~(0x7 << 0);
得到 val = 0x26fea110
将0x26fea110写入寄存器就完成了设置该引脚复用为GPIO_0_0。
设置X_I2S2_MCLK
那设置成X_I2S2_MCLK怎么设置呢?
设置该复用模式,需要将这寄存器上这三位设置为0x3 = 011B
分步来
unsigned int val = 0x26fea113;
//将第三位置0,
val &= ~(0x1 << 3);
//val = 0010 0110 1111 1110 1010 0001 0001 0011 & 1111 1111 1111 1111 1111 1111 1111 1011
//将第一位第二位置1
val |= 0x3 << 0;
//val = 00100110111111101010000100010011 | 0x11
此时得到的val = 0x26fea113;
将0x26fea113写入寄存器就完成了设置该引脚复用为X_I2S2_MCLK。