我想将SAM3X芯片置于睡眠模式,直到一个字符到达串口。我想在串行中断程序中使用辅助标志来触发唤醒程序?你觉得什么?我应该遵循或尝试的任何建议或任何其他方式?
答案 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()的低功率调制解调器而不是睡眠