stm32_WS2812B

news2024/9/21 12:01:54

1结构

实物

内部结构 

2引脚与接线

电压特性

引脚意思

脚号符号管脚名功能
2DO(DOUT)数据输出控制信号输出
3GND接地
4DI(DIN)数据输入控制信号输入
1VDD电源供电管脚

多个如何接线

3数据传输方法

是如何控制多个的

在硬件连接上,只需将前一个WS2812B的"DOUT"连接到下一个WS2812B的"DIN",即可实现多个灯珠的串接控制。

每个灯珠需要24bit的控制数据超过24bit的数据会通过"DOUT"流到下一个灯珠

控制一个和控制多个的区别

控制一个WS2812B灯珠的数据结构:

当控制一个WS2812B灯珠时,数据缓冲区仅需要容纳24位数据(每个颜色通道8位,即GRB格式)。数据缓冲区可以定义为:

 
uint8_t buffer[DATA_SIZE]; // DATA_SIZE = 24
控制两个WS2812B灯珠的数据结构:

当控制两个WS2812B灯珠时,数据缓冲区需要容纳两个灯珠的数据,即48位数据(每个灯珠24位)。数据缓冲区可以定义为:

 
uint8_t buffer[2 * DATA_SIZE]; // DATA_SIZE = 24, 所以2 * DATA_SIZE = 48

24bit 数据结构

G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0

注:高位先发,按照GRB的顺序发送数据。 

数据传输时间

手册上介绍数据发送速度是:800Kbps

所以每个数据位的时间是:1/800000=0.00000125s=1.25us

这1.25us可以表示高位或低位,24个1.25us就是一个灯的颜色,发完一个灯的颜色后需要发送大于280us的低电平让数据从锁存器表现在灯上。

数位位0:

周期1/3的高电平,1.25*(1/3)us

周期2/3的低电平,1.25*(2/3)us

数位位1:

周期2/3的高电平,1.25*(1/3)us

周期1/3的低电平,1.25*(1/3)us

每个LED灯珠都期望接收一个24位的数据流(每个颜色通道8位,即G-R-B格式),数据传输的规则如下:

  1. 位传输时间:每个位的传输时间是固定的,通常大约为1.25微秒(us)。

  2. 0和1的编码

    • 0:逻辑"0"的编码是高电平持续约0.4微秒,随后是低电平持续约0.85微秒。
    • 1:逻辑"1"的编码是高电平持续约0.8微秒,随后是低电平持续约0.45微秒。
  3. 颜色数据顺序:数据传输的顺序是先发送最低有效位(LSB),然后依次发送更高的位,对于颜色数据,首先是绿色(G),然后是红色(R),最后是蓝色(B)。

  4. 数据帧间隔:在连续的数据帧之间,需要有一个至少50微秒的低电平间隔,以标识数据帧的结束和下一个数据帧的开始。

  5. 传输开始前的准备:在开始传输之前,数据线应该处于低电平状态,以确保所有LED灯珠准备好接收数据。

  6. 传输结束后的复位:传输完成后,需要保持数据线至少50微秒的低电平,以复位WS2812B并显示最后传输的颜色。

基于这些规则,以下是控制WS2812B灯珠所需的基本时间计算:

  • 单个灯珠的传输时间:24位 * 1.25微秒/位 = 30微秒。
  • 多个灯珠的传输时间:对于N个灯珠,总的传输时间是N * 30微秒。

4实例代码

思路1

tim1+pwm+dma   (以下使用的是stm32f407vet6)
TIM1   PWM

DMA 

tim.文件 
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    tim.c
  * @brief   This file provides code for the configuration
  *          of the TIM instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 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.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "tim.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim1;
DMA_HandleTypeDef hdma_tim1_ch1;

/* TIM1 init function */
void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 209-1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */

  /* USER CODE END TIM1_Init 2 */
  HAL_TIM_MspPostInit(&htim1);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspInit 0 */

  /* USER CODE END TIM1_MspInit 0 */
    /* TIM1 clock enable */
    __HAL_RCC_TIM1_CLK_ENABLE();

    /* TIM1 DMA Init */
    /* TIM1_CH1 Init */
    hdma_tim1_ch1.Instance = DMA2_Stream1;
    hdma_tim1_ch1.Init.Channel = DMA_CHANNEL_6;
    hdma_tim1_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim1_ch1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim1_ch1.Init.Mode = DMA_CIRCULAR;
    hdma_tim1_ch1.Init.Priority = DMA_PRIORITY_LOW;
    hdma_tim1_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_tim1_ch1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC1],hdma_tim1_ch1);

  /* USER CODE BEGIN TIM1_MspInit 1 */

  /* USER CODE END TIM1_MspInit 1 */
  }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspPostInit 0 */

  /* USER CODE END TIM1_MspPostInit 0 */

    __HAL_RCC_GPIOE_CLK_ENABLE();
    /**TIM1 GPIO Configuration
    PE9     ------> TIM1_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM1_MspPostInit 1 */

  /* USER CODE END TIM1_MspPostInit 1 */
  }

}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspDeInit 0 */

  /* USER CODE END TIM1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM1_CLK_DISABLE();

    /* TIM1 DMA DeInit */
    HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_CC1]);
  /* USER CODE BEGIN TIM1_MspDeInit 1 */

  /* USER CODE END TIM1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
主要代码
解析RGB数据

double Hight_Data = 100; //1  (166.4~96.5)
double Low_Data = 50; //0   (36.6~63.2)

int RGB_buffur[300+24]={0};//颜色数据缓冲区  总值324  其中300为复位(280μs以上)
//解析RGB数据
void RGB_cai_1(int RGB){
	//清零
	for(int i;i<sizeof(RGB_buffur);i++){
		RGB_buffur[i]=0;
	}
	//G 第一次拆分:处理最高8位
    for (int i = 0; i < 8; ++i) {
        RGB_buffur[i] = ((RGB >> (16 - i)) & 1) ? Hight_Data : Low_Data; // 从最高位开始,向右移动并取最低位
    }

    //R 第二次拆分:处理中间8位
    for (int i = 0; i < 8; ++i) {
        RGB_buffur[8 + i] = ((RGB >> (24 - i)) & 1) ? Hight_Data : Low_Data; // 从第17位开始,向右移动并取最低位
    }

    //B 第三次拆分:处理最低8位
    for (int i = 0; i < 8; ++i) {
        RGB_buffur[16 + i] = ((RGB >> (8 - i)) & 1) ? Hight_Data : Low_Data; // 从第9位开始,向右移动并取最低位
    }
	
}

将数据写入 ws2812中

 RGB_cai_1(0x24D400);  //将颜色数据写入
HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t*)RGB_buffur,324);//实现点亮一个LED
main.c文件
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 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.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

double Hight_Data = 100; //1  (166.4~96.5)
double Low_Data = 50; //0   (36.6~63.2)

int RGB_buffur[300+24]={0};//颜色数据缓冲区  总值324  其中300为复位(280μs以上)
//解析RGB数据
void RGB_cai_1(int RGB){
	//清零
	for(int i;i<sizeof(RGB_buffur);i++){
		RGB_buffur[i]=0;
	}
	//G 第一次拆分:处理最高8位
    for (int i = 0; i < 8; ++i) {
        RGB_buffur[i] = ((RGB >> (16 - i)) & 1) ? Hight_Data : Low_Data; // 从最高位开始,向右移动并取最低位
    }

    //R 第二次拆分:处理中间8位
    for (int i = 0; i < 8; ++i) {
        RGB_buffur[8 + i] = ((RGB >> (24 - i)) & 1) ? Hight_Data : Low_Data; // 从第17位开始,向右移动并取最低位
    }

    //B 第三次拆分:处理最低8位
    for (int i = 0; i < 8; ++i) {
        RGB_buffur[16 + i] = ((RGB >> (8 - i)) & 1) ? Hight_Data : Low_Data; // 从第9位开始,向右移动并取最低位
    }
	
}

/* 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_DMA_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  RGB_cai_1(0x24D400);  //将颜色数据写入
  


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t*)RGB_buffur,324);//实现点亮一个LED
	
	HAL_Delay(2000);
    /* 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};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** 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.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  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_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/* 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 */
注意

pwm的周期为1.25us  调节占空比使其符合  1  0   的时间周期即可

PWM周期为1.25us相当于频率为800kHz。 

思路2

用定时器实现延迟

思路3

使用spi实现写数据

【经验分享】STM32 HAL库使用SPI+DMA驱动WS2812优化方案 - STM32团队 ST意法半导体中文论坛

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt笔记】Qt中各个布局详解

目录 引言 一、QHBoxLayout&#xff08;水平布局&#xff09; 1.1 基础特性 1.2 代码示例 1.3 效果展示 二、QVBoxLayout&#xff08;垂直布局&#xff09; 2.1 基础特性 2.2 代码示例 2.3 效果展示 三、QGridLayout&#xff08;网格布局&#xff09; 3.1 基础特性…

NC 判断t1树中是否有与t2树完全相同的子树

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定彼此独立…

深度学习中的一些函数

目录 nn.Embeddingtriu 函数copy.deepcopy nn.Embedding #参数1&#xff1a;词表大小&#xff08;即词表单词个数&#xff09;即只要输入的值在0——n-1之间就可&#xff0c;对于序列长度无影响。 #参数2&#xff1a;词映射的维度n&#xff08;即将每个词映射成一个二维1*n&am…

文字短信怎么利用Python接口发送短信

在信息爆炸的今天&#xff0c;沟通成为了我们日常生活和工作中不可或缺的一部分。无论是企业运营、市场营销&#xff0c;还是个人交流、节日祝福&#xff0c;如何快速、准确地传递信息成为了许多人关注的焦点。群发短信&#xff0c;作为一种高效、经济的沟通方式&#xff0c;正…

一个prolog最简单推理示例

假设现在知道一些年轻人&#xff0c;谁喜欢谁&#xff0c;定义为love(x, y)&#xff1b; 定义了一些这样的关系&#xff1b; 如果x喜欢y&#xff0c;y也喜欢x&#xff0c;则定义他们是一对情侣&#xff1b; 规则表示为&#xff1a; lovers(X,Y) :- love(X,Y), love(Y,X). 输入…

Python | Leetcode Python题解之第376题摆动序列

题目&#xff1a; 题解&#xff1a; class Solution:def wiggleMaxLength(self, nums: List[int]) -> int:n len(nums)if n < 2:return nprevdiff nums[1] - nums[0]ret (2 if prevdiff ! 0 else 1)for i in range(2, n):diff nums[i] - nums[i - 1]if (diff > 0…

Java 5.1 - Spring

Spring 基础 什么是 Spring 框架&#xff1f; 开源的 轻量级的 Java 开发框架&#xff0c;旨在提高开发效率和系统可维护性。 一般我们说 Spring 都是指 Spring FrameWork&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地帮助我们进行 Java 开发。例如 …

监控电脑屏幕的软件叫什么?8款好用的监控电脑屏幕的软件推荐!

远程办公和数字化管理的风潮席卷而来&#xff0c;电脑屏幕监控软件已经悄然成为了企业和家庭不可或缺的得力助手。 这些神奇的小工具&#xff0c;不仅能让老板们远程监督员工的工作状态&#xff0c;确保团队高效运转&#xff0c;还能守护企业的信息安全。 接下来&#xff0c;…

JavaEE-传输层协议

目录 一、UDP协议 二、TCP协议 TCP报文结构 TCP十大核心机制 确认应答 超时重传 接收缓冲区 连接管理 建立连接 断开连接 一、UDP协议 学习一个网络协议首先要学习报文结构。 对于UDP协议来说&#xff0c;应用层数据到达UDP后就会给应用层数据加上UDP报头。 &#…

STM32G474的HAL_ADC_Start_DMA()传递指针问题

1、HAL_ADC_Start_DMA()传递指针问题 函数传递参数中若用到指针&#xff0c;则要注意指针的类型和源数据数据类型要保持一致&#xff0c;否则&#xff0c;会导致内存溢出。 STM32G474的ADC值是12位&#xff0c;HAL库用的是32位指针传输数据&#xff0c;因此&#xff0c;在定义保…

深度学习入门-09

基于小土堆学习 1、卷积层 卷积操作涉及到一个称为“卷积核”或“滤波器”的小窗口&#xff0c;在输入数据上滑动&#xff0c;并对每个位置上的数据进行加权求和&#xff0c;可能还会加上一个偏置项。这个加权求和的结果就构成了输出特征图&#xff08;feature map&#xff0…

SS-31;Elamipretide;伊拉米肽;线粒体靶向抗氧化剂SS-31肽;CAS:736992-21-5

【SS-31 简介】 SS-31肽是一种心磷脂过氧化物酶抑制剂和线粒体靶向肽。 它可以改善左心室和线粒体功能。SS-31肽可减轻 人小梁网状细胞中的线粒体功能障碍和氧化损伤。它可以防止iHTM和GTM(3)细胞受到H2O2诱导的持续氧化应激。慢性心力衰竭和线粒体肌病的I期临床试验正在进行中…

EPLAN中绘制多线原理图以及插入符号元件

EPLAN中绘制多线原理图以及插入符号元件 如下图所示&#xff0c;新建并打开多线原理图&#xff0c;点击菜单栏中的插入—电位连接点&#xff0c; 插入所需的电位连接点&#xff1b; 如下图所示&#xff0c;点击项目数据—符号&#xff0c;这样可以打开符号选择的导航器&#…

07 - procfs

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 1. procfs 快速入门2. procfs 文件创建的回调机制3. 在 proc 目录下创建子目录4. 通过 proc 接口修改内核变量5. 通过 proc 接口访问数组6. 序列文件&#xff1a;seq_file 编程接口7. seq_f…

Hbase离线迁移

假设是hbase集群&#xff0c;那么数据存储在hdfs上。 1.关闭2个hbase 2.使用distcp 将hdfs上的hbase数据迁移到另一个【相同路径】的hdfs上。 不知道目录的话&#xff0c;可以find / -name hbase-site.xml找一下。 hadoop distcp -Dmapreduce.job.hdfs-servers.token-renew…

XtQuant接口概述,想用miniQMT做量化哪家券商支持?

XtQuant.XtData 行情模块 xtdata是xtquant库中提供行情相关数据的模块&#xff0c;本模块旨在提供精简直接的数据满足量化交易者的数据需求&#xff0c;作为python库的形式可以被灵活添加到各种策略脚本中。 主要提供行情数据&#xff08;历史和实时的K线和分笔&#xff09;、…

无人机喊话器详解!!!

无人机喊话器&#xff0c;也被称为无人机扬声器&#xff0c;是一种安装在无人机上&#xff0c;用于通过空中向地面人员传递声音的设备。 一、功能特点 远程传递声音&#xff1a;无人机喊话器能够在较远的距离内清晰地传递声音&#xff0c;有效广播范围通常可达数百米甚至更远…

Linux下单网卡配置多个路由ip方法

Linux下配置网卡ip别名何谓ip别名 用windows的话说&#xff0c;就是为一个网卡配置多个ip。 什么场合增加ip别名能派上用场&#xff1f; 布网需要、多ip访问测试、特定软件对多ip的需要 下面通过几个例子简单介绍一下如何使用ifconfig命令给网卡配置ip别名。 一、首先为服务器…

会员通知短信怎么利用NodeJS发送短信

会员通知群发短信以其即时高效、高打开率、个性化定制、成本效益高、跨平台兼容以及法律合规等优势&#xff0c;在现代会员管理和营销策略中占据了重要地位。对于希望提升会员沟通效率、增强用户粘性和促进业务增长的企业而言&#xff0c;合理利用群发短信工具无疑是一个明智的…

left join 使用 sum()

一&#xff0c;表结构 表一&#xff0c;test_group 分组表 表二&#xff0c;test_user 用户表 test_group 和 test_user 是一对多的关系 二&#xff0c;sql 统计一班的总得分和所有用户的总年龄 SELECT SUM(a.score),SUM(b.age),a.groupname from test_group a LEFT JOIN…