//-------------------------------------------------------------- // Interrupt (ISR-Function) // is called when DMA interrupt // (In Half Transfer Complete and TransferCompleteInterrupt) // //-------------------------------------------------------------- void DMA2_Stream0_IRQHandler(void) { ADC_t *adc = &ADC_UB; if (DMA_GetITStatus(DMA2_Stream0, DMA_IT_HTIF0)) { // HalfTransferInterruptComplete interrupt from DMA2 occurred DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_HTIF0); if (adc->DmaStatus == ADC_DMA_RUN && (adc->Status == ADC_RUNNING || adc->Status == ADC_PRE_TRIGGER) ) { if ((ADC1_DMA_STREAM->CR & DMA_SxCR_CT) == 0) // Examined trigger point in quadrant 1 ADC_searchTrigger(ADC_DMA_Buffer_A, 0, 1); else // Examined trigger point in quadrant 3 ADC_searchTrigger(ADC_DMA_Buffer_B, 0, 3); } } else if (DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0)) { // TransferInterruptComplete interrupt from DMA2 occurred DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); if (adc->DmaStatus == ADC_DMA_RUN) { TIM_Cmd(TIM2, DISABLE); if (adc->Status != ADC_START) { if (adc->Status == ADC_TRIGGER_OK) adc->Status = ADC_READY; else { TIM_Cmd(TIM2, ENABLE); if ((ADC1_DMA_STREAM->CR & DMA_SxCR_CT) != 0) // Examined trigger point in quadrant 2 ADC_searchTrigger(ADC_DMA_Buffer_A, ADC_HALF_ARRAY_LEN, 2); else // Examined trigger point in quadrant 4 ADC_searchTrigger(ADC_DMA_Buffer_B, ADC_HALF_ARRAY_LEN, 4); } } else { TIM_Cmd(TIM2, ENABLE); adc->Status = ADC_RUNNING; } } UB_Led_Toggle(LED_GREEN); } }
void test_FPU_test(void* p) { float ff = 1.0f; printf("Start FPU test task.\n"); for (;;) { UB_Led_Toggle(LED_BLUE); float s = sinf(ff); ff += s; // TODO some other test vTaskDelay(1000); } vTaskDelete(NULL); }
int main(void) { uint32_t adr; uint8_t sollwert, istwert; ErrorStatus ramcheck; SystemInit(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // init vom externen SDRAM (und test ob es vorhanden ist) ramcheck=UB_SDRAM_Init(); if(ramcheck==SUCCESS) { // zum test RAM komplett füllen sollwert=0xA1B2; for(adr=0;adr<SDRAM_MAX_ADR;adr+=2) { UB_SDRAM_Write16b(adr,sollwert); sollwert++; } // Ram wieder auslesen und prüfen sollwert=0xA1B2; for(adr=0;adr<SDRAM_MAX_ADR;adr+=2) { istwert=UB_SDRAM_Read16b(adr); if(istwert!=sollwert) { // RAM-Inhalt fehlerhaft ramcheck=ERROR; } sollwert++; } } while(1) { if(ramcheck==SUCCESS) { // wenn kein Fehler -> gruene LED leuchtet UB_Led_On(LED_GREEN); } else { // wenn Fehler -> rote LED blinkt UB_Led_Toggle(LED_RED); Delay(5000000); } } }
void LED1on(void) { UB_Led_Toggle(LED1); }
//-------------------------------------------------------------- // start vom Oszi (Endlosloop) //-------------------------------------------------------------- void oszi_start(void) { MENU_Status_t status; p_oszi_draw_background(); UB_Graphic2D_Copy2DMA(Menu.akt_transparenz); while(1) { //--------------------------------------------- // warten bis GUI-Timer abgelaufen ist //--------------------------------------------- if(GUI_Timer_ms==0) { GUI_Timer_ms=GUI_INTERVALL_MS; //-------------------------------------- // User-Button einlesen (fuer RUN/STOP) //-------------------------------------- if(UB_Button_OnClick(BTN_USER)==true) { status=MENU_NO_CHANGE; if(Menu.trigger.mode==2) { // "single" if(Menu.trigger.single==4) { Menu.trigger.single=5; // von "Ready" auf "Stop" status=MENU_CHANGE_NORMAL; } } else { // "normal" oder "auto" if(Menu.trigger.single==0) { Menu.trigger.single=1; // von "Run" auf "Stop" status=MENU_CHANGE_NORMAL; } else if(Menu.trigger.single==1) { Menu.trigger.single=2; // von "Stop" auf "Weiter" status=MENU_CHANGE_NORMAL; } } } else { //-------------------------------------- // Test ob Touch betaetigt //-------------------------------------- status=menu_check_touch(); } if(status!=MENU_NO_CHANGE) { p_oszi_draw_background(); if(status==MENU_CHANGE_FRQ) ADC_change_Frq(Menu.timebase.value); if(status==MENU_CHANGE_MODE) { ADC_change_Mode(Menu.trigger.mode); if(Menu.trigger.mode!=2) { Menu.trigger.single=0; } else { Menu.trigger.single=3; } p_oszi_draw_background(); // nochmal zeichnen, zum update ADC_UB.status=ADC_VORLAUF; TIM_Cmd(TIM2, ENABLE); } if(status==MENU_SEND_DATA) { p_oszi_draw_background(); // nochmal zeichnen, zum update p_oszi_draw_adc(); // gesendet wird am Ende } } if(Menu.trigger.mode==1) { //-------------------------------------- // Trigger-Mode = "AUTO" // Screnn immer neu zeichnen //-------------------------------------- if(Menu.trigger.single==0) { if ((ADC1_DMA_STREAM->CR & DMA_SxCR_CT) == 0) { ADC_UB.trigger_pos=SCALE_X_MITTE; ADC_UB.trigger_quarter=2; } else { ADC_UB.trigger_pos=SCALE_X_MITTE; ADC_UB.trigger_quarter=4; } p_oszi_sort_adc(); p_oszi_fill_fft(); if(Menu.fft.mode!=0) fft_calc(); p_oszi_draw_adc(); ADC_UB.status=ADC_VORLAUF; UB_Led_Toggle(LED_RED); } else if(Menu.trigger.single==1) { // Button "STOP" wurde gedrückt // Timer analten TIM_Cmd(TIM2, DISABLE); if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } else if(Menu.trigger.single==2) { // Button "START" wurde gedrückt Menu.trigger.single=0; ADC_UB.status=ADC_VORLAUF; TIM_Cmd(TIM2, ENABLE); if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } } else if(Menu.trigger.mode==0) { //-------------------------------------- // Trigger-Mode = "NORMAL" // Screnn nur zeichnen, nach Triggerevent //-------------------------------------- if(Menu.trigger.single==0) { if(ADC_UB.status==ADC_READY) { UB_Led_Toggle(LED_RED); p_oszi_sort_adc(); p_oszi_fill_fft(); if(Menu.fft.mode!=0) fft_calc(); p_oszi_draw_adc(); ADC_UB.status=ADC_VORLAUF; TIM_Cmd(TIM2, ENABLE); } else { // oder wenn Menu verändert wurde if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } } else if(Menu.trigger.single==1) { // Button "STOP" wurde gedrückt // Timer analten TIM_Cmd(TIM2, DISABLE); if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } else if(Menu.trigger.single==2) { // Button "START" wurde gedrückt Menu.trigger.single=0; ADC_UB.status=ADC_VORLAUF; TIM_Cmd(TIM2, ENABLE); if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } } else { //-------------------------------------- // Trigger-Mode = "SINGLE" // Screnn nur einmal zeichnen, nach Triggerevent //-------------------------------------- if(Menu.trigger.single==3) { // warten auf Trigger-Event if(ADC_UB.status==ADC_READY) { Menu.trigger.single=4; UB_Led_Toggle(LED_RED); p_oszi_sort_adc(); p_oszi_fill_fft(); if(Menu.fft.mode!=0) fft_calc(); p_oszi_draw_adc(); } else { // oder wenn Menu verändert wurde if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } } else if(Menu.trigger.single==5) { // Button "Reset" wurde gedrückt Menu.trigger.single=3; p_oszi_draw_adc(); ADC_UB.status=ADC_VORLAUF; TIM_Cmd(TIM2, ENABLE); } else { // oder wenn Menu verändert wurde if(status!=MENU_NO_CHANGE) p_oszi_draw_adc(); } } if(GUI.gui_xpos==GUI_XPOS_OFF) { // ohne GUI => ohne Transparenz zeichnen UB_Graphic2D_Copy1DMA(); } else { // mit GUI => mit Transparenz zeichnen UB_Graphic2D_Copy2DMA(Menu.akt_transparenz); } // Refreh vom LCD UB_LCD_Refresh(); // event. Daten senden if(Menu.send.data!=0) { p_oszi_send_data(); Menu.send.data=0; } } } }
int main(void) { RTC_STATUS_t check; uint8_t old_sek=0; char buf[APP_TX_BUF_SIZE]; // puffer fuer Datenempfang SystemInit(); // Quarz Einstellungen aktivieren // Init der LEDs UB_Led_Init(); // Init der Buttons UB_Button_Init ( ); // Init und start der RTC check=UB_RTC_Init(); if(check==RTC_UNDEFINED) { // RTC war noch nie initialisiert UB_Led_On(LED_RED); } else { // RTC war schon initialisiert UB_Led_On(LED_GREEN); } // Init vom USB-OTG-Port als CDC-Device // (Virtueller-ComPort) /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * die nächste Zeile auskommentieren, * dann funktioniert das Zurücksetzen * des RTC */ UB_USB_CDC_Init(); while ( 1 ) { // wenn Button gedrückt -> RTC zurücksetzen if ( UB_Button_Read ( BTN_USER ) ) { // orange LED ein UB_Led_On ( LED_ORANGE ); // RTC zurücksetzen ResetRTC ( ); // warten bis Button gelöst while ( UB_Button_Read ( BTN_USER ) ); // die LED noch ein Weilchen an lassen Delay ( 10000000 ); UB_Led_Off ( LED_ORANGE ); } // aktuelle RTC-Zeit auslesen UB_RTC_GetClock(RTC_DEC); if(UB_RTC.sek!=old_sek) { // wenn eine Sekunde um ist old_sek=UB_RTC.sek; UB_Led_Toggle(LED_BLUE); // aktuelle Zeit als String formatieren sprintf ( buf, "%02d.%02d.%02d %02d:%02d:%02d", UB_RTC.tag, UB_RTC.monat, UB_RTC.jahr, UB_RTC.std, UB_RTC.min, UB_RTC.sek ); // an Semihosting senden printf ( "%s\r\n", buf ); // Test ob USB-Verbindung zum PC besteht if(UB_USB_CDC_GetStatus()==USB_CDC_CONNECTED) { // an PC senden UB_USB_CDC_SendString ( buf, LFCR ); } } } }