STM32H750XB_RT-THREAD/I2C—AP3216C(光照三合一)/3.AP3216C全功能例程_(硬件I2C)/User/main.c
2025-07-21 14:34:29 +08:00

172 lines
4.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2019-xx-xx
* @brief AP3216C 读光照实验
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 H750 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "main.h"
#include "stm32h7xx.h"
#include "./usart/bsp_debug_usart.h"
#include "./led/bsp_led.h"
#include "./delay/core_delay.h"
#include "./i2c/bsp_i2c.h"
#include "./ap3216c/ap3216c.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/**/
float ALS = 0.0;
uint16_t PS = 0;
uint16_t IR = 0;
uint8_t IntStatus;
HAL_Init();
/* 配置系统时钟为480 MHz */
SystemClock_Config();
/* 开启ICache */
SCB_EnableICache();
LED_GPIO_Config();
/* 初始化内核延时 */
HAL_InitTick(5);
/*初始化USART 配置模式为 115200 8-N-1中断接收*/
DEBUG_USART_Config();
printf("\r\n 欢迎使用野火 STM32 H750 开发板。\r\n");
printf("\r\n 这是一个三合一光照传感器测试例程 \r\n");
printf(" 芯片初始化中.....\n");
/* 初始化 光照传感器 */
ap3216c_init();
while(1)
{
IntStatus = ap3216c_get_IntStatus(); // 先读状态位读ADC数据位会清除状态位默认设置
ALS = ap3216c_read_ambient_light();
PS = ap3216c_read_ps_data();
IR = ap3216c_read_ir_data();
printf("\n光照强度是:%.2fLux\n红外强度是:%d\n", ALS, IR);
if (PS == 55555) // IR 太强 PS 数据无效
printf("IR 太强 PS 数据无效\n");
else
{
printf("接近距离是:%d\n", PS & 0x3FF);
}
if ((PS >> 15) & 1)
printf("物体接近\n");
else
printf("物体远离\n");
if (IntStatus & 0x1)
printf("ALS 产生中断\n");
if (IntStatus >> 1 & 0x1)
printf("PS 产生中断\n");
LED2_TOGGLE;
HAL_Delay(225);// 最小采样间隔225ms
}
}
/**
* @brief System Clock 配置
* system Clock 配置如下:
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 480000000 (CPU Clock)
* HCLK(Hz) = 240000000 (AXI and AHBs Clock)
* AHB Prescaler = 2
* D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
* D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
* D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
* D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
* HSE Frequency(Hz) = 25000000
* PLL_M = 5
* PLL_N = 160
* PLL_P = 2
* PLL_Q = 4
* PLL_R = 2
* VDD(V) = 3.3
* Flash Latency(WS) = 4
* @param None
* @retval None
*/
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
HAL_StatusTypeDef ret = HAL_OK;
/*使能供电配置更新 */
MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);
/* 当器件的时钟频率低于最大系统频率时,电压调节可以优化功耗,
关于系统频率的电压调节值的更新可以参考产品数据手册。 */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/* 启用HSE振荡器并使用HSE作为源激活PLL */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 5;
RCC_OscInitStruct.PLL.PLLN = 160;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLQ = 4;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
if(ret != HAL_OK)
{
while(1) { ; }
}
/* 选择PLL作为系统时钟源并配置总线时钟分频器 */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | \
RCC_CLOCKTYPE_HCLK | \
RCC_CLOCKTYPE_D1PCLK1 | \
RCC_CLOCKTYPE_PCLK1 | \
RCC_CLOCKTYPE_PCLK2 | \
RCC_CLOCKTYPE_D3PCLK1);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
if(ret != HAL_OK)
{
while(1) { ; }
}
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/