VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码

这篇具有很好参考价值的文章主要介绍了VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

闪烁定义

光学闪烁被定义为人造光源的脉动或波动的光现象。
在低频闪烁中,光是可见的(人眼能够察觉光的闪烁)。超过100 Hz的光学闪烁对于人眼来说不再可见,但仍然存在,可能对人体产生影响。
大多数类型的人造光源在连接到电力主网(家庭或商业办公室)时会发出闪烁,这主要取决于国家的电力频率,通常是50 Hz或60 Hz。
由于电流在光源中的交替流动,所有人造光源都会分别在50 Hz和60 Hz电力主网下发出100 Hz或120 Hz的闪烁频率。
为了消除可见的闪烁并减少对人体的影响,大多数发光二极管(LED)使用脉冲宽度调制(PWM)调光方法,以实现更高的闪烁频率。
VD6283传感器可以检测光的闪烁频率,最高可达2 kHz。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

视频教学

https://www.bilibili.com/video/BV1Fh4y1r7AS/

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

https://download.csdn.net/download/qq_24312945/88394817

开发板设置

在手册种给出了,闪烁手册可以查看AN5639,资料链接如下。
https://www.st.com/content/ccc/resource/technical/document/application_note/group1/9f/7e/8c/ce/36/85/4c/08/DM00776948/files/DM00776948.pdf/jcr:content/translations/en.DM00776948.pdf

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

在AN5639手册中,需要对SB3进行连接。

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划
同时GPIO2需要接到MCU的ADC通道中。

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

查看X-NUCLEO-6283A1手册,可以看到VD6283TX的GPIO2连接到MCU的ADC端口0-2。

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

在VD6283TX-SATEL中,可以看到VD6283TX通过SB3连接到了AFLR_1V8。
需要将AFLR_1V8接到开发板的A0端口中。

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

开发板选择

这里使用NUCLEO-F401RE 开发板。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

IIC配置

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

串口配置

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

开启X-CUBE-ALS软件包

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

时钟树配置

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

ADC使用定时器触发采样

在app_als_adc_utils.c中,定义了ADC使用的频率,为8000Hz。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

定时器的arr设置为10500-1,那么定时器频率为8000Hz。
Trigger Event Selection :update event 定时器自动更新。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划
配置ADC检测VD6283TX的GPIO2管脚的AD值。
设置触发方式为外部触发,选择刚刚配置的TIM2,触发方式为上升沿触发。

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

开启中断。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

KEIL配置

VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

FFT代码配置

arm_cortexM4lf_math.lib 库包含了一系列数学函数,特别是适用于基于Cortex-M4和Cortex-M7处理器的浮点运算单元的优化数学例程。这些例程涵盖了常见的数学运算,如信号处理、滤波、变换等。
arm_math.h 这个头文件包含了CMSIS-DSP库的函数声明、宏定义和结构体定义等,可以通过包含这个头文件,使用库中提供的各种数学函数,包括信号处理、滤波、变换等。
添加arm_cortexM4lf_math.lib文件。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

同时导入arm_math.h文件。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

app_x-cube-als.c

由于需要进行FFT算法,所以需要添加对应数学头文件。

#define ARM_MATH_CM4
#include "arm_math.h"
#include "app_als_adc_utils.h"

添加对应的函数申明。


#define FLK_CHANNEL	(5U)

/*
 * Increasing the value of the FLK_DATA_SIZE symbol will increase
 * processing time, flicker accuracy and memory footprint
 */
#define FLK_DATA_SIZE (1024U)
#define FFT_SIZE (FLK_DATA_SIZE)

/* Private variables ---------------------------------------------------------*/
static uint8_t is_quit_requested;
static uint8_t is_autogain_requested;
static int16_t flk_data[FLK_DATA_SIZE];
volatile uint8_t ALS_EventDetected;

/*
 * The FFT of a real N-point sequence has even symmetry in the frequency domain.
 * The second half of the data equals the conjugate of the first half flipped in frequency.
 * Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers.
 * These are packed into the output array in alternating real and imaginary components:
 * X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... real[(N/2)-1], imag[(N/2)-1 }
 */
static arm_rfft_fast_instance_f32 instance_fft;
static float32_t fft_in[FLK_DATA_SIZE];
static float32_t fft_out_tmp[FFT_SIZE];
static float32_t fft_out[FFT_SIZE/2];




/*
 * The FFT of a real N-point sequence has even symmetry in the frequency domain.
 * The second half of the data equals the conjugate of the first half flipped in frequency.
 * Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers.
 * These are packed into the output array in alternating real and imaginary components:
 * X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... real[(N/2)-1], imag[(N/2)-1 }
 */
static arm_rfft_fast_instance_f32 instance_fft;
 
 
static void MX_VD6283A1_AnalogFlicker_Process(void); 

static float32_t complex_abs(float32_t real, float32_t complex);
static void init_fft(arm_rfft_fast_instance_f32 *instance, uint32_t size);
static void perform_fft(arm_rfft_fast_instance_f32 *instance, int16_t *data, float32_t *ffti, float32_t *ffto, uint32_t size);
static void find_flk_freq(uint32_t fs, float32_t *ffto, uint32_t *freq, uint8_t skip_dc, uint32_t size);


static int32_t flicker_autogain(uint8_t Instance, uint32_t *pAppliedGain, uint32_t timeoutMs);


static void display_gain(uint32_t gain);

在MX_VD6283A1_LuxCCT_Init()函数中添加init_fft快速傅里叶变换初始化。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

static void MX_VD6283A1_LuxCCT_Init(void)
{
  /* Initialize Virtual COM Port */
  BSP_COM_Init(COM1);

  printf("VD6283TX Lux / CCT Example\n\n");
  display_commands_banner();

    /* initialize ARM FFT library */
    init_fft(&instance_fft, FFT_SIZE);
	
  status = VD6283A1_LIGHT_SENSOR_Init(LIGHT_SENSOR_INSTANCE_0);

  if (status)
  {
    printf("VD6283A1_LIGHT_SENSOR_Init failed\n");
    while(1);
  }
}

初始化完毕之后,添加频率获取函数。

static void MX_VD6283A1_AnalogFlicker_Process(void)
{
    uint32_t fs; /* sampling frequency */
    uint32_t pos = 0; 
    uint32_t flk_freq = 0;
    uint32_t index;

    uint32_t current_gain;
    uint32_t current_exposure;

    /* initialize exposure time */
    VD6283A1_LIGHT_SENSOR_SetExposureTime(LIGHT_SENSOR_INSTANCE_0, 100000);
    VD6283A1_LIGHT_SENSOR_GetExposureTime(LIGHT_SENSOR_INSTANCE_0, &current_exposure);
    printf("Exposure set to %lu us\n", (unsigned long)current_exposure);

    /* initialize gain */
    flicker_autogain(LIGHT_SENSOR_INSTANCE_0, &current_gain, 1);
    printf("Channel %u gain set to", FLK_CHANNEL);
    display_gain(current_gain);

    status = als_adc_start(&fs);

    if (status)
    {
        printf("ADC Start failed\n");
        while (1);
    }

    VD6283A1_LIGHT_SENSOR_StartFlicker(LIGHT_SENSOR_INSTANCE_0, FLK_CHANNEL, LIGHT_SENSOR_FLICKER_ANALOG);

    while (!is_quit_requested)
    {
        status = als_adc_get_frame(&flk_data[pos], &index);

        /* fill the ADC frame buffer */
        if (status == 0)
        {
            pos += ADC_FRAME_SIZE;
        }

        /* if the ADC frame buffer is full, then process it */
        if (pos == FLK_DATA_SIZE)
        {
            perform_fft(&instance_fft, flk_data, fft_in, fft_out, FFT_SIZE);
            find_flk_freq(fs, fft_out, &flk_freq, 1, FFT_SIZE);
            pos = 0; /* reset position index */

            printf("Flicker freq: %4lu Hz\r", (unsigned long)flk_freq);
            fflush(stdout);

            if (is_autogain_requested == 1)
            {
              VD6283A1_LIGHT_SENSOR_StopFlicker(LIGHT_SENSOR_INSTANCE_0);

              flicker_autogain(LIGHT_SENSOR_INSTANCE_0, &current_gain, 1);
              printf("Channel %u gain set to", FLK_CHANNEL);
              display_gain(current_gain);

              VD6283A1_LIGHT_SENSOR_StartFlicker(LIGHT_SENSOR_INSTANCE_0, FLK_CHANNEL, LIGHT_SENSOR_FLICKER_ANALOG);
              is_autogain_requested = 0;
            }
        }

        handle_cmd(get_key());
    }

    als_adc_stop();

    VD6283A1_LIGHT_SENSOR_StopFlicker(LIGHT_SENSOR_INSTANCE_0);
    VD6283A1_LIGHT_SENSOR_DeInit(LIGHT_SENSOR_INSTANCE_0);

    printf("Quitting the demo...\n");
    while (1);
}

在MX_X_CUBE_ALS_Process函数中开启频率获取函数,关闭光强获取函数MX_VD6283A1_LuxCCT_Process。
VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码,传感器,stm32cube,单片机,STM32CUBEMX,VD6283TX,环境光传感器,VD6283TX-SATEL,闪烁频率,AnalogFlicker,X-NUCLEO-6283A1,1024程序员节,原力计划

添加增益设置函数。

/*
 * @brief find and apply appropriate gain value depending on saturation value
 * @warning this function mustn't be called when a capture is ongoing
 */
static int32_t flicker_autogain(uint8_t Instance, uint32_t *pAppliedGain, uint32_t timeoutMs)
{
  int32_t res;
  uint8_t i, j;
  uint8_t idx = 7; /* start with mid-table value */
  const uint8_t sat_limit = 2;
  uint32_t saturation;

  /* duplicate 0x42AB to avoid 100x and keep multiples of 2 for array size */
  const uint16_t Gains[] = {
    0x42AB, 0x42AB, 0x3200, 0x2154, 0x1900, 0x10AB, 0x0A00, 0x0723,
    0x0500, 0x0354, 0x0280, 0x01AB, 0x0140, 0x0100, 0x00D4, 0x00B5
  };

  /* clip timeout value */
  timeoutMs = timeoutMs == 0 ? 1 : timeoutMs;
  timeoutMs = timeoutMs >= 100 ? 100 : timeoutMs;

  for (i = 0; i <= 3; i++)
  {
    VD6283A1_LIGHT_SENSOR_SetGain(Instance, FLK_CHANNEL, Gains[idx]);
    VD6283A1_LIGHT_SENSOR_GetGain(Instance, FLK_CHANNEL, pAppliedGain);

    res = VD6283A1_LIGHT_SENSOR_StartFlicker(Instance, FLK_CHANNEL, LIGHT_SENSOR_FLICKER_ANALOG);
    
    if (res)
      return res;

    /* read saturation value each ms so we can exit early if saturation detected */
    for (j = 0; j < timeoutMs; j++)
    {
      HAL_Delay(1);

      res = VD6283A1_LIGHT_SENSOR_GetSaturation(Instance, &saturation);

      if (res)
        return res;
      if (saturation > sat_limit)
        break;
    }

    res = VD6283A1_LIGHT_SENSOR_StopFlicker(Instance);
    
    if (res)
      return res;

    /* update index to next value */
    if (i)
      idx += saturation > sat_limit ? 1 << (i - 1) : -(1 << (i - 1));
    else if (saturation > sat_limit)
      idx++;
  }

  /* clip index if it reaches max value */
  if (idx > 15) 
    idx = 15;

  VD6283A1_LIGHT_SENSOR_SetGain(Instance, FLK_CHANNEL, Gains[idx]);
  res = VD6283A1_LIGHT_SENSOR_GetGain(Instance, FLK_CHANNEL, pAppliedGain);

  return res;
}

在下方添加函数的定义。

/*
 * @brief initilize arm rfft library
 */
static void init_fft(arm_rfft_fast_instance_f32 *instance, uint32_t size)
{
  arm_rfft_fast_init_f32(instance, size);
}

打印增益函数。

/*
 * @brief normalize, convert and dislay gain 
 */
static void display_gain(uint32_t gain)
{
    uint32_t g = (gain * 100) / 256;

    printf(" %3lu.%02lu\n", (unsigned long)g / 100, (unsigned long)(g % 100));
}

执行FFT。

/*
 * @brief perform fft on the input buffer using arm rfft library
 */
static void perform_fft(arm_rfft_fast_instance_f32 *instance, int16_t *flk, float32_t *ffti, float32_t *ffto, uint32_t size)
{
    uint32_t i;
    uint32_t index = 0;

    /* copy the ADC sampled signal into the fft input buffer
     * this allows to convert the data from int16_t to float32_t */
    for (i = 0; i < size; i++)
    {
        ffti[i] = flk[i];
    }

    /* Perform the FFT on the input buffer:
     * results are packed in a way so that even indexes contain real values
     * and odd indexes contain the complex value of each bin.
     * Therefore the fft_output array contains FFT_SIZE / 2 bins */
    arm_rfft_fast_f32(instance, ffti, fft_out_tmp, 0);

    /* Calculate the magnitude for each bin from the temp fft output buffer */
    for (i = 0; i < size; i += 2)
    {
        ffto[index] = complex_abs(fft_out_tmp[i], fft_out_tmp[i+1]);
        if (ffto[index] < 0) ffto[index] = 0;
        index++;
    }
}

查找峰值频率值。

/*
 * @brief find peak frequency value
 */
static void find_flk_freq(uint32_t fs, float32_t *ffto, uint32_t *freq, uint8_t skip_dc, uint32_t size)
{
    uint32_t i;
    uint32_t res;
    uint32_t index_max = 0;
    uint32_t limit = size / 2;

    float32_t max_value = -1;

    /* do not take account of the DC value if the flag skip_dc is set */
    skip_dc ? (i = 1) : (i = 0);

    /* run through the output array to detect the peak */
    for (; i < limit; i++)
    {
        if (ffto[i] > max_value)
        {
            index_max = i;
            max_value = ffto[i];
        }
    }

    /* convert index of the bin into frequency */
    res = (index_max * fs) / size;

    /* return the result if the pointer is valid */
    if (freq)
    {
        *freq = res;
    }
}

计算一个复数的绝对值。

/*
 * @brief compute absolute value of a complex number
 */
static float32_t complex_abs(float32_t real, float32_t complex)
{
  float32_t res;

  arm_sqrt_f32(real * real + complex * complex, &res);

  return res;
}

需要添加函数

arm_cortexM4lf_math.lib 库包含了一系列数学函数,特别是适用于基于Cortex-M4和Cortex-M7处理器的浮点运算单元的优化数学例程。这些例程涵盖了常见的数学运算,如信号处理、滤波、变换等。
arm_math.h 这个头文件包含了CMSIS-DSP库的函数声明、宏定义和结构体定义等,可以通过包含这个头文件,使用库中提供的各种数学函数,包括信号处理、滤波、变换等。
app_als_adc_utils.c功能主要包括启动和停止ADC采样,获取采样数据,ADC采样速度设置,以及处理相关的硬件中断。
app_als_adc_utils.h是app_als_adc_utils.c对应头文件。文章来源地址https://www.toymoban.com/news/detail-723107.html

到了这里,关于VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实现IIC驱动环境光、距离传感器

    本次实验平台为野火征途mini开发板,用到的外设有按键、LED灯数码管、环境光(ALS)+距离(PS)传感器芯片。 AP3216C是一款环境光、距离传感器芯片,其接口为IIC接口,FPGA通过IIC接口可以配置工作模式、读取环境光、距离数据。 系统模块连接如下: key_filter 模块实现按键消

    2024年02月16日
    浏览(51)
  • 嵌入式linux驱动开发之移远4G模块EC800驱动移植指南

    回顾下移远4G模块移植过程, 还是蛮简单的。一通百通,无论是其他4G模块都是一样的。这里记录下过程,分享给有需要的人。环境使用正点原子的imax6ul开发板,板子默认支持中兴和移远EC20的驱动,这里要移植使用的是移远4G模块EC800。 imax6ul开发板 虚拟机(Ubuntu18.04) 交叉编译

    2024年02月17日
    浏览(71)
  • NUCLEO-F411RE RT-Thread 体验 (2) - GCC环境 Pin 驱动的移植

    前面控制LED的函数,其实还是调用的hal的函数,RT-Thread分离了驱动层与应用层,驱动层往下对接hal库,往上对接pin组件。 驱动层代码路径如图: pin组件代码位于 第一次编译 报错提示没有board.h,在Core/Inc目录新建一个board.h,内容如下: 第二次编译 无错误。 编译无报错。 添加

    2024年02月09日
    浏览(40)
  • linux驱动开发 ST7789 LCD驱动移植(I.MX6ULL平台)

    前言 I.MX6ULL的板子未选配RGB的屏幕,无法在板子上进行GUI的开发调试,不过手头上有块控制器为ST7789V3的LCD屏幕(1.3inch),通过简易接线后可以很方便进行驱动的移植 如有异议,欢迎留言指正 ST7789 LCD控制器 ST7789是一款单芯片TFT-LCD控制器,支持并口与SPI通信方式 特性 控制器支

    2023年04月09日
    浏览(84)
  • ARM-系统移植(开发环境搭建)

    首先保证ubuntu连接网络成功 1. 安装步骤 作用:完成ubuntu和开发板之间传输文件 1)安装tftp服务器的安装包 sudo apt-get install tftpd-hpa  tftp-hpa        tftpd-hpa : 服务器端        tftp-hpa : 客户端   2)在家目录下,创建一个文件夹 tftpboot ,并且添加最高权限 cd ~ mkdir  tftpboot ch

    2024年02月07日
    浏览(55)
  • STM32外设芯片驱动学习记录 —— (一) BH1750光照传感器驱动开发

    一、芯片介绍 二、Datasheet解读 1.硬件说明 2.寄存器说明 3.通信过程 三、驱动代码编写 1.软件I2C驱动 2. BH1750芯片驱动函数 总结             BH1750是16位数字输出型,环境光强度传感器集成电路,使用I2C接口通信,工作电压:VCC(2.4~3.6V),I2C电平(1.65~VCC),用于各类消费类LCD屏

    2024年02月02日
    浏览(87)
  • Arduino开发实例-AS608光学指纹传感器驱动

    AS608 光学指纹传感器可用于扫描指纹,它也可以通过串行通信将处理后的数据发送到微控制器。 所有注册的指纹都存储在这个模块中。 AS608 最多可存储 127 个独立指纹。 最重要的特点是: 电源电压:3.3V 最大电流供应:60mA 分辨率:500dpi 最大指纹成像时间:1s 传感器引脚

    2024年01月17日
    浏览(57)
  • NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用

    驱动位于drv_pwm.c文件中,components层代码位于rt_drv_pwm.c中。 修改Makefile文件 修改配置文件rtconfig.h LED2链接PA5,而TIM2_CHANNEL1可从PA5输出PWM,所以我们需要配置TIM2,并使能TIM2_CH1. 修改RT-Thread-basic/Core/Src/stm32f4xx_hal_msp.c HAL_TIM_MspPostInit 函数在stm32_hw_pwm_init函数中被调用。主要配置

    2024年02月10日
    浏览(46)
  • 驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记

      将 ALPHA 开发板作为一个小型的 FTP 服务器,这样我们就可以通过 FileZilla 软件直接在开发板和 windows 之间通过网络进行文件互传。而在开发板上搭建 FTP 服务器很简单,就是 vsftpd 的移植。   FileZilla官网下载,下载地址如下:点击链接。步骤省略。   现在需要在自己

    2024年02月09日
    浏览(42)
  • 嵌入式linux之iMX6ULL驱动开发 | 移远4G模块EC800驱动移植指南

    回顾下移远4G模块移植过程, 还是蛮简单的。一通百通,无论是其他4G模块都是一样的。这里记录下过程,分享给有需要的人。环境使用正点原子的imax6ul开发板,板子默认支持中兴和移远EC20的驱动,这里要移植使用的是移远4G模块EC800。 imax6ul开发板 虚拟机(Ubuntu18.04) 交叉编译

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包