基于STM32的74HC595 IO扩展板卡设计

发布时间:2023-08-15  

自己做了一块74HC595的IO扩展板卡,出于灵活考虑,没有都采用级联的方式,而是2组多芯片级联的结构。基于STM32平台设计。
image.png

结构示意图

image.png

74HV595内部结构图

头文件:


#ifndef __74HC595_H__

#define __74HC595_H__



#include "main.h"



typedef struct{

  GPIO_TypeDef* GPIOx;

  uint16_t GPIO_Pin;

}strHC595_Port;



//非级联74HC595芯片组数

#define HC595_GROUP_NUMBER  2



/* 第一组芯片 */

//使能

#define HC595_OE1_RCC_GPIOX_EN      __HAL_RCC_GPIOA_CLK_ENABLE()

#define HC595_OE1_GPIO          GPIOA

#define HC595_OE1_PIN          GPIO_PIN_4

//锁存

#define HC595_RCLK1_RCC_GPIOX_EN    __HAL_RCC_GPIOA_CLK_ENABLE()

#define HC595_RCLK1_GPIO        GPIOA

#define HC595_RCLK1_PIN          GPIO_PIN_6

//时钟

#define HC595_SRCLK1_RCC_GPIOX_EN    __HAL_RCC_GPIOA_CLK_ENABLE()

#define HC595_SRCLK1_GPIO        GPIOA

#define HC595_SRCLK1_PIN        GPIO_PIN_7

//清除

#define HC595_SRCLR1_RCC_GPIOX_EN    __HAL_RCC_GPIOA_CLK_ENABLE()

#define HC595_SRCLR1_GPIO        GPIOA

#define HC595_SRCLR1_PIN        GPIO_PIN_5

//数据

#define HC595_DATA1_RCC_GPIOX_EN    __HAL_RCC_GPIOC_CLK_ENABLE()

#define HC595_DATA1_GPIO        GPIOC

#define HC595_DATA1_PIN          GPIO_PIN_4





/* 第二组芯片 */

//使能

#define HC595_OE2_RCC_GPIOX_EN      __HAL_RCC_GPIOA_CLK_ENABLE()

#define HC595_OE2_GPIO          GPIOB

#define HC595_OE2_PIN          GPIO_PIN_3

//锁存

#define HC595_RCLK2_RCC_GPIOX_EN    __HAL_RCC_GPIOB_CLK_ENABLE()

#define HC595_RCLK2_GPIO        GPIOB

#define HC595_RCLK2_PIN          GPIO_PIN_5

//时钟

#define HC595_SRCLK2_RCC_GPIOX_EN    __HAL_RCC_GPIOB_CLK_ENABLE()

#define HC595_SRCLK2_GPIO        GPIOB

#define HC595_SRCLK2_PIN        GPIO_PIN_6

//清除

#define HC595_SRCLR2_RCC_GPIOX_EN    __HAL_RCC_GPIOB_CLK_ENABLE()

#define HC595_SRCLR2_GPIO        GPIOB

#define HC595_SRCLR2_PIN        GPIO_PIN_4

//数据

#define HC595_DATA2_RCC_GPIOX_EN    __HAL_RCC_GPIOB_CLK_ENABLE()

#define HC595_DATA2_GPIO        GPIOB

#define HC595_DATA2_PIN          GPIO_PIN_7



extern void HC595_Init(void);

extern uint8_t HC595_write(uint8_t group,uint8_t nbit,uint32_t datas);



#endif /*__74HC595_H__*/

源文件:


复制

#include "74HC595.h"



strHC595_Port HC595_OE_Port[HC595_GROUP_NUMBER]=

{        

  {HC595_OE1_GPIO,HC595_OE1_PIN},

  {HC595_OE2_GPIO,HC595_OE2_PIN},

  //元素个数与HC595_GROUP_NUMBER对应

};



strHC595_Port HC595_RCLK_Port[HC595_GROUP_NUMBER]=

{        

  {HC595_RCLK1_GPIO,HC595_RCLK1_PIN},

  {HC595_RCLK2_GPIO,HC595_RCLK2_PIN},

  //元素个数与HC595_GROUP_NUMBER对应

};



strHC595_Port HC595_SRCLK_Port[HC595_GROUP_NUMBER]=

{        

  {HC595_SRCLK1_GPIO,HC595_SRCLK1_PIN},

  {HC595_SRCLK2_GPIO,HC595_SRCLK2_PIN},

  //元素个数与HC595_GROUP_NUMBER对应

};



strHC595_Port HC595_SRCLR_Port[HC595_GROUP_NUMBER]=

{        

  {HC595_SRCLR1_GPIO,HC595_SRCLR1_PIN},

  {HC595_SRCLR2_GPIO,HC595_SRCLR2_PIN},

  //元素个数与HC595_GROUP_NUMBER对应

};



strHC595_Port HC595_DATA_Port[HC595_GROUP_NUMBER]=

{        

  {HC595_DATA1_GPIO,HC595_DATA1_PIN},

  {HC595_DATA2_GPIO,HC595_DATA2_PIN},

 //元素个数与HC595_GROUP_NUMBER对应

};

//操作接口宏定义

#define HC595_OE_PIN(X)      HC595_OE_Port[X].GPIO_Pin

#define HC595_OE_GPIO(X)    HC595_OE_Port[X].GPIOx  

#define HC595_OE_H(X)      HAL_GPIO_WritePin(HC595_OE_GPIO(X), HC595_OE_PIN(X), GPIO_PIN_SET)

#define HC595_OE_L(X)      HAL_GPIO_WritePin(HC595_OE_GPIO(X), HC595_OE_PIN(X), GPIO_PIN_RESET)



#define HC595_RCLK_PIN(X)    HC595_RCLK_Port[X].GPIO_Pin

#define HC595_RCLK_GPIO(X)    HC595_RCLK_Port[X].GPIOx  

#define HC595_RCLK_H(X)      HAL_GPIO_WritePin(HC595_RCLK_GPIO(X), HC595_RCLK_PIN(X), GPIO_PIN_SET)

#define HC595_RCLK_L(X)      HAL_GPIO_WritePin(HC595_RCLK_GPIO(X), HC595_RCLK_PIN(X), GPIO_PIN_RESET)



#define HC595_SRCLK_PIN(X)    HC595_SRCLK_Port[X].GPIO_Pin

#define HC595_SRCLK_GPIO(X)    HC595_SRCLK_Port[X].GPIOx  

#define HC595_SRCLK_H(X)    HAL_GPIO_WritePin(HC595_SRCLK_GPIO(X), HC595_SRCLK_PIN(X), GPIO_PIN_SET)

#define HC595_SRCLK_L(X)    HAL_GPIO_WritePin(HC595_SRCLK_GPIO(X), HC595_SRCLK_PIN(X), GPIO_PIN_RESET)



#define HC595_SRCLR_PIN(X)    HC595_SRCLR_Port[X].GPIO_Pin

#define HC595_SRCLR_GPIO(X)    HC595_SRCLR_Port[X].GPIOx  

#define HC595_SRCLR_H(X)    HAL_GPIO_WritePin(HC595_SRCLR_GPIO(X), HC595_SRCLR_PIN(X), GPIO_PIN_SET)

#define HC595_SRCLR_L(X)    HAL_GPIO_WritePin(HC595_SRCLR_GPIO(X), HC595_SRCLR_PIN(X), GPIO_PIN_RESET)



#define HC595_DATA_PIN(X)    HC595_DATA_Port[X].GPIO_Pin

#define HC595_DATA_GPIO(X)    HC595_DATA_Port[X].GPIOx  

#define HC595_DATA_H(X)      HAL_GPIO_WritePin(HC595_DATA_GPIO(X), HC595_DATA_PIN(X), GPIO_PIN_SET)

#define HC595_DATA_L(X)      HAL_GPIO_WritePin(HC595_DATA_GPIO(X), HC595_DATA_PIN(X), GPIO_PIN_RESET)



void HC595_delay_us(uint8_t t_us)

{

  //修改为系统中对应的微秒级延时函数,根据实际需求可以换成更小的ns级延时

  delay_us(t_us);

}

/*

*描述:初始化HC595_GROUP_NUMBER组芯片对应的控制引脚

*/

void HC595_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  uint8_t i = 0;


  /* GPIO Ports Clock Enable */

  //第一组芯片引脚时钟

  HC595_OE1_RCC_GPIOX_EN;

  HC595_RCLK1_RCC_GPIOX_EN;

  HC595_SRCLK1_RCC_GPIOX_EN;

  HC595_SRCLR1_RCC_GPIOX_EN;

  HC595_DATA1_RCC_GPIOX_EN;

  //第二组芯片引脚时钟

  HC595_OE2_RCC_GPIOX_EN;

  HC595_RCLK2_RCC_GPIOX_EN;

  HC595_SRCLK2_RCC_GPIOX_EN;

  HC595_SRCLR2_RCC_GPIOX_EN;

  HC595_DATA2_RCC_GPIOX_EN;

  /*Configure GPIO pin */

  for(i=0; i


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    可用 Keil(C51)介绍、下载、安装与注册 准备51开发板(STC系列芯片的或其他)或者安装proteus 开发板一般推荐购买一套,仿真的编程环境和真实环境有出入(51开发......
    下载。代码烧写传输是通过51单片机的uart串口信号线Tx,Rx完成的,stc单片机实现isp下载是因为芯片内部有厂商的固化代码,上电复位后是先执行固化代码,检测串口有无接收到特定的命令,如果......
    51单片机仿真芯片调试;实验环境:Keil软件,版本:C51 V9.54 STC-ISP综合下载软件,版本:V6.88 仿真芯片:IAP15W4K58S4 51单片机在线仿真环境搭建 第一步:将......
    ,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52......
    是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52......
    是兼容的。无论stc还是at都一样,引脚功能都是一样的,程序也是一样的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。 以下为本设计资料展示图: 2.仿真......
    :C51 V9.54 STC-ISP综合下载软件,版本:V6.88 仿真芯片:IAP15W4K58S4 51单片机在线仿真环境搭建 第一步:将STC单片机的头文件以及仿真驱动文件添加到Keil软件......
    LED灯 Proteus仿真原理图: 仿真: 知识介绍: Proteus布线 为了让整个原理图看上去简洁明了,我们对元器件的导线进行标号,而不是直接和芯片相连。 定时中断系统简图 定时器资源 定时......
    意仿真中51单片机芯片是通用的,AT89C51,AT89C52都是51单片机的具体型号,内核是兼容的。无论stc还是at都一样,引脚功能都是一样的,程序也是一样的,芯片可以替换为STC89C52......
    亮度越高 需注意仿真中51单片机芯片是通用的,AT89C51,AT89C52都是51单片机的具体型号,内核是兼容的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序也是一样的,芯片......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>