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 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11018 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
三佛科技-187366133978 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315208 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang8 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
2501_918126918 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315208 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘8 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动
小刘爱玩单片机8 天前
【stm32简单外设篇】- 测速传感器模块(光电)
c语言·stm32·单片机·嵌入式硬件
hateregiste8 天前
嵌入式软件开发中常见知识点问答集锦!
c语言·单片机·嵌入式软件