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);
相关推荐
sramdram9 小时前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
科芯创展13 小时前
3.5A,60VIN,异步降压芯片,XZ1815
单片机·嵌入式硬件
Kuakewei88815 小时前
PW2609A在2.6A负载下压差0.14V,温升较3A工况低11°C
单片机·嵌入式硬件
Zyed15 小时前
[FreeRTOS]Day7项目介绍
stm32·单片机·嵌入式硬件
xuxie9916 小时前
start7 电机闭环控制
单片机·嵌入式硬件
LCG元17 小时前
嵌入式开发踩坑排查实战:从 STM32 外设初始化到 Linux SPI 驱动的 15 类硬件疑难故障深度复盘
linux·stm32·单片机
piaoyiren18 小时前
基于 STM32F103 蓝牙遥控云台超声波避障小车
stm32·单片机·嵌入式硬件·蓝牙·超声波测距·直流电机
Zyed19 小时前
[FreeRTOS]Day8-Part1队列+红外遥控器玩游戏+旋转编码器玩游戏
stm32·单片机·玩游戏
JSMSEMI1119 小时前
JSM4430 30V N 沟道增强型 MOSFET
单片机·嵌入式硬件
安妮细水长流1 天前
汽车电子面试问题记录
单片机