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;
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的简单问题,GPIOA->BSRR=0x080004;这样写对吗?
stm32中GPIOx_BSRR和 GPIO_xBRR寄存允许对任何GPIOx进行读\更改的独立访问;