Arduino DUE,从睡眠模式唤醒的串行中断程序

时间:2013-12-30 11:17:15

标签: serial-port arduino sleep interrupt wakeup

我想将SAM3X芯片置于睡眠模式,直到一个字符到达串口。我想在串行中断程序中使用辅助标志来触发唤醒程序?你觉得什么?我应该遵循或尝试的任何建议或任何其他方式?

1 个答案:

答案 0 :(得分:0)

我建议查看。\ arduino-1.5.2 \ hardware \ arduino \ sam \ cores \ arduino \ UARTClass.cpp,因为它的UARTClass :: begin将详细介绍Arduino Framework如何使用以下命令初始化SAM的串行IRQ:

// Configure interrupts
_pUart->UART_IDR = 0xFFFFFFFF;
_pUart->UART_IER = UART_IER_RXRDY | UART_IER_OVRE | UART_IER_FRAME;

// Enable UART interrupt in NVIC
NVIC_EnableIRQ(_dwIrq);

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

在睡眠模式下,您需要确保波特率发生器没有停止。

同时阅读从5.5.3开始的SAM3X数据表。这使得外设时钟无效。

看起来你可以将唤醒插入UARTClass :: IrqHandler

void UARTClass::IrqHandler( void )
{
  uint32_t status = _pUart->UART_SR;

  // Did we receive data ?
  if ((status & UART_SR_RXRDY) == UART_SR_RXRDY)
  {
    // wake up!!!! Not sure if you even need to wakeup, it should from the sleepmode
    _rx_buffer->store_char(_pUart->UART_RHR);
  }

关于睡觉: \ Arduino的1.5.2 \硬件\ Arduino的\ SAM \ SYSTEM \ libsam \源\ pmc.c

Line 972: void pmc_enable_sleepmode(uint8_t uc_type)
Line 988: void pmc_enable_waitmode(void)
Line 1009: void pmc_enable_backupmode(void)

所以我怀疑以下内容:

pmc_enable_sleepmode(WFI);

会使设备进入休眠状态,而UART_SR_RXRDY的IrqHandler会自动唤醒,而不会更改任何代码。


另一种选择是使用串行引脚的IO来触发中断。

attachInterrupt(0, EnableSerialRX, CHANGE);

但是,它至少会松开第一个字节。权衡是你可以使用pmc_enable_backupmode()的低功率调制解调器而不是睡眠