N32CUBE 配置N32H473REL7 驱动 74hc595


1.sn74hc595.h
c 复制代码
#ifndef __SN74HC595_H
#define __SN74HC595_H

#include "main.h"  // N32 GPIO 头文件 

//SER  =PA3 =Output
//RCLX =PA1 =Output
//SRCLX=PA5 =Output

#define HC595_SER_PORT    GPIOA
#define HC595_SER_PIN     GPIO_PIN_3    // PA3

#define HC595_RCLK_PORT   GPIOA
#define HC595_RCLK_PIN    GPIO_PIN_1    // PA1

#define HC595_SRCLK_PORT  GPIOA
#define HC595_SRCLK_PIN   GPIO_PIN_5    // PA5

/* 电平操作宏 - 使用 N32 标准库 API */
#define SER_HIGH()        GPIO_SetBits(HC595_SER_PORT, HC595_SER_PIN)
#define SER_LOW()         GPIO_ResetBits(HC595_SER_PORT, HC595_SER_PIN)

#define RCLK_HIGH()       GPIO_SetBits(HC595_RCLK_PORT, HC595_RCLK_PIN)
#define RCLK_LOW()        GPIO_ResetBits(HC595_RCLK_PORT, HC595_RCLK_PIN)

#define SRCLK_HIGH()      GPIO_SetBits(HC595_SRCLK_PORT, HC595_SRCLK_PIN)
#define SRCLK_LOW()       GPIO_ResetBits(HC595_SRCLK_PORT, HC595_SRCLK_PIN)
 
void HC595_Init(void);
void HC595_Delay(void);
void HC595_SendData(uint16_t data);
void HC595_SetLed(uint8_t ledNo, uint8_t value); 
extern uint16_t g_ulTowerData;

#endif
2.sn74hc595.c
c 复制代码
#include "sn74hc595.h"
#include "delay.h" 

uint16_t g_ulTowerData = 0x0000;
#define HC595_DELAY_US  1

/**
 * @brief  发送 16 位数据到 595
 */
void HC595_SendData(uint16_t data)
{
    uint8_t i;
    // 起始保护
    RCLK_LOW();
    systick_delay_us(HC595_DELAY_US);
    SRCLK_LOW();
    systick_delay_us(HC595_DELAY_US);
    // 逐位发送(MSB First)
    for(i = 0; i < 16; i++)
    {
        // 设置 SER 数据
        if(data & 0x8000)  SER_HIGH();
        else  SER_LOW();
        data <<= 1;
        systick_delay_us(HC595_DELAY_US);
        // SRCLK 上升沿
        SRCLK_HIGH();
        systick_delay_us(HC595_DELAY_US);
        SRCLK_LOW();
        systick_delay_us(HC595_DELAY_US);
    }
    // RCLK 上升沿锁存
    RCLK_HIGH();
    systick_delay_us(HC595_DELAY_US);
    RCLK_LOW();
    systick_delay_us(HC595_DELAY_US);
}

/**
 * @brief  设置指定 输出 状态 0~7
 */
void HC595_SetLed(uint8_t ledNo, uint8_t value)
{
    if(ledNo >= 8) return;
    if(value == 0)
        g_ulTowerData &= ~(0x0001 << (ledNo));
    else
        g_ulTowerData |= (0x0001 << (ledNo));
    HC595_SendData(g_ulTowerData);
}

/**
 * @brief  直接设置16位数据(如果扩展到了2个74HC595)
 */
void HC595_SetData(uint16_t data)
{
    g_ulTowerData = data;
    HC595_SendData(data);
}

/**
 * @brief  获取当前输出状态
 * @return 当前16位输出状态
 */
uint16_t HC595_GetData(void)
{
    return g_ulTowerData;
}

生成的代码:

c 复制代码
    GPIO_InitType GPIO_InitStructure;
    GPIO_InitStruct(&GPIO_InitStructure);
    /* Enable the GPIO clock*/
    RCC_EnableAHB1PeriphClk(RCC_AHB_PERIPHEN_GPIOA, ENABLE);
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO,ENABLE);
  
    GPIO_ResetBits(GPIOA,GPIO_PIN_5);
    GPIO_SetBits(GPIOA, GPIO_PIN_3 | GPIO_PIN_1);
     GPIO_InitStructure.GPIO_Pull      = GPIO_NO_PULL;
    GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW;
    GPIO_InitStructure.GPIO_Current   = GPIO_DS_2mA;
    GPIO_InitStructure.GPIO_Alternate = GPIO_NO_AF;
    GPIO_InitStructure.Pin            = GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_1;
    GPIO_InitPeripheral(GPIOA,&GPIO_InitStructure);
相关推荐
归零鸟4 小时前
WD Elements移动硬盘能识别出盘但不能出盘的修复记录
stm32·单片机·嵌入式硬件
追兮兮6 小时前
MCUQuickStart v1.1.0发布,一键生成Keil工程+RTOS模板
stm32·单片机·嵌入式硬件·freertos·gd32·keil5
国科安芯6 小时前
ASP7A84AS与主流架构兼容替代及系统级电源完整性解决方案的深度研究
单片机·嵌入式硬件·架构
kaikaile19956 小时前
STC8单片机实现简单花样DMX512控制器
单片机·嵌入式硬件
rit84324996 小时前
STM32移植NES模拟器指南
stm32·单片机·嵌入式硬件
fengfuyao9856 小时前
STM32 HAL库实现串口DMA接收不定长数据
stm32·单片机·嵌入式硬件
yuan199976 小时前
STM32直流无刷电机六拍方波控制器程序
stm32·单片机·嵌入式硬件
番茄灭世神7 小时前
PN学堂GD32教程第21篇——WiFiIOT
c语言·stm32·单片机·嵌入式·gd32
jghhh019 小时前
基于DSP28335的RS485串口通信与AD采样开发方案
单片机·嵌入式硬件