STM32中GPIOD->BSRR = addr(0x0000ffff<<16); <<16是啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32中GPIOD->BSRR = addr(0x0000ffff<<16); <<16是啥意思相关的知识,希望对你有一定的参考价值。

就是将addr的高31-16位全部置为1。换句话说,其实就等同于GPIOD->BSRR = addr|0xffff0000;
因为0x0000ffff << 16 就是0xffff0000追问

GPIOD->BSRR = addr|0xffff0000;
比如我这个地址addr输入为1,就是GPIOD->BSRR = 1|0xffff0000 结果是
GPIOD->BSRR = 0xffff0001;代表PD0输出为1,PD1~PD15输出为0???
比如我这个地址addr输入为F,就是GPIOD->BSRR = F|0xffff0000 结果是
GPIOD->BSRR = 0xffff000F;代表PD0~PD3输出为1,PD4~PD15输出为0???

麻烦你,看下我这样分析是不是对的。谢谢

追答

对。

参考技术A 左移16位,比如把0x0000FFFF变成0xFFFF0000.

我想实现的功能是当按键KEY2按下时,LED2亮(STM32f107开发板),软件运行没错,但是下载后灯不亮

#include "stm32f10x.h"
#include <stdio.h>
void Delay(u32 nCount) //通过不断for循环nCount次,达到延时的目的

for(; nCount != 0; nCount--);

LED_init()

RCC->APB2ENR |= RCC_APB2Periph_GPIOD; /* 使能APB2总线的时钟,对GPIO的端口D时钟使能 */
GPIOD->CRL |= 0x00003000; /*** 设置GPIOD的PD3配置为通用推挽模式输出50MHZ ***/

/*******************************/
void Key_init()

RCC->APB2ENR|=RCC_APB2Periph_GPIOB; //使能PORTB时钟
GPIOB->CRH|=0X00000800;
GPIOB->ODR|=0x00000400; //PB10设置成输入上拉模式

/*******************************/
u8 scan_key(void)//扫描函数

GPIOB->IDR=0x0000FFFF;
if((GPIOB->IDR&GPIO_Pin_10)==0x0000FFBF)
return 2;
else
return 0;

/**********************************/
int main(void)

u8 KeyNum = 0;
LED_init(); //LED初始化配置
Key_init(); //初始化控制按键的PA0端口

while (1)

KeyNum=scan_key();
switch(KeyNum)

case 2: GPIOD->BRR = GPIO_Pin_3;break;
default: GPIOD->BSRR = GPIO_Pin_3;break;


void Key_init()

RCC->APB2ENR|=RCC_APB2Periph_GPIOB; //使能PORTB时钟
GPIOB->CRH|=0X00000800;
GPIOB->ODR|=0x00000400; //PB10设置成输入上拉模式


这个函数中的GPIOB->CRH|=0X00000800; 这句话有问题。我猜想你本来是想把Bit11-8设置成1000,但实际效果并不是,
因为执行该语句只是把Bit11位置1,只是如此。改正方法是:先将Bit11-8清零,再设置。应该这样写: GPIOB->CRH &= 0XFFFFF0FF;GPIOB->CRH |= 0X00000800;或者你就直接赋值GPIOB->CRH=0X00000800; 有些寄存器的复位值并不是0x00000000,所以要注意一下这方面。
参考技术A 不需要这么麻烦的程序吧,我去。。。。
程序貌似没错,你查看下硬件吧,有米有上拉电阻,延时时间够长不,追问

程序是有点长,单个按键的话,可以不写延迟函数。(我是为了再增添其他三个按键才这么写的)我觉得问题是不是出在scan_key这个函数那个地方?就是换成简单的,也是每次都在扫描函数那儿出错(软件可以通过,就是下载下来后在板子上没效果),如果让你写的话,你会怎么写按键扫描那块?注:KEY1-4四个按键分别与PC4、PB10、PC13和PA0四个GPIO管脚连接,现在我只使用按键2

追答

我去,我2了,刚没仔细看,你的break是会跳出循环的,你改成continue试试

追问

不好意思,我试过了,还是不行

参考技术B e bu zhi dao lai zuo ren wu you cuo me ?追问

为什么不打汉字呢?我听不懂

以上是关于STM32中GPIOD->BSRR = addr(0x0000ffff<<16); <<16是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

stm32中GPIOB->BSRR这句话是啥意思?是否跟GPIOB.BSRR意思一样?一定采纳

stm32中“GPIOB->BSRR”这句话是啥意思?

关于STM32的简单问题,GPIOA->BSRR=0x080004;这样写对吗?

stm32中GPIOx_BSRR和 GPIO_xBRR寄存允许对任何GPIOx进行读\更改的独立访问;

请教STM32知识点:GPIOA->BSRR 与GPIOA->BRR两个管脚寄存器

STM32中的BRR寄存器与BSRR寄存器重复么?