本帖最后由 爱可死/X 于 2013-11-5 22:13 编辑
再发一次。刚刚打了半个小时的文字,网页一卡,啥都没了。气死了。但是本这以人为本的心,还是重新写一遍。 超核库,我选择,我喜欢。嘻嘻 刚刚遇到一个问题,I2C引脚被占用了,但是超核库里面只有四个定义 #define I2C0_SCL_PB0_SDA_PB1 (0x00040210U) //SCL-PB0 SDA-PB1 #define I2C0_SCL_PB2_SDA_PB3 (0x000c2210U) #define I2C1_SCL_PE1_SDA_PE0 (0x00001641U) #define I2C1_SCL_PC10_SDA_PC11 (0x002ca221U) 正当惆怅中,去“寻医问药”,无果,最后还是超核的编写者,亲自手把手指导了一下,才明白。现在来反哺一下,不喜勿喷谢谢。 需要先明白下面这个结构体:
typedef struct
{
uint32_t I2C_Index:4;
uint32_t I2C_GPIO_Index:4;
uint32_t I2C_Alt_Index:4;
uint32_t I2C_SCL_Pin_Index:6;
uint32_t I2C_SDA_Pin_Index:6;
uint32_t I2C_Reserved:8;
}I2C_MapTypeDef;
:后面的:N 代表位数。 很神奇的是:4+4+4+6+6+8= 32位。确实,不是巧合。 第一个 I2C_Index:4; 代表I2Cx ( x=0.1.2.……) 看芯片IIC有多少个咯 第二行:I2C_GPIO_Index:4; 代表PORTx ( x=0.1.2.……15) 刚好对应A到E 第三行:这是一个管脚映射,数据手册上有滴。 PortE iic 对应 alt = 6不信去查查看咯。 第四行: I2C_SCL_Pin_Index:6; 6位,刚好表示0-31 就是选择SCL定义为portx 的第几位。 第五行:同第四行咯。 第六行:比较有意思,是保留位。8位。毕竟这是模仿stm32的方式。所以,多出几位也很正常蛤。保留这,没准以后有用滴。 这样,我们就凑足了32位。
现在举例子蛤:{1, 4, 6, 1, 0,0}, //I2C1_SCL_PE1_SDA_PE0 1:选择 IIC1 4: 选择 portE 6:PortE iic 对应 alt = 6 1:选择PORTE.1 SCL 0: 选择PORTE.0 SDA 0: 保留位值 于是乎我们得到了这6个值。从上网下,为低到高。 现在我们从高到底排列不就是(0x00040210U)? 现在再看#defineI2C0_SCL_PB0_SDA_PB1 (0x00040210U) 懂了没? 所以要改变引脚映射,需要重设置这几个值就可以啦。理解了,也很容易的。本人第一次发表,所以不会发图,抱歉了蛤。有兴趣可以加我35157483,本人小车摄像头,有兴趣可以交流交流,伸手党就免了蛤。 好了,任务完成,再次感谢超核给我省了很多麻烦,也感谢刚刚指导我的那个朋友。再次感谢! 同时也支持超核库2.4.虽然是刚刚出,但是,非常给力! |