【解決済み】Arduino dueのuartの割り込みがうまくいってない
下記のサンプルコードを見ると、
data == 49/50でLEDをon/offしている。
49/50は
より、
49: 0x31, 1
50: 0x32, 2
となる。1/2をシリアルで送ると、割り込みが入ってON/OFFする?
書き込めたが、LEDはON/OFFしなかった。
#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();
}
void UART_Handler (void) __attribute__ *3;
serial - How to setup SAM3x8e IRQ handler for USART? - Electrical Engineering Stack Exchange
ただ割り込み中に、シリアルポートを使用したりするといともたやすくフリーズする。用途的にloop()関数のあとに実行されるSeralEvent()で十分であれば、そっちの方が簡単である。
Arduinoリファレンス(Serial.serialEvent)
Serial.available()
variant.cppは
C:UserschinoAppDataLocalArduino15packagesarduinohardwaresam.6.11ariantsarduino_due_xariant.cpp
thermometer/variant.cpp at master · takurx/thermometer · GitHub
にあった。
weakシンボルを使うと多重定義が避けられるらしい。
リンクされているライブラリによってプログラムの動作を変える - bkブログ
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