⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dso.c

📁 STM32手持式示波器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	DispButton();

	DispFrame();	/* 绘制刻度框 */
	DispChInfo();	/* 显示通道信息(幅度,时间档位) */

	DispCh1Wave();	/* 显示波形1 */	
	DispCh2Wave();	/* 显示波形2 */	
}

/*******************************************************************************
*	函数名: InitDsoParam
*	输  入:	无
*	输  出:	无
*	功  能:初始化全局参数变量
*/
static void InitDsoParam(void)
{
	g_DSO.Ch1Attenuation = 23;	/* 设置缺省衰减系数 */
	g_DSO.Ch2Attenuation = 23;	/* 设置缺省衰减系数 */
	g_DSO.Ch1VScale = 1000;	/* 缺省是1V */
	g_DSO.Ch2VScale = 1000;	/* 缺省是1V */

	g_DSO.Ch1VOffset = 70; 	/* 通道1 GND线位置 */
	g_DSO.Ch2VOffset = 170; /* 通道2 GND线位置 */

	g_DSO.ActiveCH = 1;		/* 缺省是CH1 */
	g_DSO.AdjustMode = 1;	/* 缺省是调节垂直偏移, 可以切换到2调节幅度 */

	g_DSO.HoldEn = 0;

	g_DSO.TimeBaseId = 0;									 
	g_DSO.TimeBase = 	g_TimeTable[g_DSO.TimeBaseId];
	g_DSO.SampleFreq = 25000000 / g_DSO.TimeBase;


	g_DSO.Ch1AttId = 2;
	g_DSO.Ch1Attenuation = g_AttTable[g_DSO.Ch1AttId][0];
	g_DSO.Ch1VScale =  g_AttTable[g_DSO.Ch1AttId][1];

	g_DSO.Ch2AttId = 2;
	g_DSO.Ch2Attenuation = g_AttTable[g_DSO.Ch2AttId][0];
	g_DSO.Ch2VScale =  g_AttTable[g_DSO.Ch2AttId][1];

}

/*******************************************************************************
*	函数名: IncSampleFreq
*	输  入:	无
*	输  出:	无
*	功  能:增加采样频率,按 1-2-5 
*	
*	时间轴分度(每1个大格的时长)
		20us 	      1250000
		50us 		   500000
		100us		   250000
		200us		   125000
		500us		    50000
		1ms				 2500
		2ms				 1250
		5ms				  500 
		10ms			  250
		20ms			  125
		50ms			   50
		100ms			   25

//		200ms			   12.5
//		500ms			    5

	g_DSO.TimeScale = 25000000 / g_DSO.SampleRate;
*/
static void IncSampleFreq(void)
{
	if (g_DSO.TimeBaseId < (sizeof(g_TimeTable) / 4) - 1)
	{
		g_DSO.TimeBaseId++;
	}
													 
	g_DSO.TimeBase = 	g_TimeTable[g_DSO.TimeBaseId];
	g_DSO.SampleFreq = 25000000 / g_DSO.TimeBase;

	SetSampRate(g_DSO.SampleFreq);	/* 改变采样频率 */
}

/*******************************************************************************
*	函数名: IncSampleFreq
*	输  入:	无
*	输  出:	无
*	功  能:降低采样频率,按 1-2-5 
*/
static void DecSampleFreq(void)
{
	if (g_DSO.TimeBaseId > 0)
	{
		g_DSO.TimeBaseId--;
	}
													 
	g_DSO.TimeBase = g_TimeTable[g_DSO.TimeBaseId];
	g_DSO.SampleFreq = 25000000 / g_DSO.TimeBase;

	SetSampRate(g_DSO.SampleFreq);	/* 改变采样频率 */
}

/*******************************************************************************
*	函数名: DecAttenuation
*	输  入:	ch   : 通道号,1或2
*			mode : 0 降低, 1增加
*	输  出:	无
*	功  能:降低衰减,按 1-2-5 
*/
static void AdjustAtt(uint8_t ch, uint8_t mode)
{

	if (ch == 1)
	{
		if (mode == 0) 	/* 降低 */
		{
			if (g_DSO.Ch1AttId > 0)
			{
				g_DSO.Ch1AttId--;
			}
		}
		else		/* 增加 */
		{
			if (g_DSO.Ch1AttId < ATT_COUNT - 1)
			{
				g_DSO.Ch1AttId++;
			}
		}

		g_DSO.Ch1Attenuation = g_AttTable[g_DSO.Ch1AttId][0];
		g_DSO.Ch1VScale =  g_AttTable[g_DSO.Ch1AttId][1];
	}
	else if (ch == 2)
	{
		if (mode == 0) 	/* 降低 */
		{
			if (g_DSO.Ch2AttId > 0)
			{
				g_DSO.Ch2AttId--;
			}
		}
		else		/* 增加 */
		{
			if (g_DSO.Ch2AttId < ATT_COUNT - 1)
			{
				g_DSO.Ch2AttId++;
			}
		}
		g_DSO.Ch2Attenuation = g_AttTable[g_DSO.Ch2AttId][0];
		g_DSO.Ch2VScale =  g_AttTable[g_DSO.Ch2AttId][1];
	}
}

/*******************************************************************************
*	函数名: StopADC
*	输  入:	无
*	输  出:	无
*	功  能:暂停ADC采样
*/
static void StopADC(void)
{
	TIM_Cmd(TIM1, DISABLE);

	/* Enable DMA1 channel1 */
	DMA_Cmd(DMA1_Channel1, DISABLE);
	
	/* Enable DMA2 channel5 */
	DMA_Cmd(DMA2_Channel5, DISABLE);
}

/*******************************************************************************
*	函数名: StopADC
*	输  入:	无
*	输  出:	无
*	功  能:暂停ADC采样
*/
static void StartADC(void)
{
#if 1
	DMA_InitTypeDef DMA_InitStructure;

	DMA_DeInit(DMA1_Channel1);		/* 复位DMA1寄存器到缺省状态 */
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;	/* 选择ADC1的数据寄存器作为源 */
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&g_DSO.Ch1Buf;	/* 目标地址 */
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;	/* 设置DMA传输方向,外设(ADC)作为源 */
	DMA_InitStructure.DMA_BufferSize = SAMPLE_COUNT;	/* 设置缓冲区大小 */
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;	/* 外设地址不自增 */
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	/* 存储器地址需要自增 */
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	/* 选择外设传输单位:16bit */
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;	/* 选择内存传输单位:16bit */
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;	/* 无需循环模式   */
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;	/* 选择DMA优先级 */
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;	/* DMA传输类型,不是内存到内存 */
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);

	DMA_DeInit(DMA2_Channel5);		/* 复位DMA2寄存器到缺省状态 */
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_Address;	/* 选择ADC1的数据寄存器作为源 */
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&g_DSO.Ch2Buf;	/* 目标地址 */
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;	/* 设置DMA传输方向,外设(ADC)作为源 */
	DMA_InitStructure.DMA_BufferSize = SAMPLE_COUNT;	/* 设置缓冲区大小 */
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;	/* 外设地址不自增 */
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	/* 存储器地址需要自增 */
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	/* 选择外设传输单位:16bit */
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;	/* 选择内存传输单位:16bit */
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;	/* 无需循环模式   */
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;	/* 选择DMA优先级 */
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;	/* DMA传输类型,不是内存到内存 */
	DMA_Init(DMA2_Channel5, &DMA_InitStructure);
#endif

	/* Enable DMA2 channel5 */
	DMA_Cmd(DMA1_Channel1, ENABLE);

	/* Enable DMA2 channel5 */
	DMA_Cmd(DMA2_Channel5, ENABLE);

	TIM_Cmd(TIM1, ENABLE);
}

/*******************************************************************************
*	函数名: DsoRun
*	输  入:	无
*	输  出:	无
*	功  能:DSO全速运行状态
*/
static void DsoRun(uint8_t *pMainStatus)
{
	uint8_t KeyCode;
	uint8_t fRefresh = 1;	/* LCD刷新标志 */

	InitDsoParam();	/* 初始化示波器参数 */

	InitDSO();		/* 配置示波器用到的外设:ADC,TIM,DMA等 */

	LCD_Clear(Blue);  			/* 清屏,背景蓝色 */
	LCD_SetBackColor(Blue);		/* 设置文字背景颜色 */

	LCD_SetTextColor(White);	/* 设置文字颜色 */

	StartTimer(1, 150);		/* 启动定时器1,100ms刷新1次 */
	while (*pMainStatus == S_RUN)
	{
		CPU_IDLE();

		if (fRefresh)
		{
			fRefresh = 0;

			//StopADC();	/* 暂停采样 */
			if (g_DSO.HoldEn == 1)
			{
				DispDSO();
			}
			//StartADC();	/* 开始采样 */
		}

		if (CheckTimer(1))
		{
			StartTimer(1, 150);		/* 启动定时器1,100ms刷新1次 */

			/* 运行状态。每隔100ms刷新1次波形 */
			if (g_DSO.HoldEn == 0)
			{
				StopADC();	/* 暂停采样 */
				DispDSO();
				StartADC();	/* 开始采样 */
			}
		}

		/* 读取按键,大于0表示有键按下 */
		KeyCode = GetKey();
		if (KeyCode > 0)
		{
			/* 有键按下 */
			switch (KeyCode)
			{
				case  KEY_DOWN_TAMPER:	/* TAMPER 键,通道选择(CH1或CH2) */
					if (g_DSO.ActiveCH == 1)
					{
						g_DSO.ActiveCH = 2;
					}
					else
					{
						g_DSO.ActiveCH = 1;
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case  KEY_DOWN_WAKEUP:	/* WAKEUP 键, 调节模式选择(幅度或者垂直偏移) */
					/* 退出,进入全速运行状态 */
					*pMainStatus = S_HELP;
					break;

				case  KEY_DOWN_USER:	/* USER 键 */
					if (g_DSO.HoldEn == 0)
					{
						g_DSO.HoldEn = 1;

						/* 保存暂停时的时基,为了水平扩展用 */
						g_DSO.TimeBaseIdHold = g_DSO.TimeBaseId;	

						StopADC();
					}
					else
					{
						g_DSO.HoldEn = 0;
						StartADC();				
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case KEY_DOWN_JOY_LEFT:	/* 摇杆LEFT键按下 */
					if (g_DSO.HoldEn == 0)
					{
						DecSampleFreq();	/* 递减采样频率 */
						fRefresh = 1;		/* 请求刷新LCD */
					}
					else
					{
						; /* 波形水平移动,待完善 */
					}
					break;

				case KEY_DOWN_JOY_RIGHT:	/* 摇杆RIGHT键按下 */
					if (g_DSO.HoldEn == 0)
					{
						IncSampleFreq();  	/* 递增采样频率 */					
						fRefresh = 1;		/* 请求刷新LCD */
					}
					else
					{
						; /* 波形水平移动,待完善 */
					}
					break;

				case  KEY_DOWN_JOY_OK:	/* 摇杆OK键 */
					if (g_DSO.AdjustMode == 0)
					{
						g_DSO.AdjustMode = 1;
					}
					else
					{
						g_DSO.AdjustMode = 0;
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case KEY_DOWN_JOY_UP:	/* 摇杆UP键按下 */
					if (g_DSO.ActiveCH == 1) 	/* 当前激活的是CH1 */
					{
						if (g_DSO.AdjustMode == 0)	/* 调节幅度放大倍数 */
						{
							AdjustAtt(1, 1);
						}
						else 	/* 调节上下偏移 */
						{
							g_DSO.Ch1VOffset -= 5;
						}
					}
					else	/* 当前激活的是CH2 */
					{
						if (g_DSO.AdjustMode == 0)	/* 调节幅度放大倍数 */
						{
							AdjustAtt(2, 1);
						}
						else 	/* 调节上下偏移 */
						{
							g_DSO.Ch2VOffset -= 5;
						}
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case KEY_DOWN_JOY_DOWN:		/* 摇杆DOWN键按下 */
					if (g_DSO.ActiveCH == 1) 	/* 当前激活的是CH1 */
					{
						if (g_DSO.AdjustMode == 0)	/* 调节幅度放大倍数 */
						{
							AdjustAtt(1, 0);
						}
						else 	/* 调节上下偏移 */
						{
							g_DSO.Ch1VOffset += 5;
						}
					}
					else	/* 当前激活的是CH2 */
					{
						if (g_DSO.AdjustMode == 0)	/* 调节幅度放大倍数 */
						{
							AdjustAtt(2, 0);
						}
						else 	/* 调节上下偏移 */
						{
							g_DSO.Ch2VOffset += 5;
						}
					}
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				default:
					break;
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -