您的位置 首页 新品

SAM4E单片机之旅――12、USART

清楚了UART的用法之后,现在来研究一下USART的用法。和上一次差不多,这次也通过USART的串口来实现和PC的通信。和上一次不同的是,USART本身就有接收超

清楚了UART的用法之后,现在来研究一下USART的用法。和上一次差不多,这次也经过USART的串口来完成和PC的通讯。和上一次不同的是,USART自身就有接纳超时的功用,所以这次就不必TC了。

USART和UART比较,功用多了许多,能够装备的选项也更多。尽管最主要的差别是USART能够完成同步通讯,但PC的串口没有这个功用,所以咱们就先不拿这个功用开刀了。

一、 思路

完成思路和上一次运用UART的PDC差不多,差异仅仅这次直接运用USART的接纳超时功用,而不必TC。

二、 电路图

运用的USART口为USART1,这个串口在前次运用的DBGU口的周围。

有个使能引脚连在PA23上。运用时需求将PA23拉为低电平才干运用这个串口。别的,芯片的USART1的SCK引脚运用的也是PA23。

还有便是这个串口运用的通讯协议为RS232,需求将JP11正确跳线。JP11就在USART1接口的邻近,默许情况下挑选的是RS485,在这里需求改动跳线帽的方位。

三、 USART的装备

大部分装备都和上一节的相同。装备前需求将MCK装备为120 MHz,装备完成后USART作业在硬件握手形式,波特率为115200 Hz,数据位长度为8,1位中止位,不运用校验。

在PC端运用通讯软件时留意设置RTS的状况。

若把握了运用PDC和UART进行通讯的装备的话,本末节只需留意阅览加粗的过程即可。

拉低PA23引脚电平,以使能USART1串口。

/* 拉低PA23,以使能USART1串口 */

PIOA->PIO_PER = PIO_PA23;

PIOA->PIO_OER = PIO_PA23;

PIOA->PIO_OWER = PIO_PA23;

PIOA->PIO_CODR = PIO_PA23;

敞开外设时钟,以及将PA21,PA22,PA24,PA25引脚分配给外设A(USART1)。

使能发送和接纳。

1USART1->US_CR = US_CR_RXEN | US_CR_TXEN;

形式设置。未设置US_MR_OVER位则表明过采样率为16。

USART1->US_MR =

US_MR_USART_MODE_HW_HANDSHAKING /* 硬件握手形式 */

| US_MR_USCLKS_MCK /* 挑选的MCK */

| US_MR_CHRL_8_BIT /* 数据位为8位 */

| US_MR_PAR_NO /* 无校验位 */

| US_MR_NBSTOP_1_BIT /* 中止位为1位 */

;

波特率设置。USART作业在不同形式时,波特率的核算方法不同。在运用异步形式时,CD值的核算和UART的相同:

波特率 = 挑选的时钟 / ( CD * 过采样率 )

注:本芯片的UART的过采样率为16。

在MCK为120 MHz,波特率为115200 Hz时,核算出的CD的值为65。

1USART1->US_BRGR = US_BRGR_CD(65);

接纳超时设置。经过设置US_RTOR寄存器的低16位决议接纳时等候的闲暇时刻。写入的值表明等候的比特位的数量,即等候的时刻为传输该数量的比特位时需求的时刻。

#define USART_RX_WAIT_MS 500

int wait_bit_time = USART_RX_WAIT_MS * 115200 / 1000;

if (wait_bit_time > 0xffff)

wait_bit_time = 0xffff;

USART1->US_RTOR = US_RTOR_TO(wait_bit_time);

PDC的设置。PDC和缓冲区的运用方法和上一次类似。留意将运用的PDC修改为正确的PDC即可。

中止。启用缓冲区满及接纳超时中止。

USART1->US_IER = US_IER_RXBUFF | US_IER_TIMEOUT;

/* NVIC 的装备略 …… */

四、 USART的中止处理

在接纳超时以及缓冲区满时会发生中止,所以在中止时将接纳缓冲区的内容经过PDC发送出去即可。在运用硬件握手协议时,能够在中止处理过程中暂停数据的接纳。

void USART1_Handler(void)

{

uint32_t status = USART1->US_CSR;

if ((status US_CSR_TIMEOUT) == US_CSR_TIMEOUT

|| (status US_CSR_RXBUFF) == US_CSR_RXBUFF)

{

USART1->US_CR = US_CR_RTSDIS;

int rec_size = BUF_SIZE – PDC_USART1->PERIPH_RCR;

if (rec_size != 0)

TransferRxBufAndRec(rec_size);

/* 鄙人次数据接纳时发动超时判别 */

/* 一起拉低超时发生的中止 */

USART1->US_CR = US_CR_STTTO;

USART1->US_CR = US_CR_RTSEN;

}

}

TransferRxBufAndRec()函数和上一节的类似,只需更改运用的PDC即可。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/149973.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部