STM32-GPIO学习笔记

        STM32F103RB有4个IO口(A~D),每个IO口都有7个寄存器控制,他们分别是:

        端口配置寄存器(32位,共两个,CRL和CRH)

数据寄存器(32位,共两个,IDR和ODR)

置位/复位寄存器(32位,一个,BSRR)

复位寄存器(16位,一个,BRR)

锁存寄存器(32位,一个,LCKR)

常用的IO寄存器只有四个,即CRL、CRH、IDR、ODR,他们分别是设置IO口工作状态和输入/输出数据的,其中CRL和CRH共2个32位寄存器控制16个IO口的状态(CRL和CRH完全一样,只是CRL控制的是低8位输出口GPIOx(0:7),CRH控制的是高八位GPIOx(8:15)),即每四位控制一个IO口状态(高2位CNF,低2位MODE),寄存器情况如图所示:

STM32的IO口可以由软件配置成为8种模式:

       STM32-GPIO学习笔记_第1张图片

        常用的状态配置

         0X0 模拟输入模式(ADC用)
        0X3 推挽输出模式 (作输出口用 50Mhz速率)
        0X8 上/下拉输入模式 (作输入口用)

 0XB 复用输出  (作IO口的第二功能50Mhz速率)   注意:这个是第二功能即复用输出功能

 举例:

 我们甚至PORTC的11位位上拉输入,12位为推挽输出,代码如下:

GPIO->CRH&=0XFFF00FFF;  //清除原来的设置,不影响其他位

GPIO->CRH|=0X00038000;  //PC11输入,PC12输出

GPIO->ODR=1<<11; //PC11上拉IDR 输入数据寄存器,只使用了低16位,只读寄存器,同理,ODR也只使用了低16位,位可读写寄存器。

IDR寄存器描述如图:

STM32-GPIO学习笔记_第2张图片  STM32-GPIO学习笔记_第3张图片

STM32和AVR单片机IO口的比较:

    STM32-GPIO学习笔记_第4张图片

补充遇到的一个问题:http://www.openedv.com/posts/list/0/378.htm#94993

SPI 读写W2516 引脚配置问题

GPIOA->CRL&=0X000FFFFF;  //先将Pin5 6 7 对应的配置为清零,其他位不变
GPIOA->CRL|=0XBBB00000;  //PA5.6.7复用推挽输出(50MHz)   
GPIOA->ODR|=0X7<<5;      //PA5.6.7上拉

 PA5-SCLK;PA6-MISO;PA7-MOSI;

第二行中,为什么PA6 也配置为推挽输出呢?  PA6 不是应该配置为输入吗 ? 

为什么最后还有用GPIOA->ODR|=0X7<<5 配置为上拉呢?      ODR寄存器不是只有在输入模式设置上拉或者下拉时才用吗 ?

原子的解答:

1,请注意,这里是复用输出.在复用功能下面,输入输出的方向,完全由内部控制.不需要你的程序处理. 
2,配置为上拉,是常用的设置,这样设置的好处,就是可以让你的IO处于一个电平,而很多时候,外设默认的电平就是高电平的.所以设置为高,是有道理的. 

复用功能下,操作ODR是不能输出的!但是ODR是可以操作的,可以设置上拉。


你可能感兴趣的:(STM32-GPIO学习笔记)