微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SAM4E单片机之旅——11、UART之PDC收发

SAM4E单片机之旅——11、UART之PDC收发

时间:03-24 来源:互联网 点击:

发。由于进行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;

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top