SAM4E单片机之旅——11、UART之PDC收发
发。由于进行TC触发时也会开启时钟,所以在RC比较时暂停时钟。
由于超时时间可能较长,且精度要求不高,让TC使用慢时钟SLCK就可以了。
gUseTc.TC_CMR =
TC_CMR_WAVE /* 波形模式 */
| TC_CMR_TCCLKS_TIMER_CLOCK5 /* 时钟5: SLCK */
| TC_CMR_WAVSEL_UP_RC /* 波形仅上升,且RC比较时触发 */
| TC_CMR_CPCSTOP /* RC 比较时自动停止时钟 */
| TC_CMR_EEVT_TIOB /* 设置为外部事件为TIOB */
| TC_CMR_EEVTEDG_FALLING /* 外部事件下降沿触发 */
| TC_CMR_ENETRG /* 使能外部事件 */
;
RC设置,以及TC启用。在RC比较后,计数器将暂停工作。在下次UART数据的接收时,TIOB引脚的信号会触发TC以重新开始计数。
/* UART的PDC接收时等待超时时间 */
#define UART_RX_WAIT_MS 500
/* 设置RC */
const uint32_t rc_v = CHIP_FREQ_SLCK_RC * UART_RX_WAIT_MS / 1000;
gUseTc.TC_RC = TC_RC_RC(rc_v);
/* 使能TC时钟,但不开始*/
gUseTc.TC_CCR = TC_CCR_CLKEN;
中断设置。TC中断的优先级比UART的要高。
/* RC 比较时产生中断 */
gUseTc.TC_IER = TC_IER_CPCS;
/* NVIC , 优先级设置为0 */
NVIC_DisableIRQ(TC0_IRQn);
NVIC_ClearPendingIRQ(TC0_IRQn);
NVIC_SetPriority(TC0_IRQn, 0);
NVIC_EnableIRQ(TC0_IRQn);
中断处理。中断处理中过程中禁用PDC数据的接收,以免丢失数据。
void TC0_Handler(void)
{
uint32_t status = gUseTc.TC_SR;
/* 判断中断是否为RC比较触发的 */
if (status & TC_SR_CPCS)
{
PDC_UART0->PERIPH_PTCR = PERIPH_PTCR_RXTDIS;
/* 计算PDC中接收到的数据的大小 */
const int rec_size = BUF_SIZE - (PDC_UART0->PERIPH_RCR);
if (rec_size != 0)
{
TransferRxBufAndRec(rec_size);
}
PDC_UART0->PERIPH_PTCR = PERIPH_PTCR_RXTEN;
}
}
- SAM4E单片机之旅——24、使用DSP库求向量数量积(05-08)
- SAM4E单片机之旅——23、在AS6(GCC)中使用FPU(05-02)
- SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化(04-28)
- SAM4E单片机之旅——19、CAN间通信(04-19)
- SAM4E单片机之旅——20、DMAC之使用Multi-buffer进行内存拷贝(04-24)
- SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压(04-17)