?? 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 + -