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