STM32模拟I2C获取TCS34725光学颜色传感器数据

STM32模拟I2C获取TCS34725光学颜色传感器数据

TCS34725是RGB三色颜色传感器,和TCS34727都属于TCS3472系列,在电气特性上略有差别,TCS34727相比TCS34725在I2C总线的访问电平上可以更低,而在I2C软件访问地址方面则一致。
在这里插入图片描述

在这里插入图片描述
TCS3472内部有4个PD(光电二极管),一个接收clear light(净光,未做任何处理),另外三个分别接收Red, Green, Blue的三色光,并且会滤除红外光。

TCS3472访问特征

  1. TCS34725和TCS34727软件方面在Device ID不同(非I2C访问地址),其它方面则相同。
    在这里插入图片描述
  2. TCS3472在做寄存器访问时,5位寄存器地址在命令字节里发布:
    在这里插入图片描述
    而在进行有效的命令字节发布时,这个字节最高位要求为1。而命令字节的TYPE则是访问过程的功能指定,为00时说明后面按byte直接访问寄存器,为01则说明后面按照byte连续操作方式操作寄存器(连读),这个时候有个影子寄存器的功能,保证对于两个字节的数据读取,前一个字节读的时候后一个字节被保护,避免前一个字节读完要读后一个字节前,后一个寄存器的数据被新的数据过来改写了,从而产生不一致。10为保留无功能。11则为特殊功能指定,在原本指定地址的位置,可以设置具体的特殊功能,当前只有00110一个功能。
    在这里插入图片描述

3 通过使能AEN位可以启动光学颜色检测,而WEN位用于控制运行模式,WEN设置为0,则光学检测是循环无间断进行,前一次检测出来马上进行下一次检测(每次检测占用一定的延时);当WEN设置为1,则两次检测之间可以插入等待时间,起到节省功耗的作用。AIEN位则是控制是否使用门限可设置的中断产生。
4. TCS3472的输出寄存器是16位,采用可控制积分时间和放大增益的方式,所以得到的结果可以大于255,更长的积分时间和放大增益用于距离较远或者弱光环境的测试。在这里插入图片描述
积分时间为2.4ms相当于进行了10次ADC采样值的求和。
在这里插入图片描述
有4级接收光强放大可选,分别为1倍,4倍,16倍和60倍。

STM32工程配置

这里以STM32F103C6T6芯片及STM32CUBEIDE开发环境,实现访问获取TCS34725传感器的数据。
首先建立工程并配置时钟:
在这里插入图片描述
配置PB12和PB13作为模拟I2C的管脚:
在这里插入图片描述
采用USB虚拟串口作为输出方式,配置USB虚拟串口:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
保存并生成基础工程代码:
在这里插入图片描述

STM32模拟I2C协议代码

STM32模拟I2C协议代码需要用到微秒延时函数,这里采用 STM32 HAL us delay(微秒延时)的指令延时实现方式及优化 。

TCS3472访问部分的函数为:

#define us_num 50#define SCL_OUT_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)
#define SCL_OUT_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
#define SDA_OUT_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET)
#define SDA_OUT_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
#define SDA_IN HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13)void I2C_Init(void)
{SDA_OUT_H;SCL_OUT_H;PY_Delay_us_t(1000000) ;
}void I2C_Start(void)
{PY_Delay_us_t(us_num) ;SDA_OUT_H;SCL_OUT_H;PY_Delay_us_t(us_num/2) ;SDA_OUT_L;PY_Delay_us_t(us_num/2) ;SCL_OUT_L;
}void I2C_Stop(void)
{SCL_OUT_L;PY_Delay_us_t(us_num) ;SDA_OUT_L;PY_Delay_us_t(us_num) ;SCL_OUT_H;PY_Delay_us_t(us_num) ;SDA_OUT_H;PY_Delay_us_t(us_num) ;
}void I2C_Write_Ack(void)
{PY_Delay_us_t(us_num/2) ;SDA_OUT_L;PY_Delay_us_t(us_num/2) ;SCL_OUT_H;PY_Delay_us_t(us_num) ;SCL_OUT_L;SDA_OUT_H;}uint8_t I2C_Read_Ack(void)
{uint8_t status=0;SCL_OUT_L;PY_Delay_us_t(us_num/2) ;SDA_OUT_H;PY_Delay_us_t(us_num/2) ;status = SDA_IN;SCL_OUT_H;PY_Delay_us_t(us_num) ;SCL_OUT_L;SDA_OUT_L;return status;}void I2C_Send_Byte(uint8_t txd)
{for(uint8_t i=0;i<8;i++){PY_Delay_us_t(us_num/2) ;if((txd&0x80)>>7) SDA_OUT_H;else SDA_OUT_L;txd<<=1;PY_Delay_us_t(us_num/2) ;SCL_OUT_H;PY_Delay_us_t(us_num) ;SCL_OUT_L;}SDA_OUT_L;
}uint8_t I2C_Read_Byte(unsigned char rdack)
{uint8_t rxd=0;for(uint8_t i=0;i<8;i++ ){SCL_OUT_L;PY_Delay_us_t(us_num/2) ;SDA_OUT_H;PY_Delay_us_t(us_num/2) ;SCL_OUT_H;rxd<<=1;if(SDA_IN) rxd++;PY_Delay_us_t(us_num) ;}SCL_OUT_L;SDA_OUT_H;if (rdack) I2C_Write_Ack();return rxd;
}uint8_t TCS3472_Enable_Status = 0;
void TCS3472_WRITE( uint8_t WrAddr, uint8_t data)
{uint8_t daddr = 0x52; //TCS3472 device address (0x29<<1)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(WrAddr|0x80);I2C_Read_Ack();I2C_Send_Byte(data);I2C_Read_Ack();I2C_Stop();
}uint8_t TCS3472_READ_1Byte( uint8_t RdAddr)
{uint8_t RegValue = 0;uint8_t daddr = 0x52; //TCS3472 device address (0x29<<1)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(RdAddr|0x80); //Repeated byte protocol transactionI2C_Read_Ack();I2C_Start();I2C_Send_Byte(daddr+1);I2C_Read_Ack();RegValue=I2C_Read_Byte(0);I2C_Stop();return RegValue;
}uint16_t TCS3472_READ_2Byte( uint8_t RdAddr)
{uint8_t RegValueH = 0, RegValueL = 0;uint8_t daddr = 0x52; //TCS3472 device address (0x29<<1)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(RdAddr|0xa0); //Auto-increment protocol transactionI2C_Read_Ack();I2C_Start();I2C_Send_Byte(daddr+1);I2C_Read_Ack();RegValueL=I2C_Read_Byte(1);RegValueH=I2C_Read_Byte(0);I2C_Stop();return (((uint16_t)RegValueH)<<8)|RegValueL;
}
void TCS3472_PON_Enable(void)
{TCS3472_Enable_Status |= TCS3472_ENABLE_PON;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}
void TCS3472_PON_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_PON);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_AEN_Enable(void)
{TCS3472_Enable_Status |=  TCS3472_ENABLE_AEN;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_AEN_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_AEN);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_WEN_Enable(void)
{TCS3472_Enable_Status |= TCS3472_ENABLE_WEN;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}
void TCS3472_WEN_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_WEN);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_AIEN_Enable(void)
{TCS3472_Enable_Status |= TCS3472_ENABLE_AIEN;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}
void TCS3472_AIEN_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_AIEN);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}uint8_t TCS3472_ID_Verification(void)
{uint8_t id;id = TCS3472_READ_1Byte(TCS3472_ID);if((id==0x44)||(id==0x4d)) return 1;else return 0;
}COLOR_RGBC rgb;
COLOR_HSL  hsl;//Conversion of RGB to HSL
void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl)
{uint8_t maxVal,minVal,difVal;uint8_t r = Rgb->r*100/Rgb->c;   //[0-100]uint8_t g = Rgb->g*100/Rgb->c;uint8_t b = Rgb->b*100/Rgb->c;maxVal = max3v(r,g,b);minVal = min3v(r,g,b);difVal = maxVal-minVal;//LightnessHsl->l = (maxVal+minVal)/2;   //[0-100]if(maxVal == minVal)//if r=g=b, grey{Hsl->h = 0;Hsl->s = 0;}else{//Hueif(maxVal==r){if(g>=b)Hsl->h = 60*(g-b)/difVal;elseHsl->h = 60*(g-b)/difVal+360;}else{if(maxVal==g)Hsl->h = 60*(b-r)/difVal+120;elseif(maxVal==b)Hsl->h = 60*(r-g)/difVal+240;}//Saturationif(Hsl->l<=50)Hsl->s=difVal*100/(maxVal+minVal);  //[0-100]elseHsl->s=difVal*100/(200-(maxVal+minVal));}
}

STM32完整工程代码

完整工程代码先读取Device ID以判断基本访问是否正常,再进行积分时间24ms及增益1x的配置,再开始数据采样和读取,读取到的数据是积分后的数据,并进行HSL格式的转换。通过USB虚拟串口将数据打印输出。

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2022 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
//Written by Pegasus Yu in 2022
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <math.h>/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
__IO float usDelayBase;
void PY_usDelayTest(void)
{__IO uint32_t firstms, secondms;__IO uint32_t counter = 0;firstms = HAL_GetTick()+1;secondms = firstms+1;while(uwTick!=firstms) ;while(uwTick!=secondms) counter++;usDelayBase = ((float)counter)/1000;
}void PY_Delay_us_t(uint32_t Delay)
{__IO uint32_t delayReg;__IO uint32_t usNum = (uint32_t)(Delay*usDelayBase);delayReg = 0;while(delayReg!=usNum) delayReg++;
}void PY_usDelayOptimize(void)
{__IO uint32_t firstms, secondms;__IO float coe = 1.0;firstms = HAL_GetTick();PY_Delay_us_t(1000000) ;secondms = HAL_GetTick();coe = ((float)1000)/(secondms-firstms);usDelayBase = coe*usDelayBase;
}void PY_Delay_us(uint32_t Delay)
{__IO uint32_t delayReg;__IO uint32_t msNum = Delay/1000;__IO uint32_t usNum = (uint32_t)((Delay%1000)*usDelayBase);if(msNum>0) HAL_Delay(msNum);delayReg = 0;while(delayReg!=usNum) delayReg++;
}/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define us_num 50#define SCL_OUT_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)
#define SCL_OUT_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
#define SDA_OUT_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET)
#define SDA_OUT_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
#define SDA_IN HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13)void I2C_Init(void)
{SDA_OUT_H;SCL_OUT_H;PY_Delay_us_t(1000000) ;
}void I2C_Start(void)
{PY_Delay_us_t(us_num) ;SDA_OUT_H;SCL_OUT_H;PY_Delay_us_t(us_num/2) ;SDA_OUT_L;PY_Delay_us_t(us_num/2) ;SCL_OUT_L;
}void I2C_Stop(void)
{SCL_OUT_L;PY_Delay_us_t(us_num) ;SDA_OUT_L;PY_Delay_us_t(us_num) ;SCL_OUT_H;PY_Delay_us_t(us_num) ;SDA_OUT_H;PY_Delay_us_t(us_num) ;
}void I2C_Write_Ack(void)
{PY_Delay_us_t(us_num/2) ;SDA_OUT_L;PY_Delay_us_t(us_num/2) ;SCL_OUT_H;PY_Delay_us_t(us_num) ;SCL_OUT_L;SDA_OUT_H;}uint8_t I2C_Read_Ack(void)
{uint8_t status=0;SCL_OUT_L;PY_Delay_us_t(us_num/2) ;SDA_OUT_H;PY_Delay_us_t(us_num/2) ;status = SDA_IN;SCL_OUT_H;PY_Delay_us_t(us_num) ;SCL_OUT_L;SDA_OUT_L;return status;}void I2C_Send_Byte(uint8_t txd)
{for(uint8_t i=0;i<8;i++){PY_Delay_us_t(us_num/2) ;if((txd&0x80)>>7) SDA_OUT_H;else SDA_OUT_L;txd<<=1;PY_Delay_us_t(us_num/2) ;SCL_OUT_H;PY_Delay_us_t(us_num) ;SCL_OUT_L;}SDA_OUT_L;
}uint8_t I2C_Read_Byte(unsigned char rdack)
{uint8_t rxd=0;for(uint8_t i=0;i<8;i++ ){SCL_OUT_L;PY_Delay_us_t(us_num/2) ;SDA_OUT_H;PY_Delay_us_t(us_num/2) ;SCL_OUT_H;rxd<<=1;if(SDA_IN) rxd++;PY_Delay_us_t(us_num) ;}SCL_OUT_L;SDA_OUT_H;if (rdack) I2C_Write_Ack();return rxd;
}/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint8_t TCS3472_Enable_Status = 0;
void TCS3472_WRITE( uint8_t WrAddr, uint8_t data)
{uint8_t daddr = 0x52; //TCS3472 device address (0x29<<1)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(WrAddr|0x80);I2C_Read_Ack();I2C_Send_Byte(data);I2C_Read_Ack();I2C_Stop();
}uint8_t TCS3472_READ_1Byte( uint8_t RdAddr)
{uint8_t RegValue = 0;uint8_t daddr = 0x52; //TCS3472 device address (0x29<<1)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(RdAddr|0x80); //Repeated byte protocol transactionI2C_Read_Ack();I2C_Start();I2C_Send_Byte(daddr+1);I2C_Read_Ack();RegValue=I2C_Read_Byte(0);I2C_Stop();return RegValue;
}uint16_t TCS3472_READ_2Byte( uint8_t RdAddr)
{uint8_t RegValueH = 0, RegValueL = 0;uint8_t daddr = 0x52; //TCS3472 device address (0x29<<1)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(RdAddr|0xa0); //Auto-increment protocol transactionI2C_Read_Ack();I2C_Start();I2C_Send_Byte(daddr+1);I2C_Read_Ack();RegValueL=I2C_Read_Byte(1);RegValueH=I2C_Read_Byte(0);I2C_Stop();return (((uint16_t)RegValueH)<<8)|RegValueL;
}
void TCS3472_PON_Enable(void)
{TCS3472_Enable_Status |= TCS3472_ENABLE_PON;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}
void TCS3472_PON_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_PON);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_AEN_Enable(void)
{TCS3472_Enable_Status |=  TCS3472_ENABLE_AEN;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_AEN_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_AEN);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_WEN_Enable(void)
{TCS3472_Enable_Status |= TCS3472_ENABLE_WEN;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}
void TCS3472_WEN_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_WEN);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}void TCS3472_AIEN_Enable(void)
{TCS3472_Enable_Status |= TCS3472_ENABLE_AIEN;TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}
void TCS3472_AIEN_Disable(void)
{TCS3472_Enable_Status &= (~TCS3472_ENABLE_AIEN);TCS3472_WRITE(TCS3472_ENABLE, TCS3472_Enable_Status);
}uint8_t TCS3472_ID_Verification(void)
{uint8_t id;id = TCS3472_READ_1Byte(TCS3472_ID);if((id==0x44)||(id==0x4d)) return 1;else return 0;
}COLOR_RGBC rgb;
COLOR_HSL  hsl;//Conversion of RGB to HSL
void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl)
{uint8_t maxVal,minVal,difVal;uint8_t r = Rgb->r*100/Rgb->c;   //[0-100]uint8_t g = Rgb->g*100/Rgb->c;uint8_t b = Rgb->b*100/Rgb->c;maxVal = max3v(r,g,b);minVal = min3v(r,g,b);difVal = maxVal-minVal;//LightnessHsl->l = (maxVal+minVal)/2;   //[0-100]if(maxVal == minVal)//if r=g=b, grey{Hsl->h = 0;Hsl->s = 0;}else{//Hueif(maxVal==r){if(g>=b)Hsl->h = 60*(g-b)/difVal;elseHsl->h = 60*(g-b)/difVal+360;}else{if(maxVal==g)Hsl->h = 60*(b-r)/difVal+120;elseif(maxVal==b)Hsl->h = 60*(r-g)/difVal+240;}//Saturationif(Hsl->l<=50)Hsl->s=difVal*100/(maxVal+minVal);  //[0-100]elseHsl->s=difVal*100/(200-(maxVal+minVal));}
}
/* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
char PY_Str[512];/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 */PY_usDelayTest();PY_usDelayOptimize();if (!TCS3472_ID_Verification())  //For communication error verification{while(1){CDC_Transmit_FS("ID READ ERROR!\r\n", strlen("ID READ ERROR!\r\n"));PY_Delay_us(2000000);}}else  //Initial config{TCS3472_PON_Enable(); //Other register config must be after TCS3472_PON_Enable().TCS3472_WRITE(TCS3472_ATIME, TCS3472_INTEGRATIONTIME_24MS);TCS3472_WRITE(TCS3472_CONTROL, TCS3472_GAIN_1X);TCS3472_AEN_Enable();}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(TCS3472_READ_1Byte(TCS3472_STATUS) & TCS3472_STATUS_AVALID){(&rgb)->c = TCS3472_READ_2Byte(TCS3472_CDATAL);(&rgb)->r	= TCS3472_READ_2Byte(TCS3472_RDATAL);(&rgb)->g	= TCS3472_READ_2Byte(TCS3472_GDATAL);(&rgb)->b = TCS3472_READ_2Byte(TCS3472_BDATAL);sprintf( PY_Str, "Clear light value: %d\r\nRed light value: %d\r\nGreen light value: %d\r\nBlue light value: %d\r\n\r\n", (&rgb)->c, (&rgb)->r, (&rgb)->g, (&rgb)->b );CDC_Transmit_FS(PY_Str, strlen(PY_Str));PY_Delay_us(1000000);RGBtoHSL(&rgb,&hsl);sprintf( PY_Str, "Hue value: %d\r\nSaturation value: %d\r\nLightness value: %d\r\n\r\n", (&hsl)->h, (&hsl)->s, (&hsl)->l );CDC_Transmit_FS(PY_Str, strlen(PY_Str));PY_Delay_us(1000000);}else PY_Delay_us(1);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/*** @brief GPIO Initialization Function* @param None* @retval None*/
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13, GPIO_PIN_SET);/*Configure GPIO pins : PB12 PB13 */GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

代码执行输出效果

代码执行输出效果如下:

在这里插入图片描述

例程下载

STM32F103C6T6获取TCS34725光学颜色传感器数据范例下载(STM32CUBEIDE工程):

可以调整光照强度,颜色物体厚度及背景反光情况进行效果优化。也可以将数据通过全彩显示屏显示以对比颜色及做校准,参考 STM32驱动0.96寸TFT 彩色LCD模块显示 。

–End –

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1639.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解云计算

目录 &#x1f34e;云服务 &#x1f34e;云计算类型 &#x1f352;公有云 &#x1f352;私有云 &#x1f352;混合云 &#x1f34e;云计算服务模式 &#x1f352;IaaS基础设施即服务 &#x1f352;PaaS平台即服务 &#x1f352;SaaS软件即服务 &#x1f352;三者之间区别 &…

十大基础算法

一、选择排序 过程简单描述&#xff1a; 首先&#xff0c;找到数组中最小的那个元素&#xff0c;其次&#xff0c;将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次&#xff0c;在剩下的元素中找到最小的元素&#xff0c;将它与数组的第二…

Python打包工具 Pyinstaller使用教程(将.py以及Python解释器和相关库打包可执行文件)

文章目录 pyinstaller历史背景工作原理使用方法简介使用方法详解&#xff08;请仔细阅读help文档中文翻译&#xff09;help文档help文档中文翻译 简单使用示例1. 编译打包2. 拷贝到目标系统3. 运行&#xff08;遇到问题&#xff09; 如何使用xxx.spec文件重新编译配置项示例配置…

Nginx HTTPS实践

Nginx HTTPS实践 文章目录 Nginx HTTPS实践1.HTTPS基本概述1.1.为何需要HTTPS1.2.什么是HTTPS1.3.TLS如何实现加密 2.HTTPS实现原理2.1.加密模型-对称加密2.2.加密模型-非对称加密2.3.身份验证机构-CA2.4.HTTPS通讯原理 3.HTTPS扩展知识3.1.HTTPS证书类型3.2.HTTPS购买建议3.3.…

MySQL压测实战

写作目的 最近看到一句话是MySQL的TPS是4000&#xff0c;这句话是不严谨的&#xff0c;因为没有说服务器的配置。所以自己买了个服务器做了一个压测。希望自己对数据有一个概念。 注意&#xff1a;服务器不同结果不同&#xff0c;结果不具有普适性。 服务器配置 配置参数CPU…

Kubernetes(k8s)容器编排控制器使用

目录 1 Pod控制器1.1 Pod控制器是什么1.2 Pod和Pod控制器1.3 控制器的必要性1.4 常见的控制器1.4.1 ReplicaSet1.4.2 Deployment1.4.3 DaemonSet 2 ReplicaSet控制器2.1 ReplicaSet概述2.2 ReplicaSet功能2.2.1 精确反应期望值2.2.2 保证高可用2.2.3 弹性伸缩 2.3 创建ReplicaS…

360手机黑科技“位置穿越”功能修复 360手机位置穿越不能用了 360手机刷机

360手机黑科技“位置穿越”功能修复 360手机位置穿越不能用了 360手机刷机 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机&#xff1a;360rom.github.io 【前言】 360手机&#xff0c;内置的黑科技“位置穿越”&#xff0c;引用高德地图&#xff…

RedHat红帽认证---RHCE

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; RHCE 1.安装和配置 Ansible 安装和配置 Ansible按照下方所述&#xff0c;在控制节点 control 上安装和配置 Ansible&#xff1a;安装所需的软件包创建名为 /home/gre…

【C++练习】日期常见题型训练(5道编程题)

【C练习】日期题型训练 ①.日期累加②.日期差值③.打印日期④.求123...n(非正常方法)⑤.计算一年的第几天 ①.日期累加 解题思路&#xff1a; 1. 日期相加相减都要考虑2月的天数情况。 2.写一个可以获取每个月份天数的函数(要讨论闰年情况)。 3.当日期相加超过本月的最大天数时…

关于类的成员顺序

1.本类的成员顺序. public class Fu {// 1.静态 // 方法static {System.out.println(" 静态方法来喽");}public static int x orderPrint(1);{System.out.println("构造代码块来喽");}public static int y orderPrint(2);static {System.out.println(&q…

中间件-netty(1)

netty 前言篇 文章目录 一、IO基础篇1.概念1.1 阻塞(Block)和非阻塞(Non-Block)1.2 同步(Synchronization)和异步(Asynchronous)1.3 BIO 与 NIO 对比1.3.1 面向流与面向缓冲1.3.2 阻塞与非阻塞1.3.3 选择器的问世 2.NIO 和 BIO 如何影响应用程序的设计2.1 API调用2.2 数据处理2…

爬虫正常用哪种代理比较好?

在进行网络爬虫时&#xff0c;使用代理可以带来许多好处&#xff0c;包括提高请求的可靠性、防止IP封锁、实现匿名浏览等。以下是一些常见的代理类型&#xff0c;你可以根据需要选择最适合的&#xff1a; 免费代理&#xff1a;免费代理可能数量众多&#xff0c;但质量和稳定性参…