datasheet

STM32开发系列之寄存器(一)按键控制LED灯

2019-07-12来源: eefocus关键字:STM32  寄存器  按键控制  LED灯

入门学习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();

 }



关键字:STM32  寄存器  按键控制  LED灯

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467559.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F1(Cortex M3内核)位带操作
下一篇:STM32F1学习-驱动led灯(位操作版本)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32 Systick定时器在实现1us延时时的问题与解决

问题:使用systick_config()函数来实现计数,这个函数在下面代码中的 SysTick_CTRL_TICKINT_Msk 开启了中断。不论系统时钟为72Mhz或36Mhz若设置STM32每10us进入一次中断,计时是可以的;而每1us进入中断,由于中断指令较多,那么程序就会困在中断里出不来。static __INLINE uint32_t SysTick_Config(uint32_t ticks){   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);           
发表于 2019-07-17

stm32 ADC知识总结(二)

关于STM32的ADC的一些重要特点需要记住: 1)STM32F103系列至少有2个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率); 2)STM32的ADC是12位逐次逼近型的模数转换器,一共有18个通道,可以测量16个外部信号和2个内部信号源; 3)每个通道的ADC可以在单次、连续、扫描或者间断模式下进行; 4)前面讲过STM32的ADC是12位的,结果存储在16位的数据寄存器中,有4位用不到,所以ADC存在左对齐或右对齐的方式; 5)模拟看门狗允许应用程序检测输入电压是否超出用户定义的高低阈值; 6)STM32的ADC最大的转换速率为1MHz
发表于 2019-07-17
stm32 ADC知识总结(二)

stm32f070 stop 模式 rtc定时启动调试总结

stm32f070 stop 模式 rtc定时启动调试总结。1.在进stoop模式之前一定对gpio进行配置。/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();/Configure GPIO pins : GPIO_PIN_All/GPIO_InitStruct.Pin = GPIO_PIN_All;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL
发表于 2019-07-17

RTC_WakeUp中断唤醒STM32F4停止模式

RTC_WakeUp唤醒STM32F4停止模式(借鉴的是原子哥写的代码): 首先我们先初始化RTC配置://RTC初始化u8 MyRTC_Init(void){    RTC_InitTypeDef RTC_InitStructrue;    u16 retry=0x1FFF;    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR时钟    PWR_BackupAccessCmd(ENABLE);//使能后备寄存器    if
发表于 2019-07-17

关于stm32stop模式下,串口唤醒中的问题及解决办法

首先讲一下应用场景:STM32F1 + HAL库+ Freertos ,STOP模式下利用串口引脚唤醒。stop mode 处理内容如下:1,配置所有引脚为模拟输入(参考官方代码)2,配置串口接收引脚为外部中断3,进入stop mode4,初始化串口等外设现象:第一次从stop模式唤醒时串口能正常通信,判断一段时间后无数据则再一次进入stop mode,然后再一次唤醒,此时串口无法输出。最后发现原因是串口重新初始化时HAL_UART_Init()函数中会判断if(huart->State == HAL_UART_STATE_RESET),此时才会执行HAL_UART_MspInit(huart),配置串口IO口。解决办法
发表于 2019-07-17

STM32开发笔记1: STM32F407时钟配置

单片机型号:STM32F407    本文讲解STMF407时钟的使用及其配置方法。        1、STM32F407的分类        a、LSI是低速内部时钟,RC震荡器,频率为32KHz左右。供独立看门狗和自动唤醒单元使用。        b、LSE是低速外部时钟,接频率为32.768KHz的石英晶体。这个主要是RTC的时钟源。        c、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围
发表于 2019-07-17
STM32开发笔记1: STM32F407时钟配置

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved