4062|0

336

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【R7F0C809】DIY第九篇--串口应用 [复制链接]

本帖最后由 youzizhile 于 2015-9-30 15:43 编辑

对于嵌入式程序设计者来说,调试无疑是解决问题的最有利助手,出现的问题可以通过调试跟踪来一步一步解决。调试的手段有很多,通常比较常用的就是串口输出信息。
下面简单介绍R7F0C809的串口相关信息和使用说明。
1         R7F0C809串行阵列单元介绍
串行阵列单元0 最多有 2 个串行通道。各通道能实现 3 线串行(CSI)和 UART 的通信功能。

1.1      1.1 线串行 I/O CSI00
与主控设备输出的串行时钟(SCK)同步进行数据的发送和接收。
这是使用 1 条串行时钟 (SCK)、 1 条发送串行数据(SO)和 1 条接收串行数据(SI)共 3 条通信线进行通信的时钟同步通信功能。
1.2      
1.2 UART UART0
这是通过串行数据发送(TxD)和串行数据接收(RxD)共2 条线进行异步通信的功能。使用这 2 条通信线,按数据帧(由起始位、数据、奇偶校验位和停止位构成)与其他通信方进行异步(使用内部波特率)的数据发送和接收。能通过使用发送专用(偶数通道)和接收专用(奇数通道)共2个通道来实现全双工UART通信。
能通过设定 ISC 寄存器,将 UART0的 RxD0 引脚的输入信号设定为外部中断输入或者定时器阵列单元的定时器输入。另外,能通过使用定时器阵列单元的输入脉冲间隔测量模式测量通信方的波特率宽度,并且能进行 UART0 的波特率校正。

2         操作步骤2.1      UART 发送的初始设定步骤
UART 发送的时序和流程图
2.2      UART 接收的初始设定步骤
UART 接收的流程图

2.3      波特率计算
UART (UART0)通信的波特率能用以下计算式进行计算:
(波特率)= {对象通道的运行时钟 (fMCK) 频率} ÷ (SDR0nH[7:1] + 1) ÷ 2 [bps]

注意事项: 禁止设定串行数据寄存器0n (SDR0nH)的 SDR0nH[7:1]=(0000000B、 0000001B)。
备注1. 因为在使用UART时SDR0nH[7:1]的值为SDR0nH寄存器的bit7~1的值(0000010B~1111111B),所以为 2~127。
2. n=0、1
运行时钟(fMCK)取决于串行时钟选择寄存器0(SPS0)和串行模式寄存器0n(SMR0n)的bit15(CKS0n位)。
3         寄存器介绍
3.1      
3.1 外围允许寄存器 0PER0
PER0寄存器是设定允许或者禁止给各外围硬件提供时钟的寄存器。通过停止给不使用的硬件提供时钟,降低功耗和噪声。
要使用串行阵列单元0 时,必须将 bit2 (SAU0EN)置 “1”。
3.2      3.
3.2 串行时钟选择寄存器 0SPS0
SPS0寄存器是 8 位寄存器,选择提供给各通道的 2 种公共运行时钟 (CK00、 CK01)。通 过 SPS0 寄存器的 bit7 ~ 4 选择 CK01,通过 bit3 ~ 0 选择 CK00。
禁止在运行允许状态(SE0n=1)改写 SPS0 寄存器。
通过 8 位存储器操作指令设定 SPS0 寄存器。
寄存器具体定义见《R7F0C806-809用户手册 硬件篇》11.3章节。

3.3      
3.3 串行模式寄存器 0nSMR0nHSMR0nL
SMR0nH、 SMR0nL寄存器是设定通道 n 的运行模式的寄存器,进行运行时钟 (fMCK)的选择、能否使用串行时钟 (fSCK)输入的指定、开始触发的设定、运行模式(CSI、 UART)的设定以及中断源的选择。另外,只在 UART 模式中设定接收数据的反相电平。
禁止在运行允许状态(SE0n=1)下改写 SMR0nH、 SMR0nL寄存器。但是,能在运行运行允许状态(SE0n=1)下改写 MD0n0 位。
通过 8 位存储器操作指令设定 SMR0nH、 SMR0nL 寄存器。
寄存器具体定义见《R7F0C806-809用户手册 硬件篇》11.3章节。

3.4      
3.4 串行通信运行设定寄存器 0nSCR0nH SCR0nL
这是通道 n 的通信运行设定寄存器,设定数据发送和接收模式、数据和时钟相位、是否屏蔽错误信号、偶检验位、起始位、停止位和数据长度等。
禁止在运行允许状态(SE0n=1)下改写 SCR0nH、 SCR0nL寄存器。
通过 8 位存储器操作指令设定 SCR0nH、 SCR0nL 寄存器。
寄存器具体定义见《R7F0C806-809用户手册 硬件篇》11.3章节。
3.5      3.5
3.5 串行数据寄存器 0nSDR0nH SDR0nL
SDR0nH、 SDR0nL 寄存器是通道 n 的发送和接收数据寄存器。
通过 8 位存储器操作指令设定 SDR0nH、 SDR0nL 寄存器。
在产生复位信号后,SDR0nH、 SDR0nL 寄存器的值都变为 “00H”。
SDR0nH寄存器用作运行时钟(fMCK)的分频设定寄存器。
如果将SMR0nH 寄存器的CCS0n位置“0”,由SDR0nH寄存器设定的运行时钟的分频时钟就用作传送时钟。
如果将CCS0n位置 “1”,就必须将SDR0nH寄存器置 “0000000B”。 SCKp 引脚的输入时钟 fSCK (CSI模式的从属传送)为传送时钟。
在运行停止状态 (SE0n=0)下,通过 8位存储器操作指令设定SDR0nH寄存器。在运行允许状态 (SE0n=1)下, SDR0nH寄存器的写操作无效,并且SDR0nH寄存器的读取值总是为 “0”。
SDR0nL寄存器用作发送或者接收缓冲寄存器。在接收时,将通过移位寄存器转换的并行数据保存到SDR0nL 寄存器。在发送时,将要传送到移位寄存器的发送数据设定到 SDR0nL 寄存器。
在运行允许状态 (SE0n=1)下,通过 8位存储器操作指令设定SDR0nL寄存器。在运行停止状态 (SE0n=0)下,禁止写 SDR0nL寄存器。
寄存器具体定义见《R7F0C806-809用户手册 硬件篇》11.3章节。
3.6       3.
3.6 其他寄存器
其他寄存器具体定义见《R7F0C806-809用户手册 硬件篇》11.3章节。

4         程序设计4.1      
4.1 打开时钟
void R_SAU0_Create(void)
{
   SAU0EN = 1U;        /* supply SAU0clock */
   NOP();
   NOP();
   NOP();
   NOP();
   SPS0 = 0x44U;       /* ck00 -fCLK/2^4; ck01 - fCLK/2^4 */
   R_UART0_Create();
}
4.2      
4.2 UART0初始化
void R_UART0_Create(void)
{
   ST0 |= 0x03U;       /* disableUART0 receive and transmit */
   STMK0 = 1U;         /* disableINTST0 interrupt */
   STIF0 = 0U;         /* clearINTST0 interrupt flag */
   SRMK0 = 1U;         /* disableINTSR0 interrupt */
   SRIF0 = 0U;         /* clearINTSR0 interrupt flag */
    SREMK0= 1U;        /* disable INTSRE0 interrupt*/
   SREIF0 = 0U;        /* clearINTSRE0 interrupt flag */
   /* Set INTST0 low priority */
   STPR10 = 1U;
   STPR00 = 1U;
   /* Set INTSR0 low priority */
   SRPR10 = 1U;
   SRPR00 = 1U;
   /* Set INTSRE0 low priority */
   SREPR10 = 1U;
   SREPR00 = 1U;
   SMR00H = 0x00U;     /* selectionof macro clock (MCK) of channel 0: operation clock CK00 set by SPS0 register */
   SMR00L = 0x22U;     /* setting ofoperation mode of channel 0: UART mode */
                        /* selection ofinterrupt source of channel 0: transfer end interrupt */
   SCR00H = 0x82U;     /* setting ofoperation mode of channel 0: transmission only */
                        /* selection of maskingof error interrupt signal: masks error interrupt INTSRE0 */
                        /* setting of paritybit in UART mode: even parity*/
   SCR00L = 0x97U;     /* selectionof data transfer sequence in CSI and UART modes: LSB */
                        /* setting of stop bitin UART mode: 1 stop bit */
                        /* setting of datalength in CSI and UART modes: 8-bit data length */
   SDR00H = 0x80U;     /* setting ofbaud rate: 9600bps */  
   SIR01 = 0x07U;      /* clear errorflag */
   SMR01H = 0x01U;     /* selectionof macro clock (MCK) of channel 1: operation clock CK0 set by PRS register */
                        /* selection of starttrigger source: valid edge of RXD pin */
   SMR01L = 0x22U;     /* controlsinversion of level of receive data of UART0: falling edge is detected as thestart bit */
                        /* setting of operationmode of channel 1: UART mode */
   SCR01H = 0x46U;     /* setting ofoperation mode of channel 0: reception only */
                        /* selection of maskingof error interrupt signal: masks error interrupt INTSRE0 */
                        /* setting of paritybit in UART mode: even parity*/
   SCR01L = 0x97U;     /* selectionof data transfer sequence in CSI and UART modes: LSB */
                       /* setting of stopbit in UART mode: 1 stop bit */
                        /* setting of datalength in CSI and UART modes: 8-bit data length */
   SDR01H = 0x80U;     /* setting ofbaud rate: 9600bps */
   NFEN0 |= 0x01U;     /* use of noisefilter: noise filter on */

   SOL0 &= 0xFEU;      /* outputlevel normal */
   SO0 |= 0x01U;       /* Serial dataoutput of channel 0 is "1" */
   SOE0 |= 0x01U;      /* enableUART0 output */

   /* Set RxD0 pin */
   PMC0&= 0x7FU;
  PM0 |= 0x80U;
   /* Set TxD0 pin */
   P0|= 0x40U;
  PM0&= 0xDFU;  
}
4.3      
4.3 串口开始
void R_UART0_Start(void)
{
   STIF0 = 0U;     /* clear INTST0interrupt flag */
   STMK0 = 0U;     /* enable INTST0interrupt */
   SRIF0 = 0U;     /* clear INTSR0interrupt flag */
   SRMK0 = 0U;     /* enable INTSR0interrupt */
   SREIF0 = 0U;    /* clear INTSRE0interrupt flag */
   SREMK0 = 0U;    /* enable INTSRE0interrupt */
   SO0 |= 0x01;    /* Serial dataoutput of channel 0 is "1" */
   SOE0 |= 0x01U;  /* enable UART0output */
   SS0 |= 0x03;    /* enable UART0receive and transmit */
}

4.4      4.4
4.4 串口停止
void R_UART0_Stop(void)
{
   ST0 |= 0x03;    /* disable UART0receive and transmit */
   SOE0 &= ~0x01;  /* disableUART0 output */
   STMK0 = 1U;     /* disable INTST0interrupt */
   STIF0 = 0U;     /* clear INTST0interrupt flag */
   SRMK0 = 1U;     /* disable INTSR0interrupt */
   SRIF0 = 0U;     /* clear INTSR0interrupt flag */
   SREMK0 = 1U;    /* disable INTSRE0interrupt */
   SREIF0 = 0U;    /* clear INTSRE0interrupt flag */
}
4.5      
4.5 串口接收
MD_STATUS R_UART0_Receive(uint8_t *rxbuf,uint16_t rxnum)
{
   MD_STATUS status = MD_OK;
   if (rxnum < 1U)
    {
       status = MD_ARGERROR;
    }
   else
    {
       g_Uart0RxCnt = 0U;
       g_Uart0RxLen = rxnum;
       gp_Uart0RxAddress = rxbuf;
    }
   return (status);
}
4.6      
4.6 串口发送
MD_STATUS R_UART0_Send(uint8_t* txbuf,uint16_t txnum)
{
   MD_STATUS status = MD_OK;
   if (txnum < 1U)
    {
       status = MD_ARGERROR;
    }
   else
    {
       gp_Uart0TxAddress = txbuf;
       g_Uart0TxCnt = txnum;
       STMK0 = 1U; /* disable INTST0 interrupt */
       TXD0 = *gp_Uart0TxAddress;
       gp_Uart0TxAddress++;
       g_Uart0TxCnt--;
       STMK0 = 0U; /* enable INTST0 interrupt */
    }
   return (status);
}


我的其他帖子:



赞赏

1

查看全部赞赏

点赞 关注(1)
个人签名每一刻都是崭新的,加油!

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表