本帖最后由 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 外围允许寄存器 0(PER0)PER0寄存器是设定允许或者禁止给各外围硬件提供时钟的寄存器。通过停止给不使用的硬件提供时钟,降低功耗和噪声。 要使用串行阵列单元0 时,必须将 bit2 (SAU0EN)置 “1”。 3.2 3.
3.2 串行时钟选择寄存器 0(SPS0)
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 串行模式寄存器 0n(SMR0nH、SMR0nL)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 串行通信运行设定寄存器 0n(SCR0nH、 SCR0nL)这是通道 n 的通信运行设定寄存器,设定数据发送和接收模式、数据和时钟相位、是否屏蔽错误信号、偶检验位、起始位、停止位和数据长度等。 禁止在运行允许状态(SE0n=1)下改写 SCR0nH、 SCR0nL寄存器。 通过 8 位存储器操作指令设定 SCR0nH、 SCR0nL 寄存器。 寄存器具体定义见《R7F0C806-809用户手册 硬件篇》11.3章节。 3.5 3.5
3.5 串行数据寄存器 0n(SDR0nH、 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); }
我的其他帖子:
|