STM32之寄存器开发(一)按键控制LED灯(非位带操作实现)
2018-12-21 17:42
330 查看
版权声明:转载请注明作者及来源 https://blog.csdn.net/qq_41619856/article/details/85147966
从手册中我们可以知道GPIOB位于APB2寄存器的第四位,且为了不改变其他位的值,进行了或运算,将第四位置1,其他位不变。
②接下来要配置端口,STM32有两个端口端口配置寄存器 CRL和CRH,CRL配置低八位,CRH配置高八位。我们要配置的是GPIOB的第6位-GPIOB5,配置为推挽输出,最大速度为50MHZ。
入门学习STM32开发,首先要选择一种开发方式。STM32的开发方式主要有标准库开发、寄存器开发和HAL库开发(这个我没使用过,不太了解)。比较多的人选择的开发方式是库开发,使用这两种方式比较方便,但因经过函数封装,对底层的理解不足。由于我入门也是由标准库开发入门的,所以这里想专门写一下寄存器开发,边写边学习,欢迎一起探讨。
1、一般写法
注:采用的STM32F103ZET6芯片
ST官方提供了stm32f10x.h的头文件,里面有各个寄存器的地址定义,因此可以直接操作寄存器来对IO口进行配置,下面就以案件控制LED灯为例。
在stm32f10x.h头文件里有以下的IO口的宏定义及结构体
①假设LED灯接在GPIOB5引脚,根据手册我们要先开启GPIOB的时钟
RCC->APB2ENR |= 1<<3;
从手册中我们可以知道GPIOB位于APB2寄存器的第四位,且为了不改变其他位的值,进行了或运算,将第四位置1,其他位不变。
②接下来要配置端口,STM32有两个端口端口配置寄存器 CRL和CRH,CRL配置低八位,CRH配置高八位。我们要配置的是GPIOB的第6位-GPIOB5,配置为推挽输出,最大速度为50MHZ。
GPIOB->CRL &= 0XFF0FFFFF; //将GPIOB5置0 GPIOB->CRL |= 0X00300000; //推挽输出,最大速度50MHZ
CRL寄存器有32位,每4位控制一个口,这便对应上面所说的CRL控制GPIO的低八位,CRH同样道理。
③最后我们要让GPIOB5输出高低电平,就需要用到另外一个寄存器-输出寄存器ODR,使用这个寄存器时,跟配置APB2寄存器一样,为了不影响其他位,进行或运算
GPIOB->ODR |= 1<<5; //GPIOB5输出高电平 //GPIOB->ODR |= ~(1<<5);//GPIOB5输出低电平
到这里,我们已经配置好LED灯,接下来我们来配置按键。按键和LED 灯的区别在于LED灯为输出,按键为输入。
④假设按键接在GPIOE4,我们按照上面配置LED灯的顺序来配置按键,先开启GPIOE的时钟,然后配置GPIOE4为上拉输入模式
RCC->APB2ENR |= 1<<6 GPIOE->CRL &= 0xFFF0FFFF; GPIOE->CRL |= 0x00080000; //上拉输入 GPIOE->ODR |= 1<<4;
配置好后,我们要如何才能读取按键按下时的值呢(0或1)?STM32不能像51单片机那样直接
P1.0 = 0;这样写,我们需要通过IDR输入寄存器读取整个GPIOE,然后老套路进行与运算和移位来得到我们想要那位的值。
// #define KEY0_Read (GPIOE->IDR&0x01) // #define KEY1_Read (GPIOE->IDR&0x02)>>1 // #define KEY2_Read (GPIOE->IDR&0x04)>>2 // #define KEY3_Read (GPIOE->IDR&0x08)>>3 #define KEY4_Read (GPIOE->IDR&0x10)>>4
其他位的读取方法也类似,之后我们就可以在if里面进行判断,控制LED灯的亮灭了。
if(KEY4_Read == 0) //读取PE4的电平 { LED0_RESET(); } else{ LED0_SET(); }
相关文章推荐
- 2、按下按键S1控制LED1.LED2.LED3实现跑马灯效果(CC2540开发寄存器设置)
- STM32学习第二课——(操作)按键控制LED灯
- [置顶] ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
- STM32之寄存器开发(二)GPIO口位带操作实现
- jz2440裸板开发之GPIO:用按键控制led
- stm32 NVIC中断管理实现[直接操作寄存器]
- ARM裸机程序开发——按键控制LED灯
- 2.STM32中对Key_GPIO_Config()函数的理解(自定义)之轮询控制按键LED
- micro2440利用LEDS与BUTTONS驱动实现按键控制led灯【开发总结】
- 按键控制LED实现启动、停止按钮
- 基于STM32CT117E竞赛板(STM32f103RB)按键控制LED流水灯
- stm32 NVIC中断管理实现[直接操作寄存器]
- stm32学习的日子-构建库函数雏形(第1节)—寄存器结构体定义控制点亮G0Kitv2.1 LED2和LED4
- stm32 NVIC中断管理实现[直接操作寄存器]
- P1口外接8个LED,通过按键控制,实现左右移动的流水灯
- [转载]STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
- STM32_按键控制LED之轮询
- STM32入门开发--按键模块实现按键点灯
- Linux驱动开发--通过按键控制led灯
- STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)