1 //////////////////////////////////////////////////////////////////////////////
\r
3 // Filename: Command.c
\r
7 // Author: Liu, Zemin
\r
10 //-----------------------------------------------------------------------------
\r
12 // Target: STM32F103C8
\r
13 // Tool chain: CodeSourcery G++
\r
15 //-----------------------------------------------------------------------------
\r
18 //-----------------------------------------------------------------------------
\r
22 //-----------------------------------------------------------------------------
\r
23 // Revision History:
\r
25 ///////////////////////////////////////////////////////////////////////////////
\r
26 #include "stm32f10x.h"
\r
27 #include "stm32f10x_conf.h"
\r
31 #include "Command.h"
\r
32 #include "libdso138.h"
\r
36 // ===========================================================
37 // File Scope Global variables
38 // ===========================================================
40 const KeyScanCode KScanCodeTab[9] = {
\r
41 // scan code key code key param
\r
42 {0x7FFF, KC_SW1, '1'}, // 1
\r
43 {0xBFFF, KC_SW2, '2'}, // 2
\r
44 {0xDFFF, KC_SW3, '3'}, // 3
\r
45 {0xEFFF, KC_SW4, '4'}, // 4
\r
46 {0x7FFE, KC_SW1H, '5'}, // 5
\r
47 {0xBFFE, KC_SW2H, '6'}, // 6
\r
48 {0xDFFE, KC_SW3H, '7'}, // 7
\r
49 {0xEFFE, KC_SW4H, '8'}, // 8
\r
54 U8 VSenPrev, CplPrev;
\r
58 // ===========================================================
59 // Function Definitions
60 // ===========================================================
66 // =============================
\r
67 // Note: DSO_Init() must be executed for proper capture engine running
\r
71 // =============================
\r
73 // Check EEPROM for valid settings
\r
74 EE_ReadVariable(Addr_SettingStatus, &tmp0);
\r
75 if(tmp0 == SettingStatus_Initialized) {
\r
76 // Load saved settings
\r
77 EE_ReadVariable(VirtAddVarTab[Addr_Vpos], &tmp0);
\r
79 EE_ReadVariable(VirtAddVarTab[Addr_Vsen], &tmp0);
\r
81 EE_ReadVariable(VirtAddVarTab[Addr_Cpl], &tmp0);
\r
83 EE_ReadVariable(VirtAddVarTab[Addr_TimeBase], &tmp0);
\r
85 EE_ReadVariable(VirtAddVarTab[Addr_TrigMode], &tmp0);
\r
87 EE_ReadVariable(VirtAddVarTab[Addr_TrigEdge], &tmp0);
\r
89 EE_ReadVariable(VirtAddVarTab[Addr_TrigLvl], &tmp0);
\r
91 EE_ReadVariable(VirtAddVarTab[Addr_RecLen], &tmp0);
\r
93 EE_ReadVariable(VirtAddVarTab[Addr_HPos], &tmp0);
\r
95 EE_ReadVariable(VirtAddVarTab[Addr_VPosOfs], &tmp0);
\r
99 // Load default settings and initialize EEPROM
\r
101 EE_WriteVariable(VirtAddVarTab[Addr_Vpos], 0);
\r
103 EE_WriteVariable(VirtAddVarTab[Addr_Vsen], VS_05V);
\r
105 EE_WriteVariable(VirtAddVarTab[Addr_Cpl], CP_DC);
\r
106 SetTimeBase(TB_1ms);
\r
107 EE_WriteVariable(VirtAddVarTab[Addr_TimeBase], TB_1ms);
\r
108 SetTrigMode(TM_Auto);
\r
109 EE_WriteVariable(VirtAddVarTab[Addr_TrigMode], TM_Auto);
\r
110 SetTrigEdge(TE_Falling);
\r
111 EE_WriteVariable(VirtAddVarTab[Addr_TrigEdge], TE_Falling);
\r
113 EE_WriteVariable(VirtAddVarTab[Addr_TrigLvl], 0);
\r
114 SetRecLen(SampleBufSizeMax);
\r
115 EE_WriteVariable(VirtAddVarTab[Addr_RecLen], SampleBufSizeMax);
\r
116 SetHPos(GetRecLen()/2 - WDsize/2);
\r
117 EE_WriteVariable(VirtAddVarTab[Addr_HPos], GetRecLen()/2 - WDsize/2);
\r
119 EE_WriteVariable(VirtAddVarTab[Addr_VPosOfs], 0);
\r
121 // Mark down EEPROM has been initialized
\r
122 EE_WriteVariable(VirtAddVarTab[Addr_SettingStatus], SettingStatus_Initialized);
\r
128 // Misc initialization
131 Keypad.KDebounceVal = KD_val;
137 switch(Keypad.KeyCode) {
\r
180 Keypad.KScanBuf = NoKey;
\r
182 tmp1 = (PB_Port & PB_Bits) | ~PB_Bits;
184 Keypad.KScanBuf = tmp1;
\r
189 if((Keypad.KScanBuf == NoKey) || (Keypad.KScanBuf != Keypad.KScanCode)) {
\r
190 Keypad.KScanCode = Keypad.KScanBuf;
\r
192 Keypad.KHCount = 0;
\r
193 Keypad.KTimeChk = KH_val;
\r
197 if(Keypad.KCount > Keypad.KDebounceVal) {
\r
198 if(Keypad.KCount == Keypad.KDebounceVal + 3) {
\r
199 Keypad.KCount = Keypad.KDebounceVal;
\r
200 if(++Keypad.KHCount == Keypad.KTimeChk) {
\r
202 Keypad.KScanCode &= 0xFFFE;
\r
203 KeyConvert((KeyScanCode *)KScanCodeTab, Keypad.KScanCode);
\r
204 // Change KTimeChk for key repeat
205 Keypad.KTimeChk += KR_Time;
\r
209 else if(Keypad.KCount == Keypad.KDebounceVal) {
\r
211 KeyConvert((KeyScanCode *)KScanCodeTab, Keypad.KScanCode);
\r
215 #define Threshold_High 0x0900
\r
216 #define Threshold_Low 0x0300
\r
218 // Read switch SEN1
\r
219 tmp1 = ADC_Poll(ADC2, 2);
\r
221 if(tmp1 > Threshold_High) {
\r
224 else if(tmp1 > Threshold_Low) {
\r
228 // Read switch SEN2
\r
229 tmp1 = ADC_Poll(ADC2, 1);
\r
231 if(tmp1 > Threshold_High) {
\r
234 else if(tmp1 > Threshold_Low) {
\r
238 // Determine VSen setting
\r
239 tmp2 = 3 * tmp2 + tmp3 + VSenMin;
\r
240 if(tmp2 != VSenPrev) {
\r
243 UpdateDisp(Disp_Param);
\r
247 tmp1 = ADC_Poll(ADC2, 3);
\r
249 if(tmp1 > Threshold_High) {
\r
252 else if(tmp1 > Threshold_Low) {
\r
257 // Determine Cpl setting
\r
258 if(tmp2 != CplPrev) {
\r
261 UpdateDisp(Disp_Param);
\r
265 void KeyConvert(KeyScanCode *KSCTab, U16 KSCode)
269 while((tmp1 = *(U16 *)(KSCTab + 0))) {
272 Keypad.KeyCode = *(U8 *)((U8 *)KSCTab + 2);
\r
273 Keypad.KeyCodeBuf = Keypad.KeyCode;
\r
274 Keypad.KeyParam = *(U8 *)((U8 *)KSCTab + 3);
\r
278 // -- Proceed to next entry
279 KSCTab = (KeyScanCode *)((U8 *)KSCTab + sizeof(KeyScanCode));
289 tmp = GetDsoStatus();
\r
291 BitXor(tmp, DSO_Hold);
\r
293 if(BitTest(tmp, DSO_Hold)) {
\r
302 // Start capture at exit of HOLD
306 UpdateDisp(Disp_Param);
\r
314 switch(GetFocus()) {
\r
316 tmp0 = GetTimebase();
\r
318 tmp0 = SetTimeBase(tmp0);
\r
319 EE_WriteVariable(VirtAddVarTab[Addr_TimeBase], tmp0);
\r
320 if(tmp0 >= TB_20ms) {
\r
325 // Change sampling rate only
328 // Make key debounce time shorter for these TB's
\r
329 if((tmp0 < TB_20ms) && (tmp0 > TB_1s)) {
\r
330 Keypad.KDebounceVal = KD_val1;
333 Keypad.KDebounceVal = KD_val;
339 tmp0 = GetTrigMode();
\r
341 tmp0 = SetTrigMode(tmp0);
\r
342 EE_WriteVariable(VirtAddVarTab[Addr_TrigMode], tmp0);
\r
343 // Restart capture.
\r
348 tmp0 = GetTrigEdge();
\r
350 tmp0 = SetTrigEdge(tmp0);
\r
351 EE_WriteVariable(VirtAddVarTab[Addr_TrigEdge], tmp0);
\r
357 tmp1 = SetVPos(tmp1);
\r
358 EE_WriteVariable(VirtAddVarTab[Addr_Vpos], tmp1);
\r
359 UpdateDisp(Disp_Trace);
\r
363 tmp1 = GetTrigLvl();
\r
365 tmp1 = SetTrigLvl(tmp1);
\r
366 EE_WriteVariable(VirtAddVarTab[Addr_TrigLvl], tmp1);
\r
371 // Move waveform right
374 tmp1 = SetHPos(tmp1);
\r
375 EE_WriteVariable(VirtAddVarTab[Addr_HPos], tmp1);
\r
376 UpdateDisp(Disp_Trace);
\r
381 UpdateDisp(Disp_Param);
\r
389 switch(GetFocus()) {
\r
391 tmp0 = GetTimebase();
\r
393 tmp0 = SetTimeBase(tmp0);
\r
394 EE_WriteVariable(VirtAddVarTab[Addr_TimeBase], tmp0);
\r
395 if(tmp0 >= TB_50ms) {
\r
397 // UartPutc('7', USART1);
\r
399 // UartPutc('1', USART1);
\r
402 // Change sampling rate only
407 // Make key debounce time shorter for these TB's
\r
408 if((tmp0 < TB_20ms) && (tmp0 > TB_1s)) {
\r
409 Delay(50000); // To avoid same keypress repeated
\r
410 Keypad.KDebounceVal = KD_val1;
413 Keypad.KDebounceVal = KD_val;
420 tmp0 = GetTrigMode();
\r
422 tmp0 = SetTrigMode(tmp0);
\r
423 EE_WriteVariable(VirtAddVarTab[Addr_TrigMode], tmp0);
\r
424 // Restart capture.
\r
429 tmp0 = GetTrigEdge();
\r
431 tmp0 = SetTrigEdge(tmp0);
\r
432 EE_WriteVariable(VirtAddVarTab[Addr_TrigEdge], tmp0);
\r
438 tmp1 = SetVPos(tmp1);
\r
439 EE_WriteVariable(VirtAddVarTab[Addr_Vpos], tmp1);
\r
440 UpdateDisp(Disp_Trace);
\r
444 tmp1 = GetTrigLvl();
\r
446 tmp1 = SetTrigLvl(tmp1);
\r
447 EE_WriteVariable(VirtAddVarTab[Addr_TrigLvl], tmp1);
\r
452 // Move waveform left
455 tmp1 = SetHPos(tmp1);
\r
456 EE_WriteVariable(VirtAddVarTab[Addr_HPos], tmp1);
\r
457 UpdateDisp(Disp_Trace);
\r
462 UpdateDisp(Disp_Param);
\r
471 if(tmp >= FC_Max) {
\r
476 UpdateDisp(Disp_Param);
\r
483 if(GetFocus() == FC_VPos) {
\r
484 // Do VPos alignment
\r
485 tmp1 = (S16)(GetAverage() - WWindowMidValue);
\r
487 EE_WriteVariable(VirtAddVarTab[Addr_VPosOfs], tmp1);
\r
495 switch(GetFocus()) {
\r
503 tmp1 = GetTrigLvl();
\r
510 // Move waveform right
517 UpdateDisp(Disp_Param);
\r
524 switch(GetFocus()) {
\r
532 tmp1 = GetTrigLvl();
\r
539 // Move waveform left
546 UpdateDisp(Disp_Param);
\r
554 void LedBlink(void)
\r
559 Port_BitClr(LED_Base, (1 << LED_Bit));
\r
567 Port_BitSet(LED_Base, (1 << LED_Bit));
\r
575 Port_BitClr(LED_Base, (1 << LED_Bit));
\r
583 Port_BitSet(LED_Base, (1 << LED_Bit));
\r
586 void TestMode(void)
\r
590 // Change system clock to HSI
\r
591 RCC->CFGR &= ~RCC_CFGR_SW;
\r
592 RCC->CFGR |= RCC_CFGR_SW_HSI;
\r
594 // Disable JTAG and SWD
\r
595 AFIO->MAPR &= ~AFIO_MAPR_SWJ_CFG;
\r
596 AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_2;
\r
598 // Remap PD0 & PD1 to make them available as GPIO
\r
599 AFIO->MAPR |= AFIO_MAPR_PD01_REMAP;
\r
601 // Set all ports to output mode
\r
602 GPIOA->CRL = 0x33333333;
\r
603 GPIOA->CRH = 0x33333333;
\r
605 GPIOB->CRL = 0x33333333;
\r
606 GPIOB->CRH = 0x33333333;
\r
608 GPIOC->CRL = 0x33333333;
\r
609 GPIOC->CRH = 0x33333333;
\r
611 GPIOD->CRL = 0x33333333;
\r
612 GPIOD->CRH = 0x33333333;
\r
616 GPIOA->ODR = 0x5555;
\r
617 GPIOB->ODR = 0x5555;
\r
618 GPIOC->ODR = 0x5555;
\r
619 GPIOD->ODR = 0x5555;
\r
627 GPIOA->ODR = 0xAAAA;
\r
628 GPIOB->ODR = 0xAAAA;
\r
629 GPIOC->ODR = 0xAAAA;
\r
630 GPIOD->ODR = 0xAAAA;
\r