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