关于SPI GPIOA端口配置代码中11U等参数含义的技术咨询
STM32 SPI GPIO配置代码疑问及C语言数据类型解答
首先看你提供的配置代码:
GPIOA->CRL |= (11U<<20); // PA5 SCK AF output push pull GPIOA->CRL |= (11U<<28); // PA7 MOSI AF output push pull
1. 11U的含义
11U里的11是十进制整数,对应的二进制是1011;后缀U是C语言的无符号整数标识,用来声明这个常量是unsigned int类型,而非默认的signed int有符号整数。
2. 11是不是十进制3的二进制表示?
不是。十进制3的二进制是11,而代码里的11是十进制数值,二进制为1011,两者是完全不同的数值,不要混淆。
3. 数值11与PA5 SCK的关联
STM32的GPIO配置寄存器(以GPIOA->CRL为例,负责PA0-PA7引脚的配置)中,每个引脚占用4个连续的比特位,用于设置引脚的工作模式和速率:
- PA5是第5个引脚(从PA0开始计数),对应的寄存器位是第20-23位(计算方式:4位/引脚 × 5引脚 = 20起始位)
- 这4位的定义:高两位(23、22)是
CNF5(配置模式),低两位(21、20)是MODE5(输出速率)CNF5=10:表示复用功能推挽输出(SPI的SCK是外设复用引脚,必须配置此模式才能让外设控制引脚输出)MODE5=11:表示输出速率为50MHz(SPI时钟需要较高速率,选最高档)
- 把
CNF5=10和MODE5=11组合起来,就是二进制1011,对应十进制的11,所以用11U<<20将这个配置值写入PA5的对应位,实现SPI1_SCK引脚的正确配置。
4. 偏移量28与PA7 MOSI的关联
PA7是第7个引脚,对应的寄存器起始位是4位/引脚 ×7引脚=28,也就是GPIOA->CRL的28-31位。PA7是SPI1的MOSI引脚,同样需要复用推挽输出+50MHz速率的配置,因此用11U<<28将相同的配置值写入PA7的对应位,完成引脚功能配置。
5. 关于C语言数据类型的补充
- 整数常量的后缀:
U(或u)表示无符号整数,默认的整数常量是signed int。在寄存器操作中优先使用无符号类型,是因为寄存器的位操作是基于无符号二进制数据的,无符号整数不会出现符号扩展问题(比如有符号数最高位为1时,右移会补1,导致位值错误),能保证位操作结果符合预期。 - 如果你想让代码更直观,可以把
11U写成0b1011U(需要编译器支持二进制字面量,比如GCC、ARMCC),直接体现4位配置位的二进制含义,和十进制11是等价的。
内容的提问来源于stack exchange,提问作者Stan woldes
相关产品推荐
相关产品推荐

