0

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

4

1 回答 1

0

我建议查看 .\arduino-1.5.2\hardware\arduino\sam\cores\arduino\UARTClass.cpp 作为其 UARTClass::begin 将详细说明 Arduino 框架如何初始化 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\hardware\arduino\sam\system\libsam\source\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() 的低功耗调制解调器而不是睡眠

于 2013-12-30T16:24:50.460 回答