STM32 寄存器控制IO口输入输出 ODR IDR

核心是F103奥

 

 LED0是PB5,LED1是PE5,KEY0是PE4

//.h文件
#define RCC_APB2ENR      *(unsigned int*)(0x40021018)
    //时钟地址
#define GPIOB_CRL        *(unsigned int*)(0x40010C00)    //GPIOB端口配置低位寄存器地址
#define GPIOB_ODR        *(unsigned int*)(0x40010C0C)    //GPIOB端口输出寄存器地址
#define GPIOE_CRL        *(unsigned int*)(0x40011800)    //GPIOE端口配置低位寄存器地址
#define GPIOE_ODR        *(unsigned int*)(0x4001180c)    //GPIOE端口输出寄存器地址
#define GPIOE_IDR        *(unsigned int*)(0x40011808)    //GPIOE端口输入寄存器地址
//下面记得加一行空,不然会报错

//main文件
#include "stm32f10x.h"

void SystemInit(void)
{
    
}

unsigned char a =2;

typedef unsigned int u32;

void delay(u32 i)
{
    while(i--);
}

int main()
{
    
    RCC_APB2ENR |= (1<<3);//初始化GPIOB的时钟
    RCC_APB2ENR |= (1<<6);//初始化GPIOE的时钟
    GPIOB_CRL &= ~(0xf<<4*5);//清空PB5的端口配置
    GPIOB_CRL |= (1<<4*5);//设置PB5为通用推挽输出模式,输出速率为10MHZ
    
    GPIOE_CRL &= ~(0xf<<4*5);//清空PE5的端口配置
    GPIOE_CRL &= ~(0xf<<4*4); //清空PE4的端口配置
    GPIOE_CRL |= 0x1<<(4*4+3);//设置PE4为上拉输入模式!!!
    GPIOE_CRL |= 1<<(4*5);//设置PE5为通用推挽输出模式,输出速率为10MHZ

    
        GPIOB_ODR &= ~(1<<5);//因为LED是共阳,所以要将PB5设置为低电平
    PIOE_ODR &= ~(1<<5);//因为LED是共阳,所以要将PE5设置为低电平
    GPIOE_ODR |= (1<<4);//因为是上拉输入模式,所以要将PE4设置为高电平
    while(1)
    {
        
        if(~GPIOE_IDR&(1<<4))//获取PE4端口的状态,并取反,当按下按钮时小灯泡停止闪烁
        {
            GPIOE_ODR &= ~(1<<5);
            GPIOB_ODR &= ~(1<<5);
            delay(0xFFFFF);
        }
        else
        {
            GPIOE_ODR |= (1<<5);
            GPIOB_ODR |= (1<<5);
            delay(0xFFFFF);
            GPIOE_ODR &= ~(1<<5);
            GPIOB_ODR &= ~(1<<5);
            delay(0xFFFFF);
        }
        

        
    }
}

期间遇到过一个问题,就是那时候我给PE4配置的是GPIOE_CRL &= ~(0xf<<(4*4));也就是直接清空。

完全没看见上面的在输入模式(笑死字太多就直接看的末尾),卡了半天,网上到处查,我感觉就我这么点东西逻辑上是对的不应该不行啊,网上也基本上找不太到这些,所以就想着把我遇见过的瞎眼情况和学会的浅显东西发出来。

 

那时候还是这里才看见的,笑死。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值