昨天在想熟悉一下TFT的操作,发现其中提到对I/O口的位带操作,我小试牛刀,发现其中对I/O口的配置不是很清楚,所以我进一步了解了一下一般情况下用固件库函数对I/O口模式的设置,方便其和I/O位带操作进行一个比较。 以下是整个部分,我对其中的注释翻译过来并加入了自己的了解,用到的资料为:
(文中称资料A)STM32F10xx固件函数库(2.1.0版本)
(文中称资料B)STM32F10x微控制器参考手册(2009年12月第10版) 、
(文中称资料C)Cortex-M3权威指南CnR2(电子书)
方便大家查找 。欢迎大家提出意见。
对GPIO_Init的设置其实主要是对CRL /CRH/BRR/ODR/ 这几个寄存器的设置。设置过程:
1、对输入的参数GPIO_InitStruct的引脚还原
2、对对应位引脚设置,分为设置模式,设置频率
每个引脚设置CNF[1:0],MODE[1:0]四位
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
//调用初始化函数要求输入参量GPIO口地址指针及结构体GPIO的地址指针
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters 下面是检查是否超出该值取值范围,参见资料A P36 */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
/*---------------------------- GPIO Mode Configuration 模式配置-----------------------*/
/* 下面是所有模式的设定值
typedef enum
{
GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14, //讲解为什么输出模式中几个值这么设定0x1-表示为输入
GPIO_Mode_Out_PP = 0x10, //展开4个位分别为:00010000 B --->0x10 后4位的第1、2位表示模式,最后两位表示频率,
GPIO_Mode_AF_OD = 0x1C, // 00010100B --->0x14 这里最后两位全部为0表示保留。
GPIO_Mode_AF_PP = 0x18 // 00011000B --->0x18 参见资料B P106 表17
}GPIOMode_TypeDef; // 00011100B --->0x1C
*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
//当我们调用GPIO_Init的时候引入参量GPIO_InitStruct,其中GPIO_InitStruct->Mode
//中的模式为上面GPIOMode_TypeDef中的一种,和0x0F相与表示取相应模式的值
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
// 计算结果
:
若为0x0- ,则和(uint32_t)0x10相与后为0,对应的为输入
//
若为0x2/4/1-,当和(uint32_t)0x10相与后不为0对应为输出
// 若为输出模式进行下面的设置,为currentmode加上频率
{
/* Check the parameters 同上,检查是否超出设定值范围*/
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode 输出模式*/
/* 速度有3种模式,依次为1、2、3 ---0x…01,0x…02,0x…03
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
*/
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
//对应输出模式加上输出频率值,一会用于写入控制寄存器(CR-)中
}
全文参见:sevenz.21ic.org
|