打印
[应用相关]

stm32单片机GPIO端口使用

[复制链接]
820|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近一段时间在学STM32,感觉都是在和寄存器打交道,首先先说下什么是寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。

        STM32的每个IO口有7个寄存器控制(1个IO口应该就是一组),分别是两个32位的端口配置寄存器,CRL和CRH。两个32位的数据寄存器IDR和ODR(这上面四个是重点),一个32位置位复位寄存器,一个16位复位寄存器,一个锁存寄存器LCKR.

________________________________________________________________________________________________________________

端口配置寄存器

       端口配置寄存器CRL和CRH有两部分组成   CNFX和MODEX      

                通过设置这两个来确定模式      (1)GPIO_Mode_AIN 模拟输入
                                                                (2)GPIO_Mode_IN_FLOATING 浮空输入
                                                                (3)GPIO_Mode_IPD 下拉输入
                                                                (4)GPIO_Mode_IPU 上拉输入
                                                                (5)GPIO_Mode_Out_OD 开漏输出
                                                                (6)GPIO_Mode_Out_PP 推挽输出
                                                                (7)GPIO_Mode_AF_OD 复用开漏输出
                                                                (8)GPIO_Mode_AF_PP 复用推挽输出
    如果IO口是0-7的话用CRL寄存器,如果是8-15的话用CRH寄存器



使用说明:     MODE         模式                                                   

                         00           输入模式

                         01           输出模式  10MHZ

                         10           输出模式  2MHZ

                         11           输出模式  50MHZ



                      CNF           所处模式                表达含义

                       00               输入                     模拟输入模式

                       01               输入                     浮空输入模式

                       10               输入                     上拉\下拉输入模式

                       11               输入                      保留



                       00              输出                      推挽输出模式

                       01              输出                      开漏输出模式

                       10              输出                      复用功能 推挽输出模式

                       11             输出                     复用功能开漏输出模式



使用方法:

             首先是APB2总线上的外设始能寄存器,只要加外设就要将这个使能

                                              RCC->APB2ENR  |= 1<<几位   根据表来说

              然后开始配置


                                       GPIOB->CRH &= 0XFFFFFFF0;                 通过与将要写数据的位进行清空
                                       GPIOB->CRH |= 0X03;                              在要写的为写内容
                                        GPIOB->ODR = 1<<8;                             在第几位写入数据

                       ODR是输出数据寄存器




沙发
天灵灵地灵灵|  楼主 | 2016-5-23 19:16 | 只看该作者
GPIO端口使用举例

__________________________________________________________________________________________________________________

流水灯的.c文件

void LED_Init (void)
{

//两个RCC是使能时钟
RCC->APB2ENR |= 1<<3;   

RCC->APB2ENR |= 1<<6;   

GPIOB->CRL &= 0XFF0FFFFF;
GPIOB->CRL |= 0X00300000;
GPIOB->ODR = 1 << 5;

GPIOE->CRL &= 0XFF0FFFFF;
GPIOE->CRL|=0X00300000;    //PE.5
GPIOE->ODR|=1<<5;          //PE.5
}

.h文件

# define LED0 PBout (5)
# define LED1 PEout (5)
因为是输出,所以用PXout (引脚号)

使用特权

评论回复
板凳
天灵灵地灵灵|  楼主 | 2016-5-23 19:17 | 只看该作者
按键的初始化


void KEY_Init (void)
{
RCC->APB2ENR |= 1<<2;
RCC->APB2ENR |= 1<<6;

GPIOA->CRL &= 0XFFFFFF0;
GPIOA->CRL |= 0X0000008;   
// GPIOA->ODR |= 1<<1;  GPIOE->CRL &= 0XFFF000FF;
GPIOE->CRL |= 0X00088800;
GPIOE->ODR |= 7<<2;    //7<<2   从7的位置右移5位

}

使用特权

评论回复
地板
天灵灵地灵灵|  楼主 | 2016-5-23 19:18 | 只看该作者
注意.h文件


#define KEY0 PEin(4)    //PE4
#define KEY1 PEin(3) //PE3
#define KEY2 PEin(2) //PE2
#define KEY3 PAin(0) //PA0  WK_UP
因为是输入,所以用的是PXin (引脚号)

使用特权

评论回复
5
309030| | 2016-5-23 22:19 | 只看该作者
模拟输入输出方式很多,怎么判断在什么时候用哪种

使用特权

评论回复
6
天灵灵地灵灵|  楼主 | 2016-5-26 23:14 | 只看该作者
309030 发表于 2016-5-23 22:19
模拟输入输出方式很多,怎么判断在什么时候用哪种

输入的时候肯定是选择输入,输出的时候肯定是选择输出,虽然是输入但是仍然可以配置输出的寄存器,这个时候就出现特点了,你在输入方向的情况下,写输出寄存器就是设置上拉下拉电阻,你输出寄存器配置为高电平就是上啦输入,低电平就是下拉出入。

使用特权

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

本版积分规则

164

主题

3327

帖子

13

粉丝