一、硬件连接
STM32F103CBT6与AW9523B的硬件连接需遵循I2C通信规范,核心连接如下:
| STM32引脚 | AW9523B引脚 | 功能说明 |
|---|---|---|
| PB6 | SCL | I2C时钟线(需外接4.7kΩ上拉电阻) |
| PB7 | SDA | I2C数据线(需外接4.7kΩ上拉电阻) |
| 3.3V | VCC | 电源(2.4V~5.5V兼容) |
| GND | GND | 共地 |
| PA0 | INT | 中断输出(可选,用于按键唤醒) |
注意:AW9523B的ADDR0/ADDR1引脚需接地(或接VCC),以设置I2C从机地址(默认0x5B)。
二、STM32CubeMX配置
使用STM32CubeMX生成初始化代码,步骤如下:
-
选择芯片:STM32F103CBT6。
-
配置I2C:
-
选择I2C1,模式为"Full Master"。
-
时钟频率:100kHz(标准模式)。
-
使能"GPIO Pull-Up"(PB6/PB7上拉)。
-
-
配置GPIO:
- 将PB6/PB7设置为"Alternate Function Open Drain"(I2C复用)。
-
生成代码:选择"MDK-ARM"作为工具链,生成工程文件。
三、AW9523B驱动代码
以下是AW9523B的核心驱动代码(基于HAL库):
1. 寄存器定义(aw9523b.h)
c
#ifndef __AW9523B_H
#define __AW9523B_H
#include "stm32f1xx_hal.h"
// AW9523B I2C地址(ADDR0=0, ADDR1=0)
#define AW9523B_ADDR 0x5B << 1 // 左移1位(HAL库要求)
// 寄存器地址
#define AW9523B_REG_CFG 0x00 // 配置寄存器(LED模式/ GPIO模式)
#define AW9523B_REG_PWM0 0x01 // PWM0占空比(0~255)
#define AW9523B_REG_PWM1 0x02 // PWM1占空比(0~255)
#define AW9523B_REG_CTRL 0x03 // 控制寄存器(使能PWM)
// 配置参数
#define AW9523B_LED_MODE 0x00 // LED模式(恒流驱动)
#define AW9523B_PWM_EN 0x01 // 使能PWM输出
void AW9523B_Init(I2C_HandleTypeDef *hi2c);
void AW9523B_SetPWM(I2C_HandleTypeDef *hi2c, uint8_t pwm_ch, uint8_t duty);
#endif
2. 驱动实现(aw9523b.c)
c
#include "aw9523b.h"
// 初始化AW9523B(设置为LED模式,使能PWM)
void AW9523B_Init(I2C_HandleTypeDef *hi2c) {
uint8_t cfg_data = AW9523B_LED_MODE;
HAL_I2C_Mem_Write(hi2c, AW9523B_ADDR, AW9523B_REG_CFG, 1, &cfg_data, 1, 100);
uint8_t ctrl_data = AW9523B_PWM_EN;
HAL_I2C_Mem_Write(hi2c, AW9523B_ADDR, AW9523B_REG_CTRL, 1, &ctrl_data, 1, 100);
}
// 设置PWM占空比(pwm_ch:0~1,duty:0~255)
void AW9523B_SetPWM(I2C_HandleTypeDef *hi2c, uint8_t pwm_ch, uint8_t duty) {
uint8_t reg_addr = (pwm_ch == 0) ? AW9523B_REG_PWM0 : AW9523B_REG_PWM1;
HAL_I2C_Mem_Write(hi2c, AW9523B_ADDR, reg_addr, 1, &duty, 1, 100);
}
四、呼吸灯实现
呼吸灯通过线性调整PWM占空比 实现,核心是渐变算法(从0到255再到0循环)。
1. 主函数(main.c)
c
#include "stm32f1xx_hal.h"
#include "aw9523b.h"
I2C_HandleTypeDef hi2c1; // I2C句柄(CubeMX生成)
int main(void) {
HAL_Init();
SystemClock_Config(); // 系统时钟配置(72MHz)
MX_I2C1_Init(); // I2C初始化(CubeMX生成)
AW9523B_Init(&hi2c1); // 初始化AW9523B
uint8_t duty = 0;
int8_t step = 1;
while (1) {
// 设置PWM占空比(控制LED亮度)
AW9523B_SetPWM(&hi2c1, 0, duty);
// 渐变逻辑(0→255→0)
duty += step;
if (duty >= 255) step = -1;
else if (duty <= 0) step = 1;
HAL_Delay(10); // 延迟10ms(调整呼吸速度)
}
}
2. 呼吸灯效果优化
-
非线性渐变 :使用正弦函数调整占空比(
duty = 127 * sin(theta) + 127),使呼吸更自然。 -
多LED同步:通过AW9523B的PWM1通道控制另一盏LED,实现双灯交替呼吸。
参考代码 Stm32fl03CBT6对AW9523B呼吸灯的驱动以及控制实例 www.youwenfan.com/contentcsq/56531.html
五、调试与验证
-
I2C通信测试:使用逻辑分析仪捕获SCL/SDA波形,确认地址(0x5B)和数据传输正确。
-
PWM输出测试 :用示波器测量AW9523B的PWM引脚(如P0.0),确认占空比随
duty变化。 -
呼吸灯效果 :观察LED亮度是否从暗到亮再到暗循环,调整
HAL_Delay参数改变呼吸速度。
六、注意事项
-
I2C地址冲突:若总线上有多个AW9523B,需通过ADDR0/ADDR1引脚设置不同地址(如0x5C、0x5D)。
-
电源稳定性:AW9523B的VCC需并联100nF电容,避免电源噪声影响PWM输出。
-
中断处理:若使用INT引脚(如按键唤醒),需配置EXTI中断,在中断服务函数中处理唤醒事件。
七、扩展应用
-
多灯联动:通过AW9523B的16路LED驱动,实现多盏LED的同步呼吸(如流水灯效果)。
-
传感器联动:结合光敏电阻(如BH1750),实现"环境光暗时呼吸灯亮,环境光亮时呼吸灯灭"的智能控制。