STM32+74HC595

74HC595功能是将串行数据(由SHCP\CLK、DS\DATA输入串行数据)转换并行数据(芯片上的QA~QH八个数据输出口);

具体工作方式是:由CLK提供时钟,DATA输入高低电平(数据),CLK每输入一个上升沿,数据移位,当所有数据输入完成后,CS\STCP输入一个上升沿,将数据输出到8个输出口;

如果要使用多个HC595,只需将HC595的Q7S接入下一个HC595的DS\DATA, 提供相同的CLK,当然CS\STCP也相同(同时输出)。

分析如上时序图:

SI\DS\TATA   数据输入

SCK\SHCP\CLK   上升沿 移位寄存器移位

RCK\STCP\DS      上升沿 将移位寄存器中数据输出到8个口

OE    低电平输出使能(如果用HC595控制数码管、LED,可以将PWM输入OE以控制亮度)

 

 

SHCP\CLK即时钟信号,DS\DATA在一开始输入一段高电平,即输入1,在这段高电平中间,SHCP\CLK 输入了一个上升沿,所以会将1移入移位寄存器,因为在一开始MR\SCLR(低电平清零移位寄存器)输入了一段低电平,所以移入1后,此时移位寄存器应该是:1000 0000 ,再之后便是RCK\STCP\DS 输入了一个上升沿,将 移位寄存器 中的数据进入 存储寄存器 ,因为此时OE为低电平,所以会将 存储寄存器 中数据通过QA~QH 8个口输出,此时应该是QA为高电平,其他为低电平,即QA~QH:1000 0000。

然后RCK\STCP\DS 又输入了一个上升沿,所以应该是QB为高电平,其他为低电平,QA~QH: 0100 0000。以此类推。

直到输入了第8个上升沿QA~QH: 0000 0001 

第9个上升沿: QA~QH: 0000 0000   Q2A~Q2H: 1000 0000

 

本次顺便学习了一下STM32CubeMX的使用,STM32CubeMX目前只支持HAL库和LL库,所以我的程序使用的是HAL库,一般学习初学STM32都是使用正点原子的板子和例程,使用的是标准库,所以不能直接copy(挺简单的自己重新写一下就行)。

程序:

#include "hc595.h"

#include "stm32f1xx_hal.h"

#define HC595_CLK_H()    HAL_GPIO_WritePin(GPIOB, HC595_CLK_Pin, GPIO_PIN_SET)
#define HC595_CLK_L()    HAL_GPIO_WritePin(GPIOB, HC595_CLK_Pin, GPIO_PIN_RESET)

#define HC595_DATA_H()   HAL_GPIO_WritePin(GPIOB, HC595_DATA_Pin, GPIO_PIN_SET)
#define HC595_DATA_L()   HAL_GPIO_WritePin(GPIOB, HC595_DATA_Pin, GPIO_PIN_RESET)

#define HC595_CS_H()     HAL_GPIO_WritePin(GPIOB, HC595_CS_Pin, GPIO_PIN_SET)
#define HC595_CS_L()     HAL_GPIO_WritePin(GPIOB, HC595_CS_Pin, GPIO_PIN_RESET)

#define HC595_CLK_UP()   HC595_CLK_L();\
                         __NOP();\
                         HC595_CLK_H()
#define HC595_CS_UP()    HC595_CS_L();\
                         __NOP();\
                         HC595_CS_H()
                         
/*
16  VCC          电源              2V-6V
15  QA           并行输出          QB QC QD
14  SI/DS        DATA             串行数据输入
13  OE_          输出使能          PWM控制亮度
12  RCK/STCP     CS               输出到锁存器时钟
11  SCK/SHCP     CLK              DATA输入时钟
10  SCLR/MR      低电平清零        接VCC
9  SQH/Q7S       串行数据输出       接下一个595

*/
void HC595SendData(uint8_t data)
{
    uint8_t j;
    for (j = 0; j < 8; j++)
    {
        if(((data<<j) & 0x80) !=0) 
            HC595_DATA_H();
        else 
            HC595_DATA_L();
        
        HC595_CLK_UP();
    }
    //HC595Load();
}

void HC595Load(void)
{
    HC595_CS_UP();
}

void LedRowOn(uint8_t Row7_0, uint8_t Row15_8, uint8_t Row16_23,uint8_t Row31_24)
{
    HC595SendData(Row15_8);
    HC595SendData(Row7_0);
    HC595SendData(Row31_24);
    HC595SendData(Row16_23);
    HC595Load();
}


void LedRowOut(uint32_t Data)
{
    // HC595SendData(Data >> 24);
    //HC595SendData(Data >> 16);
    HC595SendData(Data >> 8);
    HC595SendData(Data >> 0);
    HC595Load();
}
while(1) {
    uint32_t val = 1;
    for(int i=0; i<16; i++)
    {
        LedRowOut(val);
        val <<= 1;
        delay_ms(100);
    }
}
 

结束。

### 回答1: STM32是意法半导体公司提供的一系列高性能32位单片机微控制器,HAL代表硬件抽象层,是一种软件库,用于简化底层硬件的访问和控制。74HC595是一种串行输入、并行输出的移位寄存器芯片,常用于扩展I/O口。 使用STM32 HAL库驱动74HC595芯片控制LED可以实现对多个LED的灯光控制。 首先,需要通过STM32 HAL库中GPIO库的函数设置74HC595芯片的串行输入数据引脚(如DS引脚)、时钟输入引脚(如SHCP引脚)和存储器锁存使能引脚(如STCP引脚)为输出模式。然后,使用STM32 HAL库的GPIO库函数将DS引脚输出的数据序列加载到74HC595芯片的移位寄存器中。最后,使用STM32 HAL库的GPIO库函数将相应的数据序列时钟输入到74HC595芯片,将寄存器中的数据并行输出到控制LED的引脚上。 通过这种方式,可以利用74HC595芯片的扩展性,实现对大量LED的灯光控制,减少了STM32芯片上I/O口资源的占用。同时,使用STM32 HAL库的函数可以简化编程的复杂性,提高开发效率。 综上所述,通过STM32 HAL库驱动74HC595芯片控制LED可以实现灯光控制的灵活性和扩展性,并且减少了编程的复杂度。 ### 回答2: STM32是一种微控制器系列,而HAL代表STM32的硬件抽象层(Hardware Abstraction Layer)。74HC595是一种8位串行输入/并行输出移位寄存器,可以用来驱动LED灯。 在使用STM32 HAL和74HC595驱动LED的过程中,首先需要将74HC595连接到STM32上。可以通过将STM32的引脚与74HC595的输入引脚连接起来来实现。然后,通过STM32 HAL提供的库函数,可以通过SPI或GPIO控制器来传输数据到74HC595。 使用STM32 HAL和74HC595驱动LED的方法如下: 1. 初始化SPI或GPIO控制器。根据具体的STM32型号和使用的接口,选择合适的SPI或GPIO控制器,并进行初始化设置。 2. 定义和初始化74HC595相关的引脚。使用STM32 HAL提供的库函数,设置74HC595的数据引脚(DS)、时钟引脚(SHCP)以及锁存引脚(STCP或RCLK)为输出。 3. 编写发送函数。使用STM32 HAL提供的库函数,编写一个发送函数来发送数据到74HC595。如果使用SPI控制器,可以使用HAL_SPI_Transmit函数发送数据;如果使用GPIO控制器,可以使用HAL_GPIO_WritePin函数控制引脚的电平。 4. 编写控制函数。编写一个控制函数,将需要展示的LED灯的状态信息写入数据缓冲区,并调用发送函数将数据发送到74HC595。 5. 在主函数中调用控制函数。在主函数中调用控制函数来控制LED灯的状态。可以通过循环调用控制函数,实现LED的闪烁等效果。 综上所述,使用STM32 HAL和74HC595驱动LED需要连接硬件和编写相应的控制函数,并通过SPI或GPIO控制器来实现数据的传输和发送。通过控制LED灯的状态,可以实现各种效果,如开关、闪烁等。 ### 回答3: STM32(单片机)是一种基于ARM Cortex-M内核的微控制器系列,提供了丰富的硬件外设和HAL(硬件抽象层)库,用于简化软件开发过程。 74HC595是一种串行输入并行输出的移位寄存器,常用于扩展输出口的数量。它可以通过串行数据输入来控制多个LED灯的点亮状态。通过STM32的HAL库,我们可以轻松地控制74HC595来控制LED灯。 首先,我们需要设置STM32的引脚用作SPI(串行外设接口)的输出引脚。然后,我们需要初始化SPI外设,并设置参数如数据大小、控制模式等。接下来,我们可以使用HAL库中提供的函数来发送数据到74HC595。 当我们想要控制LED灯时,我们可以将需要点亮的LED编号、引脚电平等信息转换为二进制形式,然后通过SPI发送给74HC595。通过移位寄存器的功能,我们可以依次将每一位数据输出到74HC595的串行输入引脚,然后通过控制引脚的上升沿时钟信号来将数据发送到并行输出引脚。 这样,通过循环发送数据到74HC595,我们可以控制多个LED的点亮状态。例如,可以将某一位的状态设置为高电平来点亮对应的LED灯。 总而言之,使用STM32的HAL库和74HC595移位寄存器,我们能够简化控制多个LED灯的过程,使得硬件开发更加高效。通过设置引脚和使用SPI通信,我们可以实现对LED灯的灵活控制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值