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);
相关推荐
Szime7 小时前
全球首创10位40GSPS超宽带ADC选型参考:国产超高速ADC深智微科技选型支持
科技·单片机·嵌入式硬件·fpga开发
(Morgan)8 小时前
51单片机期末复习知识点总结
stm32·单片机·嵌入式硬件
榴莲llll10 小时前
应用于计时器/微波炉等产品的高亮LED数显驱动VK16K33C 数码管屏显驱动芯片
单片机
华一精品Adreamer11 小时前
T606 vs 骁龙662/RK3566:主流安卓+4G定制平板芯片横向测评指南
单片机
Zyed11 小时前
[STM32]Day9-Part1USART+串口接收+串口收发
stm32·单片机·嵌入式硬件
小慧102413 小时前
手动建立工程模板
stm32·单片机
嵌入式ZYXC14 小时前
STM32烧录一次后无法再次烧录的两种原因
stm32·单片机·嵌入式硬件
踏着七彩祥云的小丑15 小时前
嵌入式测试学习第33 天:压力测试、反复开关机、反复插拔接口测试
单片机·嵌入式硬件·学习
布子麟16 小时前
NodeMcu(ESP8266)之更新固件
单片机·物联网·iot
开发笔记-阿牛16 小时前
CK6159A 可靠性测评:芯片工艺、环境测试与量产稳定性分析
stm32·单片机·嵌入式硬件