打印

STM32学习笔记--GPIO_Init()的深入解析

[复制链接]
5626|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcu_electron|  楼主 | 2011-9-19 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天在想熟悉一下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种模式,依次为123 ---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

沙发
lyy8611| | 2011-9-20 16:14 | 只看该作者
分析的不错啊楼主

使用特权

评论回复
板凳
火箭球迷| | 2011-9-20 18:15 | 只看该作者
楼主这笔记写的不错

使用特权

评论回复
地板
dfsa| | 2011-9-20 23:11 | 只看该作者
全文链接好像进不去

使用特权

评论回复
5
xgdxff| | 2012-3-21 23:42 | 只看该作者
笔记做的很好、支持下!

使用特权

评论回复
6
a20061833| | 2012-8-23 15:37 | 只看该作者
若为0x2/4/1-,当和(uint32_t)0x10相与后不为0对应为输出
                                    //                       若为输出模式进行下面的设置,为currentmode加上频率


若为0X2/4-,当和(uint32_t)0x10相与后应该为0啊????难道我错了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:With you all the time !

0

主题

239

帖子

1

粉丝