嵌入式实践——烟雾产生器

2023-10-31

开发工具:Altium Designer 2020、STM32CubeMX 5.3.0、MDK-ARM 5.28

1.设计需求

设计出一套完整的烟雾产生装置,该装置通过按钮来控制烟雾的产生和关闭。装置对体积要求较高,所以控制板需控制在4cm*3cm,同时根据装置所要安装的器件来灵活调整控制板的形状,具体功能需求如下:
(1)能连续产生烟雾;
(2)采用锂电池方式供电,锂电池充电具有正在充电和充电完成指示,电池电量低提醒;
(3)烟雾需呈现蓝色和红色两种颜色,颜色根据需要进行切换;
(4)加热电路电流、电压监测;
(5)采用无线方式控制烟雾效果。

2.设计方案

(1)设备电源

整个设备供电采用小型锂电池,预留有线电源供电接口,能保证整机持续工作约2小时;设计锂电池充电电路,通过Micro USB接口为锂电池充电并在充电进行和充电结束时LED提醒;设计LDO电源为系统控制器及其他电路供电。

(2)烟雾产生

利用加热丝将加热棉中的电子烟油进行加热,以便产生烟雾;为避免加热丝连续通电对使用寿命和烟雾效果造成影响,采用PWM控制电流加热,并将出烟量调节至最佳状态;设计电压与电流检测电路,检测加热过程电压值和电流值。

(3)烟雾效果

①烟雾喷出速度: 通过控制风机转速实现,并设定几个可选择挡位;
②烟雾颜色: 通过不同颜色的LED灯来进行控制,通过不同灯光的照射使烟雾呈现不同的颜色。

(4)出烟控制

出烟控制分为烟雾产生开关、风机开关、双色LED开关,开关的控制均通过STM32F030F4P6控制,并使用 LC12S无线模块控制烟雾大小、风扇转速、烟雾颜色。

(5)低功耗

发烟器3min未接收到控制指令,自动休眠无线模块并将STM32进入停止模式,收到控制命令时自动唤醒。

3.硬件电路

在这里插入图片描述
电路原理图:SMKController.SchDoc
PCB:SMKController.PcbDoc

4.软件代码

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdlib.h>
/* USER CODE END Includes */
/* Private define ------------------------------------------------------------*/
#define Close_LED		  0x00
#define Open_RedLED		  0x01
#define Open_BlueLED	  0x02
#define FAN_Speed_0       0x00
#define FAN_Speed_1       0x01
#define FAN_Speed_2       0x02
#define FAN_Speed_3       0x03
/* USER CODE BEGIN PD */
void ADC_Check(void);
void OUTPUT_PWM(void);
void OUTPUT_PWM_first(void);
void OUTPUT_FAN(uint16_t FAN_MODE);
void LED_Control(void);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim);
void StopMode_Measure(void);
/* USER CODE END PD */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint16_t dutyCycle1=0;				//占空比0%
uint16_t dutyCycle2=300;			//占空比30%
uint16_t dutyCycle3=500;
uint16_t dutyCycle600=600;
uint16_t dutyCycle4=700;
uint16_t dutyCycle5=800;
uint16_t dutyCycle1000=1000;
uint8_t aTxBuffer1[1];				//串口接收命1缓存
uint8_t aTxBuffer2[1];				//串口接收命2缓存
uint8_t aTxBuffer3[1];				//串口接收命3缓存
uint8_t aRxBuffer[10];				//串口接收的命令
uint8_t i;							//串口命令计数
uint8_t Sum=0;						//串口命令校验和
uint32_t ADC_Value[100];			//ADC_DMA模式采集数据缓存
uint32_t Battery_Value_Check,Res_Current_Check;			//电池电压、发热丝电流
uint16_t FAN_MODE;					//风扇档位
uint8_t aTxCheck_PWM[1];			//PWM输出数据缓存 
uint8_t aTxCheck_LED[1];			//LED灯光控制数据缓存
uint8_t TIM_2S_DONE;				//2s计数完成标志    	  1:完成   0:未完
uint8_t TIM_12S_DONE=2;				//12s计数完成标志  	  1:完成   0:未完
uint8_t TIM_3M_DONE;				//3min计数完成标志  	  1:完成   0:未完				
uint8_t flag = 2;
uint8_t Count_Flag = 0;				//3min计数过程标志 		
uint8_t Wait_Entry_Sleep = 0;		//3min计数
uint8_t uint8_t Stop_Mode_flag;		//停止模式标志位    	  1:True   2:False
uint8_t BlueLED_Flag=0;			    //蓝光控制标志     	  1:开     0:关
uint8_t RedLED_Flag=0;				//红光控制标志	  	  1:开     0:关
uint8_t LED_Close_Flag=0;		    //灯光关闭标志
uint8_t Uart_RX_Date_Flag=0;	    //串口接收数据标志	  1:接收到运行命令  0:接收到结束命令
uint8_t Uart1_PWM_Flag=0;   		//串口发送PWM输出命令标志位
uint8_t dmaflag=0;					//DMA标志位
uint8_t Tim14BaseCnt=0;				//7ms计数
uint8_t Tim14BaseCnt_PWM_first=0;   //12s计数
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
	/* MCU Configuration--------------------------------------------------------*/
	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();
	/* Configure the system clock */
	SystemClock_Config();
	/* Initialize all configured peripherals */
	MX_GPIO_Init();
    MX_DMA_Init();
    MX_ADC_Init();
    MX_TIM3_Init();
    MX_TIM14_Init();
    MX_USART1_UART_Init();
    /* USER CODE BEGIN 2 */
    HAL_ADC_Start_DMA(&hadc, (uint32_t*)ADC_Value, 100);					 //使能ADC_DMA采集模式
    if(HAL_UART_Receive_IT(&huart1,aRxBuffer,10)!=HAL_OK)Error_Handler();	 //开启串口中断接收模式
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); 								 //使能PWM输出
	HAL_TIM_Base_Start_IT(&htim14);											 //使能TIM计时												 				  
    /* USER CODE END 2 */
    
/* USER CODE BEGIN WHILE */
while (1)
{
	ADC_Check();							//ADC采集电池电压及发热丝电流
	OUTPUT_PWM_first();						//PWM输出
	LED_Control();							//双色LED灯光控制
	OUTPUT_FAN(FAN_MODE);					//风扇转速控制
	if(Stop_Mode_flag == 1)					//停止模式标志位判断
	{
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET);	    //休眠串口无线模块
		Stop_Mode_flag = 2;
		StopMode_Measure();					//进入停止模式  
	}
    /* USER CODE END WHILE */
  }
}

/**
  * @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 CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.HSI14CalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
/* ADC RxdCallback Fuction */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	dmaflag = 1;
	
	HAL_ADC_Stop_DMA(hadc);
}
	
/* Base Timer Callback Fuction */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)   //每1ms进入一次中断,1ms计数一次
{
	if(htim->Instance == htim14.Instance)
	{
		/* PWM_First 12s计时 */
		if (TIM_12S_DONE == 0)				 
		{
			if(Tim14BaseCnt_PWM_first<12000)
			{
				Tim14BaseCnt_PWM_first++;
			}
			else
			{
				TIM_12S_DONE = 1;
				flag = 1;
				Tim14BaseCnt_PWM_first=0;
			}
		}	
		/* 12s后PWM间隔输出2s计时 */
		if (TIM_12S_DONE == 1)			
		{
			if(Tim14BaseCnt<70)
			{
				Tim14BaseCnt++;
			}
			else
			{
				Tim14BaseCnt= 0;
				TIM_2S_DONE = abs(TIM_2S_DONE-1);
			}
		}	
		/* 接收结束命令后3min计时进入停止模式,3min内有非结束命令时自动退出计时 */
		if (TIM_3M_DONE == 1)				
		{
			if(Wait_Entry_Sleep < 180000)
			{
				if(Uart_RX_Date_Flag==0)
				{
					Wait_Entry_Sleep++;	
					Count_Flag++;
				}
				else if(Uart_RX_Date_Flag==1)
				{
					Count_Flag=200000;
					Wait_Entry_Sleep=180000;
				}
			}
			if(Count_Flag==200000)
			{
				Wait_Entry_Sleep = 0;
				TIM_3M_DONE = 2;
				Count_Flag=0;
			}
			else if(Count_Flag>179998)
			{
				Stop_Mode_flag = 1;
				Wait_Entry_Sleep = 0;
				TIM_3M_DONE = 2;
				Count_Flag=0;
			}
		}
	}
}	

/* Usart RxdCallback Fuction */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		for(i=2;i<=8;i++)
		{
			Sum = Sum + aRxBuffer[i];
		}	
		if(Sum%302==aRxBuffer[9] && aRxBuffer[2]==0x0A)		 //校验和
		{
			Uart_RX_Date_Flag=1;
			/* PWM串口命令分析 */
			if(aRxBuffer[3]==0 && aRxBuffer[4]==0 && aRxBuffer[5]==0)	//当接收到结束命令时,开启3min计时
			{
				TIM_3M_DONE=1;
				Uart_RX_Date_Flag=0;
			}
			aTxBuffer1[0]=aRxBuffer[3];
			if(aTxCheck_PWM[0]==aTxBuffer1[0])      		//防止第二次相同命令重新运行
			{				
				aTxCheck_PWM[0]=aTxBuffer1[0];
			}
			else if(aTxBuffer1[0]==0x00)					//对第一个PWM输出命令进行判断
			{
				Uart1_PWM_Flag = 0;
				flag=0;
				TIM_12S_DONE = 2;	
				aTxCheck_PWM[0]=aTxBuffer1[0];		
			}
			else if(aTxBuffer1[0]==0x01)
			{
				Uart1_PWM_Flag = 1;
				TIM_12S_DONE = 0;
				flag=0;
				TIM_2S_DONE = 0;			
				aTxCheck_PWM[0]=aTxBuffer1[0];		
			}
			/* LED串口命令分析 */
			aTxBuffer2[0]=aRxBuffer[4];
			switch(aTxBuffer2[0])										//对第二个LED灯光控制命令进行判断				
			{
				case Open_BlueLED:
					BlueLED_Flag=1;
				break;
				case Open_RedLED:
					RedLED_Flag=1;
				break;
				case Close_LED:
					LED_Close_Flag=1;
				break;
				default:;
			}
			/* FAN串口命令分析 */
			aTxBuffer3[0]=aRxBuffer[5];							
			switch(aTxBuffer3[0])
			{
				case FAN_Speed_0:
				FAN_MODE = 0;
				break;
				case FAN_Speed_1:
				FAN_MODE = 1;
				break;
				case FAN_Speed_2:
				FAN_MODE = 2;
				break;
				case FAN_Speed_3:
				FAN_MODE = 3;
				break;
				default:;
			}
			Sum=0;
		}
		
		else
		{
			Sum=0;
			memset(aRxBuffer, 0, sizeof aRxBuffer); 	//命令错误清除缓冲区域数据
		}
		HAL_UART_Receive_IT(&huart1,aRxBuffer,10);	//再次开启串口接收
	}
}

/**
* ADC_DMA模式采集函数
* 判断电池电压及发热丝电流,用led灯显示
*/
void ADC_Check(void)													
{
	if(dmaflag == 1)   //判断中断标志,调用ADC Check函数。
		{
			dmaflag = 0;
			for(i=0,Battery_Value_Check=0,Res_Current_Check=0; i<100;i++)
			{
				Battery_Value_Check = ADC_Value[i]*3000/4096*2;
				Res_Current_Check = ADC_Value[i+1]*3000/4069/0.05/100;
				if(Battery_Value_Check>0 && Res_Current_Check>0)
				{
					HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
				}
				HAL_ADC_Start_DMA(&hadc, (uint32_t*)ADC_Value, 100);			//重新使能ADC_DMA采集模式
			}
		
		}
}

/**
* 电阻丝加热控制,加热开始阶段
* 前12s阶段PWM输出控制函数
* PWM_first输出控制,前12s输出占空比为80%的PWM波
*/
void OUTPUT_PWM_first(void)
{
	if (Uart1_PWM_Flag == 1)
		{
			if(flag == 1)
			{
				OUTPUT_PWM();
			}
			if(flag == 0)				//前12s阶段PWM输出控制函数
			{
				HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);	
				__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutyCycle5);  //输出占空比为80%的PWM波
			}
		}
	if(Uart1_PWM_Flag == 0)
	{
		HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
		TIM_2S_DONE = 0;
	}	
}

/**
* 12秒后阶段PWM输出控制函数
* PWM输出控制,12s后输出80%占空比的PWM波
*/
void OUTPUT_PWM(void)
{
	if(TIM_2S_DONE == 1)
	{
		HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);	
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutyCycle5);
	}
	if(TIM_2S_DONE == 0)
	{
		HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
	}
}
	
/**
* LED灯光控制函数
* 分别对红蓝光进行开关控制
*/
void LED_Control(void)
{
	if(BlueLED_Flag==1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
		BlueLED_Flag=0;
	}
	if(RedLED_Flag==1)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		RedLED_Flag=0;
	}
	if(LED_Close_Flag==1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
		LED_Close_Flag=0;
	}
}

/**
* 风扇转速控制函数
* PWM输出控制,进行各个风扇档位进行控制,默认档位为占空比60%
*/
void OUTPUT_FAN(uint16_t FAN_MODE)
{
	switch(FAN_MODE)
	{
		case 0:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle1);
		break;
		case 1:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle2);
		break;
		case 2:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle3);
		break;
		case 3:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle4);
		break;
		default:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle600);
	}
}

/**
* 停止模式函数
* 进入停止模式,等待EXTI唤醒 
*/
void StopMode_Measure(void)
{
	HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
	HAL_Delay(200);
}

/**
* EXTI_Callback函数
* 按键中断将单片机从停止模式唤醒
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == SW_Pin)
	{
		SystemClock_Config();										//重新使能时钟,因为停止模式将其关闭
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET);	 	//唤醒串口无线模块	
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);						//按键提示灯,可删除
		__HAL_GPIO_EXTI_CLEAR_IT(SW_Pin);							//Clear the EXTI's line pending bits.
	}
}
/* 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 */

  /* USER CODE END Error_Handler_Debug */
}

本次实践的烟雾发生器是三年前导师项目中所需的一个小装置,软硬件基础功能都已实现,这算是自己做的第一个嵌入式实践,硬件和软件设计可能还不规范,在此做一个整理记录。在烟雾效果的调试过程中很有趣,需将加热电流大小、加热时间、风力大小、加热丝粗细以及加热棉材料等因素进行合理的选择,才能达到烟雾的最佳效果,否则会导致烟雾效果不佳和加热丝熔断的情况发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式实践——烟雾产生器 的相关文章

  • arm gcc工具链为arm-elf或arm-none-eabi,有什么区别?

    当您构建 gcc 工具链时 可以将其构建为arm elf 或arm none eabi 但是有什么区别呢 我今天使用 eabi 但这只是因为其他人似乎都这样做 但由于这是一个非常糟糕的论点 因此理解其中的差异真的很高兴 注意 此工具链将为基
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • python3.7安装dlib (Wind10)

    使用pip install dlib 提示失败 原因 https pypi org project dlib files 查看说明最新版本dlib 19 20 0 不支持Python3 7 解决方案 整理了下网上说的方案大致如下 一 编译安
  • android 悬浮组件实现

    项目需求 需要实现一个每个页面都存在的悬浮按钮 可以拖动 跟随整个项目的生命周期 即应用登录之后显示悬浮按钮 应用退出之后 隐藏悬浮按钮 特殊页面隐藏悬浮按钮 应用后台展示之后 隐藏悬浮按钮 应用恢复前台展示 显示悬浮按钮 准备工作 添加权
  • js提示“没有权限”的问题(转载)

    当某个互联网运营商的网站上规模之后 他们都会考虑将网站部署到主域名相同 子域名不同的服务器集群上 以此来构建一个聚合的应用 同时 希望能够利用 JavaScript 在不同子域的网页间相互操作 实现一个对用户来说 无缝 的应用 这时 跨域操
  • 我是如何用 redis 分布式锁来解决线上历史业务问题的

    近期发现 开发功能的时候发现了一个 mq 消费顺序错乱 历史遗留问题 导致业务异常的问题 看看我是如何解决的 问题抛出 首先 简单介绍一下情况 线上 k8s 有多个 pod 会去消费 mq 中的消息 可是生产者发送的消息是期望一定要有序去消
  • HTML5 postMessage和跨域通信

    HTML5 postMessage和跨域通信 http iknowledge wikispaces com HTML5 postMessage E5 92 8C E8 B7 A8 E5 9F 9F E9 80 9A E4 BF A1 HTM
  • stm32cubemx hal学习记录:FreeRTOS中断管理

    一 参数配置 1 配置RCC USART1 时钟84M 2 配置SYS 将Timebase Source修改为除滴答定时器外的其他定时器 3 初始化LED的两个引脚 两个按键引脚 4 开启FreeRTOS v1与v2版本不同 一般选用v1即
  • 梯度下降法及其Python实现

    梯度下降法 gradient descent 又名最速下降法 steepest descent 是求解无约束最优化问题最常用的方法 它是一种迭代方法 每一步主要的操作是求解目标函数的梯度向量 将当前位置的负梯度方向作为搜索方向 因为在该方向
  • 轻松玩转开源大语言模型bloom(一)

    前言 chatgpt已经成为了当下热门 github首页的trending排行榜上天天都有它的相关项目 但背后隐藏的却是openai公司提供的api收费服务 作为一名开源爱好者 我非常不喜欢知识付费或者服务收费的理念 所以便有决心写下此系列
  • Vue3最常见的10道面试题:含答案和代码示例的练习题

    本文列举了10道Vue3面试题 每道题都包含了答案和代码示例 希望对你的面试有所帮助 什么是Vue3 Vue3是Vue js的下一个主要版本 它带来了很多重要的改进和新功能 包括更快的渲染速度 更好的类型支持 更好的组合API等 什么是Co
  • Postman 如何调用文件上传下载接口

    文件导入导出是管理后台的通用功能 所以在接口写好后在没有前端页面使用Postman进行接口调用测试接口功能成为一个选择 导出 在我们输入接口地址 token等候 点击send 发现下载的成为了乱码 如下图 这明显不符合我们的预期期望 在se
  • 文本分析简历项目收集-----机器学习(仅供参考)

    文本分析 项目3 基于自然语言处理的影评分析 项目简介 通过大量的正面和负面的电影评论对计算机进行自然语言训练 实现计算机对电影评论的基本情感分析 使其能够快速判断出评论是否积极 个人职责 1 对正面和负面的电影评论进行分词处理 整理成规定
  • 一次让人难以忘怀的排查频繁Full GC过程

    我们的Java应用因频繁FULL GC导致性能降低很多 经过多人的定位也没有结论 于是我自主请命 经过一天的研究终于搞定了 现把经验与大家共享 相关的gc日志如下 4 758 Full GC PSYoungGen 464K gt 0K 71
  • linux统计一个文件中特定字符的个数

    统计一个文件中某个字符串的个数 其实就是在在一块沙地里面找石头 有的人看到石头以后 在上面做个标记 grep 然后记住自己做了多少个标记 有的 人看到石头以后 把它挖了 tr 最后统计自己挖了多少石头 有的人看到石头以后 把它跳过去 awk
  • STL:list的模拟实现(迭代器失效探讨)

    为什么重新设计list迭代器 对迭代器解引用 我们希望拿到的是指针所指向的值域 而直接解引用拿到的是指针所指向的节点 对list指针 和 迭代器 提供一种方法 使其能够按照顺序访问容器 聚合物 所含的各个元素 并且不用暴露容器内部的表述方式
  • 达芬奇15中文版

    教程 1 下载解压 得到davinci resolve 15原程序和文件 2 双击文件 DaVinci Resolve Studio 15 0b2 Windows exe 依提示安装原程序 3 达芬奇软件需要安装必要的组件 一般按默认安装即
  • Flexible弹性布局

    flex布局 弹性布局 flex的两个重要概念 开启了flex布局的元素叫flex container display flex inline flex flex container 里面的直接子元素叫做 flex items flex布局
  • 来源查询检索的研究

    来源查询检索的研究 来源查询的方式主要有 基于内容索引的查询 gt 基于时间局部性的上下文增强搜索查询 gt 基于因果关系的查询 根据provenance提供上下文有关的索引 即因果关系 1 传统的来源查询检索方式为基于内容索引的查询 在这
  • 阿里云视频点播文件上传-iOS

    文章目录 阿里云视频点播文件上传 iOS 一 上传方式 方式一 上传地址加凭证上传 1 请求AppServer 2 在start的回调中设置上传地址和上传凭证 3 uploadAuth过期重新设置 4 上传图片和上传视频 方式二 STS方式
  • 记一次线上CPU持续飙升的问题排查

    最近公司的事务多了很多 都很少有时间来更新了 上周六项目上刚刚发生了一次CPU持续飙高 导致服务不可用的线上事故 在此也简单做下记录 问题排查的过程大概是这样的 查看业务日志中最开始报错的信息 发现数据库连接超时 redis也连接超时 而且
  • 嵌入式实践——烟雾产生器

    开发工具 Altium Designer 2020 STM32CubeMX 5 3 0 MDK ARM 5 28 1 设计需求 设计出一套完整的烟雾产生装置 该装置通过按钮来控制烟雾的产生和关闭 装置对体积要求较高 所以控制板需控制在4cm