文章程式碼顯示

2017年9月4日 星期一

《高階》寫程式Arduino教學 - 01:Arduino Due 內部定時器中斷

由於 Arduino Due 本身是使用 ARM Base,網路上對於中斷的部分(尤其是定時中斷)幾乎都是使用於 Arduino Uno 、 Mega 及 Nano 等 AVR Base 的開發版,也就是說很多有關於 AVR 支援的程式碼換到 Due 板上面都無法使用。但偏偏 Arduino Due 是基於 Cortex - M3 而來的,也就是說其運算速度是普通 Arduino 版子的好幾倍,自然而然其複雜運算的結果我們都需要定時中斷來輔助我們(總不會全都寫在 loop 裡面吧? ) ,有關於中斷是什麼以及為什麼我們需要中斷,待之後的文章在介紹。

 Ardunio Due 中斷

/*
The code implement Timer Interrupt for Arduino Due, to toggle LED every
second and send the durationin millisecond to PC via Serial port.
 */ 

int led = 13;

volatile boolean ledon;
volatile unsigned long lasttime;
volatile unsigned long NOW;

int FREQ_1000Hz = 1000; // 中斷頻率1k Hz

void TC3_Handler(){
    TC_GetStatus(TC1, 0);
    
    NOW = micros();
    
    digitalWrite(led, ledon = !ledon);
    
    Serial.println(NOW - lasttime); //間隔時間(micro-sec)
    lasttime = NOW;
    
}

void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t frequency){
  
    //Enable or disable write protect of PMC registers.
    pmc_set_writeprotect(false);
    //Enable the specified peripheral clock.
    pmc_enable_periph_clk((uint32_t)irq);  
    
    TC_Configure(tc, channel, TC_CMR_WAVE|TC_CMR_WAVSEL_UP_RC|TC_CMR_TCCLKS_TIMER_CLOCK4);
    uint32_t rc = VARIANT_MCK/128/frequency;
    
    TC_SetRA(tc, channel, rc/2);
    TC_SetRC(tc, channel, rc);
    TC_Start(tc, channel);
    
    tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS;
    tc->TC_CHANNEL[channel].TC_IDR = ~TC_IER_CPCS;
    NVIC_EnableIRQ(irq);
}

void setup() {
    pinMode(led, OUTPUT);
    Serial.begin(115200);
    startTimer(TC1, 0, TC3_IRQn, FREQ_1000Hz);
    lasttime = 0;
}

void loop() {

}


本文程式碼內容轉載自 Implement Timer Interrupt for Arduino Due
有關於普通的 Arduino 中斷可參考 Arduino – 中斷功能

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引