/* ----------------------------------------------------- blink_int_v003.ino Blinkprogramm fuer CH32V003 mittels Interrupt Timer2 ----------------------------------------------------- */ #define LED PD5 /* -------------------------------------------------------- TIM2_IRQHandler Code nach TIM_IT_UPDATE wird hier mit der Anzahl Mikrosekunden abgearbeitet, die in cmp_match des timer2_init angegeben ist -------------------------------------------------------- */ extern "C" void TIM2_IRQHandler() __attribute__( ( interrupt() ) ); void TIM2_IRQHandler(void) { volatile static uint8_t flag = 0; if (flag) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } flag= flag ^ 0x01; TIM2->INTFR &=~(uint16_t)TIM_IT_Update; } /* -------------------------------------------------------- timer2_init initialisiert Timer2 fuer einen Compare-Match- Betrieb im Interruptmodus. Uebergabe: prescale : Taktteiler des Corecodes zum Zaehlers. cmp_match : Compare-Match (hier Autoreloadwert) bei dem der Zaehler ueberlaeuft und einen Interrupt ausloest Bsp.: 48 MHz Coretakt, Prescale 480 bedeutet 1 KHz Timer Takt = 10 us cmp_match 99 bedeutet 0..99 = 100 Takte bis zum Interruptintervall -------------------------------------------------------- */ void timer2_init(uint16_t prescale, uint16_t cmp_match) { RCC->APB1PCENR |= (RCC_APB1Periph_TIM2); TIM2->CTLR1 |= TIM_CKD_DIV1; TIM2->PSC= prescale; TIM2->ATRLR= cmp_match; TIM2->SWEVGR |= TIM_UG; TIM2->DMAINTENR |=(TIM_IT_Update); TIM2->CTLR1 |= TIM_CEN; NVIC_SetPriority(TIM2_IRQn,5); NVIC_EnableIRQ(TIM2_IRQn); } void setup() { pinMode(LED, OUTPUT); timer2_init(48000,499); } void loop() { // nichts, blinken geschieht im Timer2Interrupt }