驱动---1.DAC8552实现三角波输出
最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。
一、器件手册重要信息提取
1.DAC8552具有十六位的分辨率、双通道输出、通电后复位为零刻度、供电电压是2.7V-5.5V,轨到轨输出,在供电电压为5V的时候输出频率可以达到30MHz。
2.器件引脚说明
<1>2引脚,作为参考的基准电压,也就是和电压输出范围有关系的.计算公式如下:
VREF就是基准电压的大小
<2>5引脚SYNC相当于SPI的片选线,下降时也就是低电平时,启动输入移位寄存器,数据在SCLK的下降边沿进行传输。8位控制字节和16位数据字的操作由24个下降沿的SCLK时钟边缘触发(除非在该边缘之前SYNC被置为高电平,在这种情况下,SYNC的上升沿作为中断信号,写序列被DAC8552忽略)。
3.短路电流大小
4.数据输出的时序
高位在前三个字节二十四位数据,第一个字节高八位是控制字节、第二个字节和第三个字节十六位是数据。
5.高八位的控制说明
DB23和DB22 00
DB21和DB20 00两个通道都不加载 11同时加载DACA和DACB 01加载DACA并输出在完成后达到指定值 10加载DACB并输出在完成后达到指定值
DB19 0或1都行,一般情况下我会取0
D18 0=A 1=B 0:写入数据缓冲区A 1:写入数据缓冲区B
DB17和DB16 两个都取0就是正常模式
DB0-DB15 两个字节十六位的数据
6.手册中比较重要内容的截图
可能有重复地方加深一下印象
7.手册通信举例
示例重点看一下LDB\LDA\Buffer Select三个位,基本就搞明白哪个通道输出不输出了。
在项目开发中,我直接使用的事示例2的第一个,通过DACA去做输出。
<1>示例1:通过缓冲区B写入数据缓冲区A,同时通过DAC B加载DAC A
写入数据缓冲区A
写入数据缓冲区B,同时加载DAC A和DAC B
<2>示例2:将新数据依次加载到DAC A和DAC B
写入数据缓冲区A并加载DAC A:DAC A输出在完成后稳定到指定值:
写入数据缓冲区B并加载DAC B:DAC B输出在完成后达到指定值:
示例3:同时断电DAC A至1kΩ,断电DAC B至100kΩ
对数据缓冲区A写入减电命令
将断电命令写入数据缓冲区B,同时加载DAC A和DAC B
示例4:DAC A和DAC B依次断电高阻抗
将断电命令写入数据缓冲区A并加载DAC A: DAC A输出= Hi-Z:
将断电命令写入数据缓冲区B和加载DAC B: DAC B输出= Hi-Z:
二、项目说明
1.项目需求
使用该器件主要做一级的三角波输出,后级作用与处理在这里不进行详细说明。目标波形参数如下:五种三角波
2.关于输出计算问题
我的硬件设计中,基准电压是5V,因此要输出相应的电压大小,算出对应的D值即可,在设计中我直接设定D值为15000了,这是为了满足我的项目。
3.软硬件说明
因为是做立项测试,先用了野火的指南者开发板和该模块进行通信,使用HAl库的编程思想。
三、开发记录
1HAL库的设定
<1>RCC的设定
<2>SYS的设定
<3>USART的设定
<4>定时器2的设定
10us进入一次定时器2中断
<5>SPI设定
这个需要注意一下,DAC的最高通信速率是30M,我在这里设定了18M。
通信中是下降沿读取数据,因此CPOL和CPHA分别设定为LOW 2Edge
<6>NVIC
<7>芯片引脚图<7>芯片引脚图
四、编程
按键切换五种三角波状态,直接把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"/* 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 ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;TIM_HandleTypeDef htim2;UART_HandleTypeDef huart1;/* USER CODE BEGIN PV */
//满偏的时候是准确的一半,但是下面就是不完全精准了
uint16_t DAC_Tx=0; //理论上对应的是2V,减半为1V。0.996 28000
uint32_t TIM_FLAG=0;
//1-5对应五种模式 0对应空状态
uint8_t Triange_Mode=0;
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_TIM2_Init(void);
/* USER CODE BEGIN PFP */
void ADC8552_Data(uint16_t *ADC8552_Data);
void Scan_Mode(void);
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *///第一个字节:0 0 0 1 0 0 0 0 0x10//第二个和第三个字节 发送一个1V的电压对应的二进制数据//13000 对应差不多0.98V 0011 0010 1100 1000 0x32 0xB8
// uint8_t SPI1_Receive[]={0x10,0xFF,0xFF};/* 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_SPI1_Init();MX_USART1_UART_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE *///开启定时器2HAL_TIM_Base_Start_IT(&htim2);while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///三角波说明 一共五个波形// 状态 t宽 t升 t降 t止//参数1:神经失用 1ms 1ms 0 20ms//参数2:轻度失神经 10-50ms 10-50ms 1ms 50-150ms//参数3:中度失神经 50-150ms 50-150ms 30-100ms 500-1000ms//参数4:重度失神经 150-300ms 150-300ms 60-200ms 1000-3000ms//参数5:极重度失神经 400-600ms 400-600ms 200-300ms 1000-5000msScan_Mode();
// while(1);}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {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();}
}/*** @brief SPI1 Initialization Function* @param None* @retval None*/
static void MX_SPI1_Init(void)
{/* USER CODE BEGIN SPI1_Init 0 *//* USER CODE END SPI1_Init 0 *//* USER CODE BEGIN SPI1_Init 1 *//* USER CODE END SPI1_Init 1 *//* SPI1 parameter configuration*/hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN SPI1_Init 2 *//* USER CODE END SPI1_Init 2 */}/*** @brief TIM2 Initialization Function* @param None* @retval None*/
static void MX_TIM2_Init(void)
{/* USER CODE BEGIN TIM2_Init 0 *//* USER CODE END TIM2_Init 0 */TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM2_Init 1 *//* USER CODE END TIM2_Init 1 */htim2.Instance = TIM2;htim2.Init.Prescaler = 72-1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 10-1;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM2_Init 2 *//* USER CODE END TIM2_Init 2 */}/*** @brief USART1 Initialization Function* @param None* @retval None*/
static void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */}/*** @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_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(DAC855X_SYNC_GPIO_Port, DAC855X_SYNC_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);/*Configure GPIO pin : DAC855X_SYNC_Pin */GPIO_InitStruct.Pin = DAC855X_SYNC_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DAC855X_SYNC_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : KEY1_MODE_Pin */GPIO_InitStruct.Pin = KEY1_MODE_Pin;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(KEY1_MODE_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : LED_Pin */GPIO_InitStruct.Pin = LED_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);/* EXTI interrupt init*/HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);HAL_NVIC_EnableIRQ(EXTI0_IRQn);}/* USER CODE BEGIN 4 */
//传递数据 第一个字节是数据的高八位,第二个字节是数据的低八位
void ADC8552_Data(uint16_t *ADC8552_Data)
{uint8_t SPI_Tx[3]={0x10,0,0};//数据的低八位SPI_Tx[2]=(uint8_t)(*ADC8552_Data)|0x00;
// HAL_UART_Transmit(&huart1,&SPI_Tx[2],1,1000);//数据的高八位SPI_Tx[1]=(uint8_t)(*ADC8552_Data>>8)|0x00;
// HAL_UART_Transmit(&huart1,&SPI_Tx[1],1,1000);
// SPI_Tx[2]=0x66;
// SPI_Tx[1]=0x66;//控制字节
// SPI_Tx[0]=0x10;
// HAL_UART_Transmit(&huart1,&SPI_Tx[0],1,1000);//将传递进来的数据进行分字节处理//开启DAC的片选HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_RESET); //发送第一个字节数据HAL_SPI_Transmit(&hspi1,&SPI_Tx[0],1,1000);//发送第二个字节数据HAL_SPI_Transmit(&hspi1,&SPI_Tx[1],1,1000); //发送第三个字节数据 HAL_SPI_Transmit(&hspi1,&SPI_Tx[2],1,1000); //关闭DAC的片选HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_SET);
}
//按键实现模式的切换
void Scan_Mode(void)
{//三角波说明 一共五个波形// 状态 t宽 t升 t降 t止 示波器状态//参数1:神经失用 1ms 1ms 0 20ms 1V---1ms//参数2:轻度失神经 10-50ms 10-50ms 1ms 50-150ms//参数3:中度失神经 50-150ms 50-150ms 30-100ms 500-1000ms//参数4:重度失神经 150-300ms 150-300ms 60-200ms 1000-3000ms//参数5:极重度失神经 400-600ms 400-600ms 200-300ms 1000-5000ms //神经失用模式if(Triange_Mode==1){if(TIM_FLAG<=100){ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>100)&&(TIM_FLAG<2100)){DAC_Tx=0;ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>=2100)){TIM_FLAG=0;} } else if(Triange_Mode==2)//轻度失神经{if(TIM_FLAG<=1100) //包括上升和下降{ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>1100)&&(TIM_FLAG<6100)){DAC_Tx=0;ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>=6100)){TIM_FLAG=0;} }else if(Triange_Mode==3)//中度失神经{if(TIM_FLAG<=8000) //包括上升和下降{ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>8000)&&(TIM_FLAG<58000)){DAC_Tx=0;ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>=58000)){TIM_FLAG=0;} }else if(Triange_Mode==4)//重度失神经 {if(TIM_FLAG<=21000) //包括上升和下降{ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>21000)&&(TIM_FLAG<121000)){DAC_Tx=0;ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>=121000)){TIM_FLAG=0;} }else if(Triange_Mode==5)//极重度失神经{if(TIM_FLAG<=60000) //包括上升和下降{ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>60000)&&(TIM_FLAG<160000)){DAC_Tx=0;ADC8552_Data(&DAC_Tx);}else if((TIM_FLAG>=160000)){TIM_FLAG=0;} }
}
//进行一些说明
//目前这种编写方法相当于把幅值和波形以及固定了,如果做成产品应该怎么修改编程思想呢?
//1.关于幅值的说明
//关于幅值,就是对应治疗模式下的强度改变,欧姆定律决定了在R不变的情况下V和I的关系。
//可以增加一个二级处理,把中断出来的DAC_Tx进行二次加工,对应着不同的强度,处理好后在
//通过DAC去做传递,如果涉及到小数,可以全部改成double,最后做个强制类型转换,这样会让
//波形更加丝滑。
//2.关于波形,其他设备的波形都是固定的,如果设备想要增加不同参数模式,那就按着之前的
//方法去增加就可以了。//定时器2,每10us进入一次
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{//满偏值暂时设定为150*100=15000/65536*5≈1.10-1.15V之间//K1做成开始停止 K2做成功能切换TIM_FLAG++;//神经失用模式 1ms宽 1ms上升 0ms下降 20ms暂停if((Triange_Mode==1)&&(TIM_FLAG<=100)){DAC_Tx+=150;//上升}else if((Triange_Mode==2)&&(TIM_FLAG<=1100))//轻度失神经 10ms宽 10ms上升1ms下降50ms暂停{if(TIM_FLAG<=1000)DAC_Tx+=15;//1000*15 上升else if((TIM_FLAG>1000)&&(TIM_FLAG<=1100))DAC_Tx-=150;//下降}else if((Triange_Mode==3)&&(TIM_FLAG<=8000))//中度失神经{//50ms宽50ms上升30ms下降500ms暂停if(TIM_FLAG<=5000)DAC_Tx+=3;//5000*3 上升else if((TIM_FLAG>5000)&&(TIM_FLAG<=8000))DAC_Tx-=5;//下降 }else if((Triange_Mode==4)&&(TIM_FLAG<=21000))//重度失神经{//50ms宽50ms上升30ms下降500ms暂停 if(TIM_FLAG<=15000)DAC_Tx+=1;//1000*15 上升else if((TIM_FLAG>15000)&&(TIM_FLAG<=21000)&&(TIM_FLAG%2==0))DAC_Tx-=5;//下降 }else if((Triange_Mode==5)&&(TIM_FLAG<=60000))//重度失神经{//50ms宽50ms上升30ms下降500ms暂停 if((TIM_FLAG<=40000)&&(TIM_FLAG%8==0))DAC_Tx+=3;//1000*15 上升else if((TIM_FLAG>40000)&&(TIM_FLAG<=60000)&&(TIM_FLAG%4==0))DAC_Tx-=3;//下降 }
}
//按键外部中断,实现模式的切换
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{//模式切换Triange_Mode+=1;if(Triange_Mode==6)Triange_Mode=0;//每次按键切换定时器累加值以及电压幅值都进行清零处理TIM_FLAG=0;DAC_Tx=0;HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
}
/* 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 */
五、目标实现
观察信号幅值以及宽度大小,因为是拿杜邦线连的会发现干扰噪声很多,正常连接线噪声会少很多,如果感觉干扰过大可以加些滤波。
1.神经失用
2.轻度失神经
3.中度失神经
4.重点失神经
5.极度失神经
相关文章:
驱动---1.DAC8552实现三角波输出
最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…...
PHP中GD库的使用
由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...
【ChArUco Marker】标定板检测
目录 1.ChArUco介绍2.源码分析(opencv 4.5.4)3.ChAruco板创建(opencv 4.5.4)4.Charuco板检测(opencv 4.5.4)ChArUco检测源码(不使用标定参数) 5.ChArUco姿态估计(opencv …...
Kafka | RabbitMQ | RocketMQ | ActiveMQ 的区别和入门案例
springboot,vue,springcloudalibaba课程视频,有需要可以看看 <!-- springboot,springboot整合redis,整合rocketmq视频: --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...
TensorBoard
1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件,它提供了一个交互式的界面,用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard,你可以: 可视化训练过程中的各种指标,如损失函数、准…...
C# 中的异步编程:提升应用程序响应性和性能
C#中的异步编程(Asynchronous Programming)。异步编程是现代应用程序开发中非常重要的一个方面,它允许程序在等待长时间运行的操作(如I/O操作、网络请求等)时继续执行其他任务,从而提高应用程序的响应性和性…...
前端框架 React 与 Vue3对比 —— 技术选型
在进行前端框架React与Vue3的技术选型对比时,我们可以从以下几个方面进行综合考虑: 1. 性能比较 • Vue3 通过 Vite 打包工具实现了快速的开发和构建,同时使用了响应式系统和 Proxy 技术来提高数据响应速度。在大部分测试用例中,…...
虚拟机与Xshell5和Xftp4连接与虚拟机克隆
虚拟机与Xshell5和Xftp4连接与虚拟机克隆 虚拟机与Xshell5和Xftp4连接 虚拟机与Xshell5连接 下载Xshell5后启动出现如下界面,点击新建 新建会话输入虚拟机命名,如master,主机输入虚拟机IP,xxx.xxx.xxx.xxx然后确认,…...
华为USG系列防火墙 RESTCONF NAT配置 Python实现
目录 前言 文档下载 开启RESTCONF接口 Python 实现SNAT增删改查 查看nat映射列表 查看私网地址池 查看源地址池(公网) 查看nat映射规则 创建nat映射规则 创建私网地址池 创建源地址池 创建nat映射规则 修改NAT映射规则 删除NAT映射规则 …...
qemu安装arm64架构银河麒麟
qemu虚拟化软件,可以在一个平台上模拟另一个硬件平台,可以支持多种处理器架构。 一、安装 安装教程:https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接:https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...
深入解析 Spring 框架:核心特性与应用价值
1.什么是spring? Spring 是一个开源的 Java 应用框架,由 Pivotal Software 提供支持。它为开发基于 Java 的企业级应用提供了一整套基础设施支持。Spring 框架的核心功能是依赖注入(Dependency Injection, DI),它帮助开发者实现…...
protobuf 报文编解码工具
QT实现的 protobuf 反序列化 & 序列化工具,版本号V1.2 下载链接:protobuf报文编解码工具资源-CSDN文库 源码github:ProtobufTool 使用说明: 1. 点击“加载proto文件”按钮,从本地选择 .proto文件 2. 选择消息名称ÿ…...
Milvus向量数据库06-RAG检索增强
Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程:为什么 RAG 优于传统的基于检索的方法:示例流程: 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...
Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播
技术背景 好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTe…...
标记数据集生成模型助力无数据情况下的大模型指令微调
在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调…...
第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展
第六届知交会暨地博会:世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…...
vue响应式原理
对于响应式原理,我们先了解vue是一个MVVM结构的框架;也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新,基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
概述 在 SwiftUI 的界面布局中,列表(List)和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道:如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到:当在 List 的…...
使用Allure作为测试报告生成器(Java+Selenium)
背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时,当需要确认UI regression issue还是selenium test case自身的问题,需要去jenkins中查log,一般得到的是“Can not find element xxx…...
【论文阅读】处理器芯片敏捷设计方法:问题与挑战
作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...
系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)
使用原始套接字发送了一个 SYN 数据包后,对方发送了 SYN,ACK 数据包,但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接: 即使你使用了原始套接字来发送和接收数据包&#x…...
VLDB 2024 | 时空数据(Spatial-temporal)论文总结
VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据(time series data)的相关论文,主要包含如有疏漏,欢迎大家补充。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘…...
以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
Qt初识_对象树
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 什么是对象树 为什么要引…...
规范秩相关信息搜集Day2
系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…...
【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...
交换瓶子(图论 贪心)
1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点,从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式,我们就可以连出n条边 观察可以发现这些图有特点: n个点 连成n条边 因为每个点会指向它应该在的位置的那个点ÿ…...
汽车升级到底应不应该设置“可取消“功能
最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
Mac电脑钓鱼到拿下核心权限
目录 一. 前言 二. PKG后门制作阶段 2.1 环境准备 2.2 制作过程 2.3 成功上线 三 . 浏览器密码抓取 四. 权限维持 1. 手动权限维持 2. MSF自动化维持 五. 参考文章 一. 前言 攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常…...
Docker多架构镜像构建踩坑记
背景 公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构…...
docker 架构详解
Docker架构是基于客户端-服务器(C/S)模式的,包含多个关键组件,以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析: Docker 架构概述 Docker 架构采用客户端-服务器(C/S)…...
05-标准库开发-STM32-IIC协议
七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC),也常称为I2C(I squared C),是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上,如MPU6050姿态传感器、OLED显示屏、存…...
vue 封装全局过滤器
1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…...
【PlantUML系列】流程图(四)
目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字;结束一般使用stop/end关键字。基础用法包括: start ... stopstart ...…...
MATLAB中的合并分类数组
目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A,其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...
流编辑器sed(stream editor)
一.sed简介 sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处 理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复&…...
R语言的数据结构--矩阵
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 矩阵是一个二维数组,矩阵中的元素都具有相…...
使用 Python 爬取某网站简历模板(bs4/lxml+协程)
使用 Python 爬取站长素材简历模板 简介 在本教程中,我们将学习如何使用 Python 来爬取站长素材网站上的简历模板。我们将使用requests和BeautifulSoup库来发送 HTTP 请求和解析 HTML 页面。本教程将分为两个部分:第一部分是使用BeautifulSoup的方法&am…...
19 go语言(golang) - 通过反射手动实现json序列化
一、json 在 Go 语言中,JSON 序列化和反序列化通常通过标准库 encoding/json 来实现。这个包提供了简单易用的接口来将 Go 数据结构转换为 JSON 格式字符串(序列化),以及从 JSON 字符串解析出 Go 数据结构(反序列化&a…...
Scala:隐式转换
隐式转换的定义 //隐式转换:编译器自动滴,偷偷滴,把数据A->B object test04 {def main(args: Array[String]): Unit {val i:Int1//把Int类型,转化成Double类型//Int -> Double//隐式转换失败val b:Double1//隐式转换失败v…...
UVM之寄存器模型生成
1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 (1)首先通过openpyxl读取EXCEL表格, workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 (2ÿ…...
PL/SQL批量生成数据
在PL/SQL中生成大量模拟数据,特别是当你需要生成大量记录(如1亿条)时,有几种常见的方式可以提高生成数据的效率和性能。以下是一些常用的方法和最佳实践: 1. 使用PL/SQL块批量生成数据 PL/SQL块可以通过循环生成大量…...
Xcode模拟器运行报错:The request was denied by service delegate
Xcode模拟器运行报错:The request was denied by service delegate 造成的原因: (1)新的苹果M系列芯片的Mac电脑 (2)此电脑首次安装启动Xcode的应用程序 (3)此电脑未安装Rosetta 2 解决方法: …...
2024小迪安全基础入门第十课
目录 一、传输格式&数据-类型&编码&算法 1. 传输格式: 2. 传输数据: 3. 影响与渗透测试: #传输格式 #传输数据 二、密码存储&混淆-不可逆&非对称性 1. 密码存储: 2. 密码存储的影响: 3.…...
Redisson分布式限流器
Redisson分布式限流器 一、使用1.1、方法1.2、示例 二、原理2.1、设置限流器2.2、获取令牌 三、总结 最近有需求在做分布式限流,调研的限流框架大概有: 1、spring cloud gateway集成redis限流,但属于网关层限流 2、阿里Sentinel,功能强大、带监控平台 …...
xvisor调试记录
Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...
Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题,详情请看:Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)。我以为问题已经全部解决了…...
【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库
???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…...
家庭路由器跑PCND的优点
在当今数字化的时代,PCDN(Peer-to-Peer Content Delivery Network)技术逐渐走入人们的视野,有人考虑在家庭路由器上跑PCDN,下面是优点: 1.资源利用最大化 家庭网络在很多时候存在闲置的带宽和计算资源。通…...
ASP.NET Core API + MySql
环境 数据库: mysql8.0 后端: vs2022 ASP.NET Core API .net 8 前端: Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…...