当前位置: 首页 > news >正文

【STM32 HAL库】全双工I2S+双缓冲DMA的使用

1、配置I2S

我们的有效数据是32位的,使用飞利浦格式。

在这里插入图片描述

2、配置DMA

在这里插入图片描述

**这里需要注意:**i2s的DR寄存器是16位的,如果需要发送32位的数据,是需要写两次DR寄存器的,所以DMA的外设数据宽度设置16位,而不是32位。

3、完善I2S文件

i2s.c和i2s.h文件都是MX自动生成的,并且生成MX_I2S3_Init函数进行了初始化,MX_I2S3_Init函数里面其实依次调用了HAL_I2S_Init库函数(和MCU不相关的初始化)和HAL_I2S_MspInit库函数(是个weak函数,和MCU相关的初始化)。所以,我们自己要写的代码也加到这个文件中。

/* USER CODE BEGIN Header */
/********************************************************************************* @file    i2s.c* @brief   This file provides code for the configuration*          of the I2S 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 "i2s.h"/* USER CODE BEGIN 0 */
#include "stdio.h"#define  TX_DATA_16                 (0x1234)
#define  TX_DATA_32                 (0x12345678)
#define  HALF_TX_BUFFER_SIZE        (256)
#define  TX_BUFFER_SIZE             (HALF_TX_BUFFER_SIZE*2)
uint32_t tx_buffer[TX_BUFFER_SIZE];/* USER CODE END 0 */I2S_HandleTypeDef hi2s3;
DMA_HandleTypeDef hdma_spi3_tx;/* I2S3 init function */
void MX_I2S3_Init(void)
{/* USER CODE BEGIN I2S3_Init 0 *///这里有一点需要注�???,i2s的DR�???16位的,�???以如果想发�??32位的数据,得写两次,//如果想发�???0x12345678,就得先发�???0x1234,再发�???0x5678(标准飞利浦格式是高位在前)//但是32位数组是小端�???,�???以就�???要重组一�???for(int i=0;i<TX_BUFFER_SIZE;i++){*(tx_buffer+i)= (TX_DATA_32<<16)|(TX_DATA_32>>16);}/* USER CODE END I2S3_Init 0 *//* USER CODE BEGIN I2S3_Init 1 *//* USER CODE END I2S3_Init 1 */hi2s3.Instance = SPI3;hi2s3.Init.Mode = I2S_MODE_MASTER_TX;hi2s3.Init.Standard = I2S_STANDARD_PHILIPS;hi2s3.Init.DataFormat = I2S_DATAFORMAT_32B;hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_48K;hi2s3.Init.CPOL = I2S_CPOL_HIGH;hi2s3.Init.ClockSource = I2S_CLOCK_PLL;hi2s3.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;if (HAL_I2S_Init(&hi2s3) != HAL_OK){Error_Handler();}/* USER CODE BEGIN I2S3_Init 2 *//* USER CODE END I2S3_Init 2 */}void HAL_I2S_MspInit(I2S_HandleTypeDef* i2sHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};if(i2sHandle->Instance==SPI3){/* USER CODE BEGIN SPI3_MspInit 0 *//* USER CODE END SPI3_MspInit 0 *//** Initializes the peripherals clock*/PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}/* I2S3 clock enable */__HAL_RCC_SPI3_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/**I2S3 GPIO ConfigurationPA4     ------> I2S3_WSPC7     ------> I2S3_MCKPC10     ------> I2S3_CKPC12     ------> I2S3_SD*/GPIO_InitStruct.Pin = WCK_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;HAL_GPIO_Init(WCK_GPIO_Port, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_7|BCK_Pin|DI_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/* I2S3 DMA Init *//* SPI3_TX Init */hdma_spi3_tx.Instance = DMA1_Stream5;hdma_spi3_tx.Init.Channel = DMA_CHANNEL_0;hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE;hdma_spi3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;hdma_spi3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;hdma_spi3_tx.Init.Mode = DMA_CIRCULAR;hdma_spi3_tx.Init.Priority = DMA_PRIORITY_LOW;hdma_spi3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;if (HAL_DMA_Init(&hdma_spi3_tx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(i2sHandle,hdmatx,hdma_spi3_tx);/* USER CODE BEGIN SPI3_MspInit 1 *//* USER CODE END SPI3_MspInit 1 */}
}void HAL_I2S_MspDeInit(I2S_HandleTypeDef* i2sHandle)
{if(i2sHandle->Instance==SPI3){/* USER CODE BEGIN SPI3_MspDeInit 0 *//* USER CODE END SPI3_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_SPI3_CLK_DISABLE();/**I2S3 GPIO ConfigurationPA4     ------> I2S3_WSPC7     ------> I2S3_MCKPC10     ------> I2S3_CKPC12     ------> I2S3_SD*/HAL_GPIO_DeInit(WCK_GPIO_Port, WCK_Pin);HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7|BCK_Pin|DI_Pin);/* I2S3 DMA DeInit */HAL_DMA_DeInit(i2sHandle->hdmatx);/* USER CODE BEGIN SPI3_MspDeInit 1 *//* USER CODE END SPI3_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */int I2S_DMA_Start_Transmit()
{return HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t *)tx_buffer, TX_BUFFER_SIZE);
}int I2S_DMA_Stop()
{return HAL_I2S_DMAStop(&hi2s3);
}/*** @brief  Tx Transfer Half completed callbacks* @param  hi2s pointer to a I2S_HandleTypeDef structure that contains*         the configuration information for I2S module* @retval None*/
void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
{printf("%s\r\n",__func__);/* Prevent unused argument(s) compilation warning */UNUSED(hi2s);for(int i=0;i<HALF_TX_BUFFER_SIZE;i++){*(tx_buffer+i)+=1;}/* NOTE : This function Should not be modified, when the callback is needed,the HAL_I2S_TxHalfCpltCallback could be implemented in the user file*/
}/*** @brief  Tx Transfer completed callbacks* @param  hi2s pointer to a I2S_HandleTypeDef structure that contains*         the configuration information for I2S module* @retval None*/
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
{printf("%s\r\n",__func__);/* Prevent unused argument(s) compilation warning */UNUSED(hi2s);for(int i=0;i<HALF_TX_BUFFER_SIZE;i++){*(tx_buffer+HALF_TX_BUFFER_SIZE+i)-=1;}/* NOTE : This function Should not be modified, when the callback is needed,the HAL_I2S_TxCpltCallback could be implemented in the user file*/
}/*** @brief  I2S error callbacks* @param  hi2s pointer to a I2S_HandleTypeDef structure that contains*         the configuration information for I2S module* @retval None*/
void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s)
{/* Prevent unused argument(s) compilation warning */printf("HAL_I2S_Error\r\n");/* NOTE : This function Should not be modified, when the callback is needed,the HAL_I2S_ErrorCallback could be implemented in the user file*/
}/* USER CODE END 1 */
  1. 其实这里使用了DMA双buffer的思路,但是我没有使用双buffer,而是一个buffer的前后部分。当TxHalfCplt的时候,我们去更新buffer前半部分数据,当TxCplt的时候,我们去更新buffer的后半部分数据。HAL库没有很好封装DMA双buffer的配置函数。
  2. 关于DMA的buffer填充问题,I2S的DR寄存器是15位的,所以配置DMA的数据宽度也是16位的,如果I2S是32位的数据格式,那么需要写两次DR寄存器才能组一帧I2S数据,例如I2S想发送0x12345678,那么就得先发送0x1234,再发送0x5678(I2S飞利浦格式就是这样,高位在前),所以填充buffer的时候,也得按该顺序填充。
  3. 关于全双工DMA的封装,HAL好像也没有很好的支持,等下次再介绍。。。

在这里插入图片描述

4、I2S实现DMA双buffer发送

我们如果看过HAL库接口的话,就应该知道。在dma_ex文件中封装了DMA双buffer的接口,但是在i2s文件或者i2s_ex中没有封装双buffer的接口。所以,我们打算仿照HAL_I2S_Transmit_DMA库函数实现一个函数。

/* USER CODE BEGIN 1 */
static void I2S_DMAM0TxHalfCplt(DMA_HandleTypeDef *hdma)
{I2S_HandleTypeDef *hi2s = (I2S_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 *//* Call user Tx half complete callback */printf("%s\r\n",__func__);
}static void I2S_DMAM0TxCplt(DMA_HandleTypeDef *hdma)
{I2S_HandleTypeDef *hi2s = (I2S_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 *//* Call user Tx complete callback */printf("%s\r\n",__func__);
}static void I2S_DMAM1TxHalfCplt(DMA_HandleTypeDef *hdma)
{I2S_HandleTypeDef *hi2s = (I2S_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 *//* Call user Tx half complete callback */printf("%s\r\n",__func__);
}static void I2S_DMAM1TxCplt(DMA_HandleTypeDef *hdma)
{I2S_HandleTypeDef *hi2s = (I2S_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 *//* Call user Tx complete callback */printf("%s\r\n",__func__);
}static void I2S_DMA_Error(DMA_HandleTypeDef *hdma)
{I2S_HandleTypeDef *hi2s = (I2S_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */printf("%s\r\n",__func__);
}static HAL_StatusTypeDef HAL_I2S_Transmit_DMA_DBuffer(I2S_HandleTypeDef *hi2s, uint16_t *pData0,uint16_t *pData1, uint16_t Size)
{uint32_t tmpreg_cfgr;if ((pData0 == NULL) || (Size == 0U)){return  HAL_ERROR;}/* Process Locked */__HAL_LOCK(hi2s);if (hi2s->State != HAL_I2S_STATE_READY){__HAL_UNLOCK(hi2s);return HAL_BUSY;}/* Set state and reset error code */hi2s->State = HAL_I2S_STATE_BUSY_TX;hi2s->ErrorCode = HAL_I2S_ERROR_NONE;hi2s->pTxBuffPtr = pData0;tmpreg_cfgr = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);if ((tmpreg_cfgr == I2S_DATAFORMAT_24B) || (tmpreg_cfgr == I2S_DATAFORMAT_32B)){hi2s->TxXferSize = (Size << 1U);hi2s->TxXferCount = (Size << 1U);}else{hi2s->TxXferSize = Size;hi2s->TxXferCount = Size;}/* Set the I2S Tx DMA Half transfer complete callback */hi2s->hdmatx->XferHalfCpltCallback = I2S_DMAM0TxHalfCplt;/* Set the I2S Tx DMA transfer complete callback */hi2s->hdmatx->XferCpltCallback = I2S_DMAM0TxCplt;hi2s->hdmatx->XferM1HalfCpltCallback=I2S_DMAM1TxHalfCplt;//callbackhi2s->hdmatx->XferM1CpltCallback=I2S_DMAM1TxCplt;//callback/* Set the DMA error callback */hi2s->hdmatx->XferErrorCallback = I2S_DMA_Error;/* Enable the Tx DMA Stream/Channel */if (HAL_OK != HAL_DMAEx_MultiBufferStart_IT(hi2s->hdmatx,(uint32_t)hi2s->pTxBuffPtr,(uint32_t)&hi2s->Instance->DR,(uint32_t)pData1,hi2s->TxXferSize)){/* Update SPI error code */SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_DMA);hi2s->State = HAL_I2S_STATE_READY;__HAL_UNLOCK(hi2s);return HAL_ERROR;}/* Check if the I2S is already enabled */if (HAL_IS_BIT_CLR(hi2s->Instance->I2SCFGR, SPI_I2SCFGR_I2SE)){/* Enable I2S peripheral */__HAL_I2S_ENABLE(hi2s);}/* Check if the I2S Tx request is already enabled */if (HAL_IS_BIT_CLR(hi2s->Instance->CR2, SPI_CR2_TXDMAEN)){/* Enable Tx DMA Request */SET_BIT(hi2s->Instance->CR2, SPI_CR2_TXDMAEN);}__HAL_UNLOCK(hi2s);return HAL_OK;
}

注意几点:

  1. 这些函数还是写在i2s.c文件中。
  2. 相比原函数,在函数参数上多了一个buffer地址。
  3. 原函数中的回调函数都是本地函数,不供其他文件调用,所以全部重新定义在我们的本文件中。并且多了m1 buffer的回调函数。
  4. DMA_Start函数更换为双buffer函数接口。其他的地方都没有改变。
    在这里插入图片描述
    在这里插入图片描述

5、全双工I2S实现

在这里插入图片描述
配置全双工Master模式,其实看源码就知道,当配置全双工的时候,用到了两个i2s外设。
在这里插入图片描述
如果我们配置i2s为Master_Tx,那么i2s_ex就会自动被配置为Slave_Rx。当然,这些在HAL库中都已经封装好了,我们使用起来还是不麻烦的。
但是,HAL库封装的函数很奇怪,所以我们仿照原库函数自己修改了一下。

static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
{printf("%s\r\n",__func__);
}static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma)
{printf("%s\r\n",__func__);
}static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
{printf("%s\r\n",__func__);
}static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma)
{printf("%s\r\n",__func__);
}static HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA_Modify(I2S_HandleTypeDef *hi2s,uint16_t *pTxData,uint16_t *pRxData,uint16_t Size)
{uint32_t *tmp = NULL;uint32_t tmp1 = 0U;HAL_StatusTypeDef errorcode = HAL_OK;if (hi2s->State != HAL_I2S_STATE_READY){errorcode = HAL_BUSY;goto error;}if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)){return  HAL_ERROR;}/* Process Locked */__HAL_LOCK(hi2s);hi2s->pTxBuffPtr = pTxData;hi2s->pRxBuffPtr = pRxData;tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);/* Check the Data format: When a 16-bit data frame or a 16-bit data frame extendedis selected during the I2S configuration phase, the Size parameter means the numberof 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit dataframe is selected the Size parameter means the number of 16-bit data length. */if ((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)){hi2s->TxXferSize  = (Size << 1U);hi2s->TxXferCount = (Size << 1U);hi2s->RxXferSize  = (Size << 1U);hi2s->RxXferCount = (Size << 1U);}else{hi2s->TxXferSize  = Size;hi2s->TxXferCount = Size;hi2s->RxXferSize  = Size;hi2s->RxXferCount = Size;}hi2s->ErrorCode = HAL_I2S_ERROR_NONE;hi2s->State     = HAL_I2S_STATE_BUSY_TX_RX;/* Set the I2S Rx DMA Half transfer complete callback */hi2s->hdmarx->XferHalfCpltCallback = I2S_DMARxHalfCplt;/* Set the I2S Rx DMA transfer complete callback */hi2s->hdmarx->XferCpltCallback  = I2S_DMARxCplt;/* Set the I2S Rx DMA error callback */hi2s->hdmarx->XferErrorCallback = NULL;/* Set the I2S Tx DMA Half transfer complete callback as NULL */hi2s->hdmatx->XferHalfCpltCallback  = I2S_DMATxHalfCplt;/* Set the I2S Tx DMA transfer complete callback as NULL */hi2s->hdmatx->XferCpltCallback  = I2S_DMATxCplt;/* Set the I2S Tx DMA error callback */hi2s->hdmatx->XferErrorCallback = NULL;tmp1 = hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG;/* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */if ((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX)){/* Enable the Rx DMA Stream */tmp = (uint32_t *)&pRxData;HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&I2SxEXT(hi2s->Instance)->DR, *(uint32_t *)tmp, hi2s->RxXferSize);/* Enable Rx DMA Request */SET_BIT(I2SxEXT(hi2s->Instance)->CR2, SPI_CR2_RXDMAEN);/* Enable the Tx DMA Stream */tmp = (uint32_t *)&pTxData;HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t *)tmp, (uint32_t)&hi2s->Instance->DR, hi2s->TxXferSize);/* Enable Tx DMA Request */SET_BIT(hi2s->Instance->CR2, SPI_CR2_TXDMAEN);/* Check if the I2S is already enabled */if ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE){/* Enable I2Sext(receiver) before enabling I2Sx peripheral */__HAL_I2SEXT_ENABLE(hi2s);/* Enable I2S peripheral after the I2Sext */__HAL_I2S_ENABLE(hi2s);}}else{/* Check if Master Receiver mode is selected */if ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX){/* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a readaccess to the SPI_SR register. */__HAL_I2S_CLEAR_OVRFLAG(hi2s);}/* Enable the Tx DMA Stream */tmp = (uint32_t *)&pTxData;HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t *)tmp, (uint32_t)&I2SxEXT(hi2s->Instance)->DR, hi2s->TxXferSize);/* Enable Tx DMA Request */SET_BIT(I2SxEXT(hi2s->Instance)->CR2, SPI_CR2_TXDMAEN);/* Enable the Rx DMA Stream */tmp = (uint32_t *)&pRxData;HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&hi2s->Instance->DR, *(uint32_t *)tmp, hi2s->RxXferSize);/* Enable Rx DMA Request */SET_BIT(hi2s->Instance->CR2, SPI_CR2_RXDMAEN);/* Check if the I2S is already enabled */if ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE){/* Enable I2Sext(transmitter) before enabling I2Sx peripheral */__HAL_I2SEXT_ENABLE(hi2s);/* Enable I2S peripheral before the I2Sext */__HAL_I2S_ENABLE(hi2s);}}error :__HAL_UNLOCK(hi2s);return errorcode;
}

相比原函数,我们就修改了一个地方,那就是把TX的回调函数也赋值了,其实这里不理解的地方有两个:

  1. 为什么不给TX的回调函数赋值
  2. 为什么RX的回调函数命名TxRx的回调函数
    我们在实验中直接将DI接在DO上了,最后看看调试结果
    在这里插入图片描述
    最后,如果想在全双工中使用DMA双buffer,可以仿照上文中函数的修改即可,这里就不做示范了。

相关文章:

【STM32 HAL库】全双工I2S+双缓冲DMA的使用

1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16位&#xff0c;而不是32位。…...

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…...

营销策划方案模板

这应该是目前最详细最完整的营销策划方案模板&#xff0c;营销公司内部都在使用的标准版本&#xff0c;你可以根据自己的营销内容直接填入这个模板&#xff0c;很快就能写好一份至少80分的营销策划方案。 如果暂时用不到也可以先收藏&#xff0c;以备不时之需。 废话不多说&a…...

Python入门基础教程(非常详细)

现在找工作真的越来越难了&#xff01;今年更是难上加难 前几天在网上刷到这样一条热搜&#xff1a; #23岁找工作因年龄大被HR拒绝了# 是这个世界疯了还是我疯了&#xff1f; 合着只想要有20年以上工作经验的应届毕业生是吧 这好像就是现在的就业市场现状&#xff1a;“35岁…...

LeetCode 常见题型汇总

前30 22 生成括号 剪枝 51 N皇后 37 解数独 二分查找 69 求平方根 字典树 位运算 191 求1的个数 231 2的N次方 338 求0到N的比特位为1的个数 动态规划 并查集 LRU缓存 布隆过滤器...

el-select选择器修改背景颜色

<!--* FilePath: topSearch.vue* Author: 是十九呐* Date: 2024-07-18 09:46:03* LastEditTime: 2024-07-18 10:42:03 --> <template><div class"topSearch-container"><div class"search-item"><div class"item-name&quo…...

Shell程序设计

各位看官&#xff0c;从今天开始&#xff0c;我们进入新的专栏Shell学习&#xff0c;Shell 是操作系统的命令行界面&#xff0c;它允许用户通过输入命令与操作系统交互。常见的 Shell 有 Bash 和 Zsh&#xff0c;它们可以执行用户输入的命令或运行脚本文件。Shell 广泛应用于系…...

PyQT6---环境搭建

1、虚拟环境搭建 创建虚拟环境 create -n pyqt6_39 python3.9 切换虚拟环境 conda activate pyqt6_39 2、安装pyqt6 安装pyqt6和pyqt6-tools pip install PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simplepip install pyqt6-tools -i https://pypi.tuna.tsinghua.edu.cn/…...

whisper-api语音识别语音翻译高性能兼容openai接口协议的开源项目

whisper-api 介绍 使用openai的开源项目winsper语音识别开源模型封装成openai chatgpt兼容接口 软件架构 使用uvicorn、fastapi、openai-whisper等开源库实现高性能接口 更多介绍 https://blog.csdn.net/weixin_40986713/article/details/138712293 使用说明 下载代码安装…...

面试题:Java中堆内存和栈内存的区别,缓存数据是把数据放到哪里

目录 堆内存&#xff08;Heap&#xff09;栈内存&#xff08;Stack&#xff09;String字符串的hashcode缓存 在Java中&#xff0c;堆内存&#xff08;Heap&#xff09;和栈内存&#xff08;Stack&#xff09;是两种不同类型的内存区域。它们各自扮演着不同的角色&#xff0c;并…...

【开源库学习】libodb库学习(一)

Hello World Example 在本章中&#xff0c;我们将使用传统的“Hello World”示例展示如何创建一个依赖于ODB进行对象持久化的简单C应用程序。特别是&#xff0c;我们将讨论如何声明持久类、生成数据库支持代码以及编译和运行我们的应用程序。我们还将学习如何使对象持久化&…...

Java中SPI机制原理解析

使用SPI机制前后的代码变化 加载MySQL对JDBC的Driver接口实现 在未使用SPI机制之前&#xff0c;使用JDBC操作数据库的时候&#xff0c;一般会写如下的代码&#xff1a;// 通过这行代码手动加载MySql对Driver接口的实现类 Class.forName("com.mysql.jdbc.Driver") Dr…...

数学建模~~~SPSS相关和回归分析

目录 1.双变量相关分析 1.1理论基础 1.2简单散点图的绘制介绍 1.3相关性分析 1.4分析相关性结果 2.简单线性回归分析 2.1简单概括 2.2分析过程 2.3结果分析 3.曲线回归分析 3.1问题介绍 3.2分析过程 3.3结果分析 1.双变量相关分析 1.1理论基础 双变量相关分析并不…...

【Android】常用基础布局

布局是一种可用于放置很多控件的容器&#xff0c;它可以按照一定的规律调整内部控件的位置&#xff0c;从而编写出精美的界面&#xff0c;布局内不单单可以放控件&#xff0c;也可以嵌套布局&#xff0c;这样可以完成一些复杂的界面&#xff0c;下面就来认识一些常用的布局吧。…...

服务攻防-中间件安全(漏洞复现)

一.中间件-IIS-短文件&解析&蓝屏 IIS现在用的也少了&#xff0c;漏洞也基本没啥用 1、短文件&#xff1a;信息收集 2、文件解析&#xff1a;还有点用 3、HTTP.SYS&#xff1a;蓝屏崩溃 没有和权限挂钩 4、CVE-2017-7269 条件过老 windows 2003上面的漏洞 二.中…...

【SD】深入理解Stable Diffusion与ComfyUI的使用

【SD】深入理解Stable Diffusion与ComfyUI的使用 1. Stable Diffusion&#xff08;SD&#xff09;原理概述2. 各部件详解3. SD的工作流程4. ComfyUI与SD的结合5. 总结 1. Stable Diffusion&#xff08;SD&#xff09;原理概述 整体结构&#xff1a;SD不是单一模型&#xff0c;…...

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系&#xff0c;两个角色&#xff0c;一个交易场所。 三种关系&#xff1a; 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色&#xff1a; 生产者和消费者 一个交…...

Android RSA 加解密

文章目录 一、RSA简介二、RSA 原理介绍三、RSA 秘钥对生成1. 密钥对生成2. 获取公钥3. 获取私钥 四、PublicKey 和PrivateKey 的保存1. 获取公钥十六进制字符串1. 获取私钥十六进制字符串 五、PublicKey 和 PrivateKey 加载1. 加载公钥2. 加载私钥 六、 RSA加解密1. RSA 支持三…...

类与对象-多态-案例3-电脑组装具体实现

#include<iostream> #include<string> using namespace std; //CPU class CPU { public:virtual void calculate() 0; }; //显卡 class GraCard { public:virtual void graphics() 0; }; //存储 class Memory { public:virtual void memory() 0; }; class Compu…...

try-with-resources 语句的用途和优点有哪些,它如何自动管理资源?

在Java编程中&#xff0c;资源管理是一个重要的议题&#xff0c;尤其是当你在代码中使用那些需要显式关闭的资源&#xff0c;比如文件流、数据库连接或者网络套接字等。 如果资源使用完毕后忘记关闭&#xff0c;不仅会导致资源泄露&#xff0c;还可能引起程序性能问题甚至系统…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...