📄 dso.c
字号:
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 + -