利用STM32F030软件SPI和硬件SPI控制74HC595

本文介绍如何利用STM32F030R8微控制器通过硬件SPI接口与74HC595移位寄存器进行交互,并控制8路继电器的操作。文中详细描述了硬件连接方式、STM32CubeMX配置步骤及代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仅仅作为一个调试记录,供硬件设计使用。

环境

硬件:NUCLEO-F030R8。某宝购买的74HC595模组,包括8路继电器。
开发环境:Win10+IAR EWARM 8.22.1

原理图

只是一个示意性的原理图,我自己不想画了,虽然图片的IO脚和主芯片不同。
在这里插入图片描述
我用的芯片型号为STM32F030R8。对应的实际IO接线如下:

              595侧                                 芯片侧
11  SCK   数据输入时钟线           SHCP     Clock    SPI2_SCK         PB13
12  RCK   输出存储锁存时钟线       STCP     Latch    SPI2_NSS         PB12
13  OE    输出使能     接地        OE                GND
14   SI   数据线                  DS1      DATA     SPI2_MOSI        PB15

STM32CubmeMX 配置

时钟配置

由于板子没有焊接晶振。配置方法如下:
在这里插入图片描述
配置 RCC 只是为了调试测试主频是否正确。时钟配置如下图:
在这里插入图片描述

硬件SPI配置

STM32F030有两路硬件SPI,都可以使用。这里我配置了SPI2。详细配置如下图:
在这里插入图片描述
注意:由于 595 只收不发,MISO 引脚是没有使用的。SPI 的模式可以配置为 Transmit Only Master,这样可以节约一个 IO。

代码

使用硬件 SPI 控制 74HC595 非常简单,上述配置完成后,只需要点击生成代码即可。然后在 main() 函数中添加 SPI 发送指令即可。如下:

  /* USER CODE BEGIN 1 */
  uint8_t cmd=0xAA;

  /* USER CODE END 1 */
  ...
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_SPI_Transmit(&hspi2, &cmd, 1, 1000);

也就是向 74HC595 发送数据 0xAA,595 后级接继电器,就可以看到对应继电器的动作。

小结

个人以为,有硬件 SPI 支持,可以充分发挥硬件的强大作用。

软件SPI配置

软件 SPI 配置如下图:
在这里插入图片描述

代码

我们需要自己实现 595 发送代码。对应的代码如下:

/*
软件SPI调试正常
SHCP -> PB13
STCP -> PB12
DS1  -> PB15
//Configure GPIO pins : PB12 PB13 PB14 PB15
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
*/
void HC595SendData(uint8_t SendVal)  
{  
  uint8_t i;  
  for (i=0; i<8; i++) {  
    /*--step1、串行输入引脚,所谓串行就是使数据在一根信号线上按顺序一位一位地传输*/  
    if (((SendVal << i) & 0x01) != 0 )   
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
    else   
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);

    /*--step2、SHCP发生一次上升沿的时候,74HC595才会从DS引脚上取得当前的数据*/  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
  }  

  /*--step3、当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)*/    
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
  HAL_Delay(100);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}  

注意,代码是将 PB14 配置为输出的。这个没什么影响,因为没有使用到 PB14。正确应该将 PB14 配置为输入。我懒得重新生成代码了。

系统完整照片

用的是杜邦线连接,有点丑。测试系统将就用一下。
在这里插入图片描述
如上图所示,继电器对应的灯已经点亮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值