基于HAL库的LED驱动库

led.h

/**
  ********************************************************************************
  * @file      led.h
  * @brief     本文件包含一些led基本操作函数的定义,包括LED的亮、灭,闪烁
  * @author    Jia Yasen
  * @date      2022-5-23
  * @version   V0.0.1
  * @copyright Etherealize
  ********************************************************************************
  * @attention 1.本文件的函数均基于HAL库,由于LED的初始化基于GPIO的初始化,GPIO的初始化
  *            直接在CubeMX中配置,用CubeMX生成的GPIO初始化函数来初始化.
  *            2.由于不同板子的对应引脚不同,使用前需先对照原理图修改LED引脚的对应及LED
  *            亮灭状态与引脚高低电平的对应
  ********************************************************************************
  */
#ifndef __LED_H__
#define __LED_H__
/*-----------------------------Includes---------------------------------------*/
//根据使用的芯片型号进行修改
#include "stm32f1xx_hal.h" 
/*-----------------------------Define-----------------------------------------*/
//定义LED的GPIO组号和引脚号;使用前需要根据板子的原理图进行修改
#define LED1_PORT GPIOx
#define LED1_PIN  GPIO_PIN_x
//若需要多个LED可再添加定义
//定义LED亮与灭对应的引脚电平状态,不同电路设计的对应不同,使用前需先对照原理图修改
#define LED_STATE_ON  GPIO_PIN_RESET
#define LED_STATE_OFF GPIO_PIN_SET
/*-----------------------------TypeDef----------------------------------------*/
typedef struct 
{
    GPIO_TypeDef* led_port;
    uint16_t led_pin;

}LED_TypeDef;
/*-----------------------------variables--------------------------------------*/
//声明成外部变量,这样可以在引用了该头文件的文件中使用这个变量
//若需要使用多个LED则自行定义
extern LED_TypeDef LED1;
/*-----------------------------Function---------------------------------------*/
void LED_Init(void);
void LED_ON(LED_TypeDef LED_Ptr);
void LED_OFF(LED_TypeDef LED_Ptr);
void LED_Blink(LED_TypeDef LED_Ptr, uint32_t Delay);

#endif
/************************ (C) COPYRIGHT Etherealize*****END OF FILE***********/

led.c

/**
  ********************************************************************************
  * @file      led.c
  * @brief     led操作源文件,整体操作均通过一个LED结构体来实现
  * @author    Jia Yasen
  * @date      2022-5-23
  * @version   V0.0.1
  * @copyright Etherealize
  ********************************************************************************
  */
/*-----------------------------Includes---------------------------------------*/
#include "led.h"
/*-----------------------------variables--------------------------------------*/
//若需要使用多个LED,可再定义多个LED结构体
//LED_TypeDef* LED1_Ptr;
//若定义结构体指针,则需要给指针开辟空间,只是定义指针的话是不会开辟空间的.可以直接定义结构体
//定义结构体的同时就开辟好了空间,当需要在函数内对结构体的值进行修改时,传递地址即可
LED_TypeDef LED1;
/*-----------------------------Function---------------------------------------*/

/**
  * @brief      LED结构体指针初始化
  * @param[in]  None
  * @return     None 
  * @details    使用时手动修改要赋值的指针与其对应值
  */
void LED_Init(void)
{
    //初始化LED对应的GPIO组号与引脚序号
    LED1.led_port = LED1_PORT;
    LED1.led_port = LED1_PIN;
}

/**
  * @brief      点亮LED
  * @param[in]  LED  要操作的LED结构体
  * @return     None 
  * @details    因为不需要修改结构体内的值,只是读取,所以不用传递指针,只传递结构体即可
  */
void LED_ON(LED_TypeDef LED)
{
    //引脚置对应的位
    HAL_GPIO_WritePin(LED.led_port, LED.led_pin, LED_STATE_ON);
}

/**
  * @brief      熄灭LED
  * @param[in]  LED  要操作的LED结构体
  * @return     None 
  * @details    因为不需要修改结构体内的值,只是读取,所以不用传递指针,只传递结构体即可
  */
void LED_OFF(LED_TypeDef LED)
{
    //引脚置对应的位
    HAL_GPIO_WritePin(LED.led_port, LED.led_pin, LED_STATE_OFF);
}

/**
  * @brief      LED闪烁
  * @param[in]  LED  要操作的LED结构体
  *             Delay    LED闪烁的半周期(ms),即一次亮或暗持续的时间,一次亮+暗为一个闪烁周期。
  * @return     None 
  * @attention  使用时若想达到LED持续闪烁的效果,需要把该函数放到死循环中
  */
void LED_Blink(LED_TypeDef LED, uint32_t Delay)
{
    LED_ON(LED);//点亮LED
    HAL_Delay(Delay);//亮的状态持续Delay ms
    LED_OFF(LED);//熄灭LED
    HAL_Delay(Delay);//暗的状态持续Delay ms

}

/************************ (C) COPYRIGHT Etherealize*****END OF FILE***********/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的基于STM32HAL库的AT24C128驱动程序示例: 首先需要定义I2C总线的句柄: ```c I2C_HandleTypeDef hi2c1; //定义I2C1句柄 ``` 然后需要初始化I2C总线和AT24C128芯片: ```c void AT24C128_Init(void) { uint8_t init_data[3] = {0x00, 0x00, 0x00}; //初始化数据 //初始化I2C总线 hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } //写入初始化数据 HAL_I2C_Mem_Write(&hi2c1, AT24C128_ADDRESS, 0x00, I2C_MEMADD_SIZE_16BIT, init_data, 3, 100); } ``` 接下来是读写函数: ```c void AT24C128_Write(uint16_t address, uint8_t *data, uint16_t len) { uint16_t timeout = 100; uint8_t addr[2]; addr[0] = (uint8_t)(address >> 8); //高8位地址 addr[1] = (uint8_t)address; //低8位地址 //等待芯片准备好 while (HAL_I2C_IsDeviceReady(&hi2c1, AT24C128_ADDRESS, 1, timeout) != HAL_OK) { if (timeout-- == 0) { Error_Handler(); } } //写入数据 HAL_I2C_Mem_Write(&hi2c1, AT24C128_ADDRESS, address, I2C_MEMADD_SIZE_16BIT, data, len, 100); } void AT24C128_Read(uint16_t address, uint8_t *data, uint16_t len) { uint16_t timeout = 100; uint8_t addr[2]; addr[0] = (uint8_t)(address >> 8); //高8位地址 addr[1] = (uint8_t)address; //低8位地址 //等待芯片准备好 while (HAL_I2C_IsDeviceReady(&hi2c1, AT24C128_ADDRESS, 1, timeout) != HAL_OK) { if (timeout-- == 0) { Error_Handler(); } } //读取数据 HAL_I2C_Mem_Read(&hi2c1, AT24C128_ADDRESS, address, I2C_MEMADD_SIZE_16BIT, data, len, 100); } ``` 最后是一个简单的测试代码: ```c #define DATA_LEN 8 uint8_t data_write[DATA_LEN] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; uint8_t data_read[DATA_LEN]; int main(void) { HAL_Init(); AT24C128_Init(); //写入数据 AT24C128_Write(0x0000, data_write, DATA_LEN); //读取数据 AT24C128_Read(0x0000, data_read, DATA_LEN); while (1) { //检查读取到的数据是否正确 if (memcmp(data_write, data_read, DATA_LEN) == 0) { //数据正确 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); } else { //数据错误 HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); HAL_Delay(500); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RobotFreak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值