调试的瑞萨这个芯片的串口真是各种坎坷,我使用的的是瑞萨官方提供的串口发送程序。使用这个配到的程序的PDF文档可以很顺利的进行软件的仿真。但是使用硬件的时候接收到的字符全是乱码,如下图:
官方串口的初始化实现的是:波特率设置为38400bps,8,1 UART发送完毕中断。代码如下
- void SAU_Init(void)
- {
- SAU0EN = 1U; /* supply SAU0 clock开启串口的时钟 */
- NOP();
- NOP();
- NOP();
- NOP();
- SPS0 = _00_SAU_CK00_FCLK_0 | _00_SAU_CK01_FCLK_0;/* SPS0:串行时钟选择寄存器0*/
-
- /* UART0 initial setting */
- ST0 |= _01_SAU_CH0_STOP_TRG_ON; /* UART0 transmit disable ST0:串行通道停止寄存器0*/
- STMK0 = 1U; /* disable INTST0 interrupt */
- STIF0 = 0U; /* clear INTST0 interrupt flag */
- SRMK0 = 1U; /* disable INTSR0 interrupt */
- SRIF0 = 0U; /* clear INTSR0 interrupt flag */
- SREMK0 = 1U; /* disable INTSRE0 interrupt */
- SREIF0 = 0U; /* clear INTSRE0 interrupt flag */
- /* Set INTST0 low priority 设置UART0发送接收中断的低优先级,优先级为3(最低)*/
- STPR10 = 1U;
- STPR00 = 1U;
- SMR00L = _20_SAU_SMRMN_INITIALVALUE | _02_SAU_MODE_UART | _00_SAU_TRANSFER_END;/* SMR00L:串行模式寄存器00L */
- SMR00H = _00_SAU_CLOCK_SELECT_CK00 | _00_SAU_TRIGGER_SOFTWARE;
- SCR00L = _00_SAU_MSB | _10_SAU_STOP_1 | _07_SAU_LENGTH_8;/* SCR00L:串行通信运行设定寄存器00L,MSB 优先的输入/ 输出,停止位长度=1 位,8 位数据长度*/
- SCR00H = _80_SAU_TRANSMISSION | _00_SAU_INTSRE_MASK | _00_SAU_PARITY_NONE;/* 只发送,UART 模式,禁止发生错误中断INTSRE0,不输出奇偶校验位。接收时没有奇偶校验。*/
- SDR00H = _80_UART0_TRANSMIT_DIVISOR;/* SDR00H:串行数据寄存器00H,分频因子为130*/
- SO0 |= _01_SAU_CH0_DATA_OUTPUT_1;/* SO0:串行输出寄存器0,串行数据的输出值为“1” */
- SOL0 |= _00_SAU_CHANNEL0_NORMAL; /* output level normal SOL0:串行输出电平寄存器0,将通信数据直接输出*/
- SOE0 |= _01_SAU_CH0_OUTPUT_ENABLE; /* enable UART0 output SOE0:串行输出允许寄存器0,允许输出 */
- /* Set TXD0 pin */
- P0 |= 0x01U;
- PM0 &= 0xFEU;
- }
上面的程序我对照官方的数据手册做了中文的注释。
瑞萨的这个芯片的最高支持的高速内部时钟振荡器为20mhz,具体的配置是在汇编的文件
中,代码如下:
- OPT CSEG OPT_BYTE
- DB 0E0H
- DB 0EBH
- DB 0FBH ;5 MHz
- DB 85H
-
- END
上面的代码配置的单片机的主时钟为5MHZ.
在串口的初始化中的波特率配置是把主时钟130分频,得到的波特率应该是38461左右,在串口调试助手中设置波特率为38400,我明明发送的是一些字符,但是接收字符的时候都是乱码。
我所使用的工程如下:
官方的讲解文档: