Stm32 我的解决方案是否适用于使用BSRR和BRR的8位总线寻址?

Stm32 我的解决方案是否适用于使用BSRR和BRR的8位总线寻址?,stm32,gpio,Stm32,Gpio,我在stm32 MCU上设置了一个8位总线(PD0:PD7),用于将地址发送到另一个芯片(0:255)。我很感兴趣,如果像下面这样的功能将在地址的快速变化工作。我找不到一个直接显示寄存器等于整数的示例,所以我想确认它是否有效。我需要一个函数,我会给地址一个整数值(0:255),它会用这个值设置总线的8个引脚: void chipbus(uint16_t bus8){ GPIOD->regs->BSRR = bus8; // set all the '1' in bus

我在stm32 MCU上设置了一个8位总线(PD0:PD7),用于将地址发送到另一个芯片(0:255)。我很感兴趣,如果像下面这样的功能将在地址的快速变化工作。我找不到一个直接显示寄存器等于整数的示例,所以我想确认它是否有效。我需要一个函数,我会给地址一个整数值(0:255),它会用这个值设置总线的8个引脚:

void chipbus(uint16_t bus8){
   GPIOD->regs->BSRR = bus8;      // set all the '1' in bus8 to high
   GPIOD->regs->BRR = 255-bus8;   // 255-bus8 inverts the 8 bits
                                  // BRR to set the new '1' to low
}

如果此解决方案有效,我也很好奇,如果我将总线更改为端口PD5:PD12,我的功能是否会工作为:

void chipbus(uint16_t bus8){
   GPIOD->regs->BSRR = bus8*32;      // set all '1' in bus8 to high
                                     // multiply by 32 to shift 5 bits/pins
   GPIOD->regs->BRR = (255-bus8)*32; // 255-bus8 inverts the 8 bits
                                     // BRR to set the new '1' to low
}


谢谢大家!

我不建议使用这种方法。作为两个单独的步骤写入BSRR和BRR意味着总线将通过一个非预期状态进行转换,其中一些位仍然是从前一个值设置的

相反,考虑直接写入GPIO输出数据登记器(ODR)。如果需要保留端口中高位的原始值,可以在CPU端执行以下操作:

GPIOD->regs->ODR = (GPIOD->regs->ODR & 0xff00) | (bus8 & 0x00ff);

是的,两者都应该有效。然而,一个更容易识别但同等的表述是:

void chipbus(uint16_t bus8) {
  GPIOD->regs->BSRR = bus8; // set all the '1' in bus8 to high
  GPIOD->regs->BRR = (~bus8) & 0xFF; // inverts the 8 bits // BRR to set the new '1' to low
}

void chipbus(uint16_t bus8) {
  GPIOD->regs->BSRR = bus8<<5; // set all '1' in bus8 to high, shift 5 bits
  GPIOD->regs->BRR = ((~bus8)&0xFF)<<5; // inverts the 8 bits
}
void芯片总线(uint16\u t总线8){
GPIOD->regs->BSRR=bus8;//将bus8中的所有“1”设置为高
GPIOD->regs->BRR=(~bus8)&0xFF;//反转8位//BRR以将新的“1”设置为低
}
无效芯片总线(uint16_t总线8){
GPIOD->regs->BSRR=bus8BRR=(~bus8)和0xFF)BSRR=

(bus8是的,它肯定会工作。但是,正如其他人所指出的,建议在一次操作中设置输出

利用完整的32位
BSRR
寄存器,无需反转数据位即可完成:

GPIOD->regs->BSRR = bus8 | (0xFF << 16);

GPIOD->regs->BSRR=bus8 |(0xFF regs->BSRR=(bus8哇!我认为我的很短。非常感谢!事实上,我猜仅使用BSRR的快速解决方案也可以解决duskwuff提到的问题。再次感谢你!是的,但是对BSRR的写入也可以避免读-修改-写周期,而对ODR的访问很容易在读和写之间发生的ISR中发生写访问这很重要。所以我认为你的建议是最好的解决方案。谢谢!我正在制作定制板,希望在一个月内可以进行真正的测试…现在只是在等待时编写固件…用评估板测试软件,否则你将不得不同时调试硬件和软件…
GPIOD->regs->BSRR
这是什么?为什么不使用标准STM CMSIS定义?感谢您的澄清!我认为上述仅使用BSRR的解决方案将消除您所谈论的问题。
GPIOD->regs->BSRR = bus8 | (0xFF << 16);
GPIOD->regs->BSRR = (bus8 << 5) | (0xFF << (16 + 5));