一、芯片引脚介绍及应用电路
1.芯片引脚
2.应用电路
二、硬件环境
1. STM32F407单片机
2.XJ8831芯片
三、功能模式选择
(一)FLASH MODE
1.实现方式:
FLASH接高电平,通过EN引脚电平的周期变换来实现闪光
2.计算公式
通过FLASH MODE模式,我们主要实现闪光功能,电流大小的控制主要通过RSET和RVFB两个电阻。具体方法实现看下面公式:
VFB=(1.25V/RSET)*11.2K
I(led)=VFB/RFB
(二)TORCH MODE
1.实现方式:
FLASH接低电平,通过EN引脚读取上升沿的个数实现电流大小控制,我们采用定时器延时来实现脉冲宽度
2.读取时序
3.对照表
四、软件程序
AT8831.C
/*
* AT8831.c
*
* Created on: 2024年7月2日
* Author: Administrator
*/
#include "gpio.h"
#include "tim.h"
#include "AT8831.h"
/*********************************************************************************/
/*
* 设置单片机的两个I/O口对AT8831的FLASH和EN进行控制
*
*/
/*********************************************************************************/
void AT8831_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13, GPIO_PIN_RESET);
/*Configure GPIO pins : PDPin PDPin PDPin PDPin */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
/*********************************************************************************/
/*
* FLASH引脚接高,EN接高
*
* FLASH_MODEK可以通过RSET来控制VFB大小
* VFB=(1.25V/RSET)*11.2K
*
* I(led)=VFB/RFB
*
*/
/*********************************************************************************/
void AT8831_FLASH_MODE (void)
{
SET_FLASH_HIGH();
AT8831_FLASH ();
}
/*********************************************************************************/
/*
* 通过设置EN脚的电平周期性变化,从而实现闪灯的
*
*/
/*********************************************************************************/
void AT8831_FLASH (void)
{
while(1)
{
SET_EN_HIGH();
TIM_delay_ms(500);
SET_EN_LOW();
TIM_delay_ms(500);
}
}
/*********************************************************************************/
/*
* FLASH引脚接低,EN接入脉冲
*
* Torch_MODE可以由脉冲个数来控制VFB的大小
* pulse_count=1 VFB=50mV
* pulse_count=2 VFB=60mV
* pulse_count=3 VFB=70mV
* pulse_count=4 VFB=85mV
* pulse_count=5 VFB=100mV
* pulse_count=6 VFB=120mV
* pulse_count=7 VFB=140mV
* pulse_count>=8 VFB=170mV
*
* I(led)=VFB/RFB
*
*/
/*********************************************************************************/
void AT8831_Torch_MODE (int pulse_count)
{
SET_FLASH_LOW();
for(int i=0;i<pulse_count;i++)
{
SET_EN_LOW();
TIM_delay_us(40);
SET_EN_HIGH();
TIM_delay_us(40);
}
SET_EN_HIGH();
TIM_delay_us(500);
}
/*********************************************************************************/
/*
* 通过设置EN脚低电平500us可以关闭AT8831
*
*/
/*********************************************************************************/
void AT8831_OFF_EN (void)
{
SET_EN_LOW();
TIM_delay_us(500);
}
AT8831.H
/*
* AT8831.h
*
* Created on: 2024年7月2日
* Author: Administrator
*/
#ifndef INC_AT8831_H_
#define INC_AT8831_H_
#include "AT8831.h"
#define SET_EN_HIGH() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET)
#define SET_EN_LOW() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)
#define SET_FLASH_HIGH() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET)
#define SET_FLASH_LOW() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET)
void AT8831_Init(void);
void AT8831_Torch_MODE (int pulse_count);
void AT8831_FLASH (void);
void AT8831_OFF_EN (void);
#endif /* INC_AT8831_H_ */
TIM.C
/**
******************************************************************************
* @file tim.c
* @brief This file provides code for the configuration
* of the TIM instances.
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2024 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "tim.h"
/* USER CODE BEGIN 0 */
volatile static uint32_t gs_count = 0;
/* USER CODE END 0 */
TIM_HandleTypeDef htim2;
/* TIM2 init function */
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 42-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 2-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* TIM2 clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM2_CLK_DISABLE();
/* TIM2 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/*基本定时器周期回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
//timer++;
//printf("timer=%d\r\n",timer);
gs_count++;
}
}
/*us级别延时*/
void TIM_delay_us(uint32_t us)
{
uint32_t start_count = gs_count;
while((gs_count - start_count)*2 < us);
}
/*毫秒级的延时*/
void TIM_delay_ms(uint16_t delay_ms)
{
volatile unsigned int num;
for (num = 0; num < delay_ms; num++)
{
TIM_delay_us(1000);
}
}
/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
TIM.H
/**
******************************************************************************
* @file tim.h
* @brief This file contains all the function prototypes for
* the tim.c file
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2024 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TIM_H__
#define __TIM_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern TIM_HandleTypeDef htim2;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_TIM2_Init(void);
/* USER CODE BEGIN Prototypes */
void TIM_delay_us(uint32_t us);
void TIM_delay_ms(uint16_t delay_ms);
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __TIM_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/