【解決済み】Arduino dueのuartの割り込みがうまくいってない

下記のサンプルコードを見ると、

data == 49/50でLEDをon/offしている。

49/50は

ASCIIコード表

より、

49: 0x31, 1

50: 0x32, 2

となる。1/2をシリアルで送ると、割り込みが入ってON/OFFする?

書き込めたが、LEDはON/OFFしなかった。

 

UART interrupt Arduino Due ?

#define LED_BUILTIN 13
volatile uint8_t data;
char TXBUFFER[64]; // UART PDC Transmit buffer
void UART_Handler (void) __attribute__ *1;
void UART0_Handler(void) {
 
  if (UART->UART_SR & UART_SR_RXRDY) {
    data = UART->UART_RHR;
   if(data == 49) digitalWrite(LED_BUILTIN, LOW); 
   else if(data == 50) digitalWrite(LED_BUILTIN, HIGH); 
  }
  

}

void setup() {
   
    
   PMC->PMC_PCER0 = PMC_PCER0_PID8;  // UART power ON

  // Reset and disable receiver & transmitter
  UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;

  // Set the baudrate to 250000
  UART->UART_BRGR = 21; // 84 000 000 / 16 * x = BaudRate (write x into UART_BRGR)

  // No Parity
  UART->UART_MR = UART_MR_PAR_NO;

  // Disable PDC channel requests
  UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;

  // Disable / Enable interrupts on end of receive
  UART->UART_IDR = 0xFFFFFFFF;
  UART->UART_IER = UART_IER_RXRDY;
  NVIC_EnableIRQ*2;
void UART_Handler(void)
{
 Serial.IrqHandler();
} 

UART_Handler

 

void UART_Handler (void) __attribute__ *3;

UART interrupt Arduino Due ?

serial - How to setup SAM3x8e IRQ handler for USART? - Electrical Engineering Stack Exchange

 

ただ割り込み中に、シリアルポートを使用したりするといともたやすくフリーズする。用途的にloop()関数のあとに実行されるSeralEvent()で十分であれば、そっちの方が簡単である。

Arduinoリファレンス(Serial.serialEvent)

Serial.available()

Arduino 日本語リファレンス

 

variant.cppは

C:UserschinoAppDataLocalArduino15packagesarduinohardwaresam.6.11ariantsarduino_due_xariant.cpp

thermometer/variant.cpp at master · takurx/thermometer · GitHub

にあった。

 

weakシンボルを使うと多重定義が避けられるらしい。

リンクされているライブラリによってプログラムの動作を変える - bkブログ

karky7のブログ: weakシンボルに時間をとられた

weakシンボル - syohex’s diary

weakシンボルなしで再定義すると、エラーになるのは確認した。

visual studio上で動くVisual MicroのArduinoプラグインを使った環境で確認した。なかなか便利。 Arduino IDE for Visual Studio and Atmel Studio

 

Arduinoプラグインでシリアルの使いすぎ?でエラーになると

VMDPV_1|1_V

をシリアル出力して、フリーズしたりした。

Visual Studio Ide for Arduino - False errors

 

わりと簡単そうに書いてて、できるんじゃないかなーと思ってたところ、解決できたので良かった。

 

その他:

Arduino の attachInterrupt() での割り込み処理

Atmel Studio入門:割り込み処理 | easy labo

*1:weak

*2:IRQn_Type) ID_UART);

  // Enable receiver and transmitter
  UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;


   pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH); 
  
}

void loop() {

}

 

ArduinoCore-sam/variant.cpp at master · arduino/ArduinoCore-sam · GitHub

// 0/1 - UART (Serial)
void UART_Handler(void)

// 18/19 - USART0 (Serial1)
void USART0_Handler(void)

// 16/17 - USART1 (Serial2)
void USART1_Handler(void)

// 14/15 - USART3 (Serial3)
void USART3_Handler(void)

 

 

 

追記:2018/08/15

 

variant.cppの方のUART_Handlerにweakシンボルを追加して、

自分のスケッチの方でUART_Handlerを再定義すると、割り込み時の処理を変更することができる。

 

void UART_Handler(void) __attribute__((weak

*3:weak