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);
相关推荐
星恒讯工业路由器8 小时前
MCU+WiFi与CPU+WiFi模块区别
单片机·嵌入式硬件
LCMICRO-133108477468 小时前
长芯微LD7940完全P2P替代AD7940,是一款14位、逐次逼近型模数转换器(ADC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·模数转换器adc
进击的小头10 小时前
20_第20篇:嵌入式外设驱动开发基础:寄存器级开发与库函数开发对比实战
arm开发·驱动开发·单片机
guygg8811 小时前
基于STM32的智能小区管理系统设计
stm32·单片机·嵌入式硬件
Deitymoon11 小时前
STM32——震动传感器控制led
stm32·单片机·嵌入式硬件
bubiyoushang88812 小时前
51单片机MPU6050 DMP驱动实现
单片机·嵌入式硬件·51单片机
Deitymoon13 小时前
STM32——继电器
stm32·单片机·嵌入式硬件
恶魔泡泡糖13 小时前
stm32F103C8T6标准库外部中断的概念
stm32·单片机·嵌入式硬件
VBsemi-专注于MOSFET研发定制14 小时前
高端LED封装自动化产线功率MOSFET选型方案——精密、高效与可靠驱动系统设计指南
运维·单片机·自动化
LCG元15 小时前
STM32项目实战:基于STM32F103的智能台灯控制
stm32·单片机·嵌入式硬件