串口是单片机中最基本的功能之一,在CH554上有两个串口,我们先从串口0开始(串口1和LED复用了),测试它的基本使用。
- 程序还是使用了RTX51tiny结构,使用方法见 CH554测试:RTX51 tiny。
- 为了让程序有更好通用性,没有使用例程自带的Public文件。
- 将串口的常用功能做了封装(这部分不依赖RXT51),只要使用UART0_init()就可以实现串口初始化,用户收发中断函数设置。
- 运行后以9600波特率,每秒发送一个ASCII字符,不断递增。如果通过串口发送数据,将会改变当前的字符。
- 串口波特率部分的计算还不完善,没有考虑频率和波特率更大范围的计算,这部分以后在补充。
- #include <rtx51tny.h>
- #include <SST89X5XXRD2.H>
- #include "stdint.h"
- #include "cfg.h"
- sbit LED1 = P1^6;
- sbit LED2 = P1^7;
- uint32_t F_CPU = FREQ_BASE;
-
- void (* _UART0_RXD_ISR_USR)(void);
- void (* _UART0_TXD_ISR_USR)(void);
- void UART0_write(uint8_t dat)
- {
- SBUF = dat;
- }
- uint8_t UART0_read()
- {
- return SBUF;
- }
- uint8_t UART0_init(uint32_t baudrate, void *USRTXD, void *USRRXD)
- {
- ES = 0;
- T2MOD |= 0xA0; // bTMR_CLK = bT1_CLK = 1
- T2CON &= 0x18; // RCLK = TCLK = 0
- PCON |= 0x80; // SMOD = 1
- TMOD &= 0x0F;
- TMOD |= 0x20;
- TH1 = 256 - F_CPU / (16 * baudrate);
- TR1 = 1;
-
- SCON = 0x50;
-
- _UART0_RXD_ISR_USR = 0;
- if(USRRXD)
- _UART0_RXD_ISR_USR = USRRXD;
- _UART0_TXD_ISR_USR = 0;
- if(USRTXD)
- _UART0_TXD_ISR_USR = USRTXD;
-
- ES = 1;
-
- return 1;
- }
- void UART0_ISR() interrupt 4
- {
- if(TI)
- {
- TI = 0;
- if(_UART0_TXD_ISR_USR)
- _UART0_TXD_ISR_USR();
- }
-
- if(RI)
- {
- RI = 0;
- if(_UART0_RXD_ISR_USR)
- _UART0_RXD_ISR_USR();
- }
- }
- uint8_t cnt = 0;
- // user UART0 RXD routine
- void UART0_RXD_ISR()
- {
- cnt = UART0_read();
- }
- job0 () _task_ 0
- {
-
- UART0_init(9600, 0, UART0_RXD_ISR);
-
- while(1)
- {
- if((cnt < '0') || (cnt > 'z'))
- cnt = '0';
- UART0_write(cnt);
- cnt++;
-
- // 1s
- LED1 = !LED1;
- os_wait(K_TMO, 10, 0);
- }
- }
复制代码
完整程序:
uart.zip
(35 KB, 下载次数: 18)
此内容由EEWORLD论坛网友dcexpert原创,如需转载或用于商业用途需征得作者同意并注明出处