您的位置 首页 芯闻

SAM4E单片机之旅——12、USART

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

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

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

  一、 思路

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

  二、 电路图

    

clip_image002

 

  运用的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;

  /* NV%&&&&&% 的装备略 …… */

  四、 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/news/xinwen/204097.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部