物联网技术
直播中

笔画张

12年用户 962经验值
私信 关注
[问答]

如何通过配置相应的寄存器来驱动LED灯?

如何通过配置相应的寄存器来驱动LED灯?
如何通过查找相应的寄存器使能GPIOB?

回帖(1)

李勇

2021-6-16 14:38:58
  对于STM32F1的IO可以配置成8种模式,三种最大输出速度。也就是每组IO口有7个寄存器,也就是说7个寄存器可以控制一组16个IO口。
  这7个寄存器分别是:
  位配置寄存器,主要是:模式的选择以及输出速度的选择。
  GPIOx_CRL
  GPIOx_CRH
  数据寄存器,主要是:一个是输入数据寄存器。一个是输出数据寄存器。
  GPIOx_IDR
  GPIOx_ODR
  一个32位置位/复位数据寄存器
  GPIOx_BSRR
  一个16位复位寄存器
  GPIOx_BRR
  一个32位锁存器
  GPIOx_LCKR
  假设:PB5和PE5和外部的LED相连。通过配置相应的寄存器来驱动LED灯。
  寄存器版本步骤是三步:
  第一步:使能IO端口时钟。
  在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设,相应的寄存器是:APB2 外设时钟使能寄存器(RCC_APB2ENR)
  GPIOB与GPIOE是在寄存器:RCC_APB2ENR的第三位和第六位。我们只需要把相应的位设置为1即可。
  通过查找相应的寄存器使能GPIOB。
  RCC-》APB2ENR |= 1《《3 ; //一般情况下我们不直接赋值,主要是为了保持其他位不变。
  同样我们可以使能GPIOE:RCC-》APB2ENR |= 1《《6;
  第二步:初始化IO口模式
  在使能了相应的端口以后,我们需需要设置相应的IO口模式。配置模式有2个32位的寄存器CRL和CRH。GPIOB与GPIOE都是低八位,因此只需要我们配置寄存器CRL。
  每个IO口需要配置4位,低两位输出模式选择,高两位是配置模式。
  选择模式:输出模式,最大速度50MHZ。复用推挽输出。
  程序可以写成:
  在我们设置相应的位之前,我们先把要设置的位清零。(利用和1相与不变,和0相与清零)
  GPIOB-》CRL &=0xFF0FFFFF;
  然后选择模式:
  GPIOB-》CRL |=0x00300000; //PB5的工作模式
  初始化我们设置输出为1,通过寄存器ODR设置。
  GPIOB-》ODR |= 1《《5;
  同样可以设置GPIOE的模式以及PE5的状态。
  GPIOE-》CRL &=0xFF0FFFFF;
  GPIOE-》CRL |= 0x00300000; //PE5的工作模式
  GPIOE-》ODR |= 1《《5;
  第三步:操作IO口
  操作寄存器ODR或者寄存器BRR/BSRR.
  通过配置PB5和PE5相应输出寄存器ODR的位置位或者清零。
  GPIOE-》ODR |= 1《《5;
  调用延时函数delay;
  GPIOB-》ODR &= ~(1《《5);
  或者配置寄存器BRR/BSRR.
  通过BSRR的低16位置1, GPIOB-》BSRR |= 1《《5;
  调用延时函数delay;
  通过BSRR的低16位置0,GPIOB-》BRR |= 1《《5;
  【补充C语言操作符号】
  把CRL寄存器所有位清零: GPIOB-》CRL &= 0x0;
  把CRL寄存器所有位置1: GPIOB-》CRL |= 0xFFFFFFFF
  把CRL寄存器的第1位置1:GPIOB-》CRL |= 1《《1;
  把CRL寄存器的第1位清零:GPIOB-》CRL &= ~(1《《1) ;
  把CRL寄存器的第0-3位设置成A,其他保持不变: GPIOB-》CRL |= 0x0000000A;(为了举例,没有实际意义)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分