Embedded 如何从74595获取信号

Embedded 如何从74595获取信号,embedded,stm32,Embedded,Stm32,我将代码用作移位\寄存器\写入\字节(0xFF) 我想使用移位寄存器写入字节函数根据8位数据变量生成LED输出。 但我没有收到信号。我怎样才能得到信号?谢谢大家! void shift_register_reset(void){ GPIOA->BSRR=GPIO_PIN_9; Delay_us(5); GPIOA->BRR=GPIO_PIN_9; Delay_us(5); GPIOA->BSRR=GPIO_PIN_9;} void shift_re

我将代码用作移位<代码>\寄存器\写入\字节(0xFF) 我想使用移位寄存器写入字节函数根据8位数据变量生成LED输出。 但我没有收到信号。我怎样才能得到信号?谢谢大家!

  void shift_register_reset(void){
  GPIOA->BSRR=GPIO_PIN_9;
  Delay_us(5);
  GPIOA->BRR=GPIO_PIN_9;
  Delay_us(5);
  GPIOA->BSRR=GPIO_PIN_9;}

  void shift_register_clk_pulse(void){
      GPIOA->BSRR=GPIO_PIN_8;
      Delay_us(5);
      GPIOA->BRR=GPIO_PIN_8;
  }

  void shift_register_load_pulse(void){
       GPIOA->BSRR=GPIO_PIN_10;
       Delay_us(5);
       GPIOA->BRR=GPIO_PIN_10;
  }

  void shift_register_write_byte(uint8_t data){
    shift_register_reset();
    for(int i=0;i<8;i++){

        if(((data>>i) &0x01) == 0 ){
            GPIOA->BSRR = GPIO_PIN_15;
            HAL_Delay(5);
            shift_register_clk_pulse();
        }
        else if(((data>>i)& 0x01) == 1){
            GPIOA->BSRR = GPIO_PIN_15;
            HAL_Delay(5);
            GPIOA->BRR = GPIO_PIN_15;
            shift_register_clk_pulse();
        }
    }
    HAL_Delay(5);
    shift_register_clk_pulse();
    HAL_Delay(5);
    shift_register_load_pulse();}
void移位寄存器复位(void){
GPIOA->BSRR=GPIO_引脚_9;
延期付款(5);
GPIOA->BRR=GPIO_引脚_9;
延期付款(5);
GPIOA->BSRR=GPIO_引脚_9;}
无效移位寄存器时钟脉冲(无效){
GPIOA->BSRR=GPIO_引脚_8;
延期付款(5);
GPIOA->BRR=GPIO_引脚_8;
}
无效移位寄存器加载脉冲(无效){
GPIOA->BSRR=GPIO_引脚_10;
延期付款(5);
GPIOA->BRR=GPIO_引脚_10;
}
无效移位寄存器写入字节(uint8数据){
移位寄存器复位();
对于(int i=0;i>i)&0x01)==0){
GPIOA->BSRR=GPIO_引脚_15;
halu延迟(5);
移位寄存器时钟脉冲();
}
如果((数据>>i)&0x01)==1,则为else{
GPIOA->BSRR=GPIO_引脚_15;
halu延迟(5);
GPIOA->BRR=GPIO_引脚_15;
移位寄存器时钟脉冲();
}
}
halu延迟(5);
移位寄存器时钟脉冲();
halu延迟(5);
移位寄存器加载脉冲()

您所说的“我没有收到信号。我如何获得信号”是什么意思?您是否尝试过0xFF以外的值?0xC1(11000001b)是一个更好的测试值。它将验证LED上的位顺序以及LED是亮高还是亮低(无法从“图表”中确定)。当您只需要8个时钟脉冲时,您将生成9个时钟脉冲-您将丢失一点(使用0xFF也不会显示)。5毫秒延迟是不必要的-您在脉冲功能中有足够的延迟。如果一个位不是零,它只能是1,因此您不需要在
中明确测试1,否则如果
,为什么设置1,然后重置引脚?您是否正确初始化GPIO引脚作为输出,并在RCC中启用了相应的GPIO时钟?所有GPIO默认为输入,因此我们必须相信您已根据需要初始化I/O。您可以移动
shift\u register\u clk\u pulse()在if/else之后,因为这对两者都很常见。也可能是电路设计问题。图中的“LED”框没有告诉我们任何信息。您的LED指示灯是否正确?