如题,以设置推免输出为例:
使用STM32的官方库,在设置通用IO
模式的时候,语句如下: 右击GPIO_Mode_Out_PP,转到定义,如下:
对比stm32手册,查看其IO模式一共八个,GPIO_Mode_Out_PP根据stm32f10x_gpio.h注释文字是推免输出。
我们分析,这个枚举定义中,八个模式所赋值后一位分别为:十六进制的0,4,8,8,4,0,C,8。如果将其对应到下图寄存器中,即为0000,0100,1000,1000,0100,1100,1000;也就是说它们设置的CNFy[0:1]。
那么,在枚举定义中,所赋十六进制数的第一位的意思又是什么?我们继续看。这个值在应用时赋值给了GPIO_Mode。我们打开stm32f10x_gpio.c,查找GPIO_Mode。会找到如下结果:
这个值按位与操作后,第一位变成零,第二位保留原值,然后赋给了currentmode这个变量。
还没完,下边紧接着是一个if语句:
这一句就体现了GPIO_Mode值中的第一位的作用。if的判断语句中,通过按位与操作,区分出了输出和输入。如果是输出的话(注意看它们模式值的第一位,都是0x1),执行下边语句,将输出频率的模式值叠加到了currentmode上:
最后通过如下语句,
和 GPIOx->CRL = tmpreg;赋给当前端口的配置位上去。
通过分析,我们看出,模式设置中的0x--;第二位是设置值,第一位并没有具体的意义,它的作用只是将其和0x1按位与时,区分出输入还是输出。
下边关于GPIO_Mode_IPD和GPIO_Mode_IPU(上拉输入和下拉输入)还要多说两句。在模式配置时他们两个是一样的,但是怎样区分是上拉还是下拉呢?原来他们还和另外一个寄存器有关系,如下图:
当ODR中相应位是0的时候,下拉;为1的时候,上拉。我们看程序中:
官方的gpio.c库文件中是直接加了一个if语句,来判断是将那一位置位还是清空。(另外,请看模式设置赋值中上拉为0x48,下拉为0x28。第一位既要满足前边提到的和0x1相与得0,用来判断其为输入;又要满足这里提到的两者不同,用来区分上拉还是下拉)。
嘿嘿,表达的不好~~各位大神见笑啦~
1
|
|
|
比我学的时间长 嘿嘿,我是初学者,平时在忙别的 没空看
|
|
|
|
|