合泰HT66F0185 SOP28 UART调试记录
外部引脚介绍
UART的外部引脚TX、RX,该功能的默认引脚是在PD2、PD1,要想更改到PB3、PB4,可通过 IFS 寄存器进行引脚功能重置。但由于PB3引脚默认是AD输入,故要先把它取消,不然引脚不受控。这里说“当UARTEN、TXEN 和 RXEN 位置高时,将自动设置这些 I/O 脚或其它共用功能脚作为 TX 输出和 RX 输入,并且除能 TX 和 RX 引脚上的上拉电阻功能”。但在实际调试中发现,RX引脚仍要把它上拉,不然接收中断会老是误触发,不知是不是因为PB4不是默认的RX引脚。感觉这个数据手册写的不够清楚,因为RX这个上拉,调试了好久。
相关的寄存器
与 UART 功能相关的有五个寄存器,即控制 UART 模块整体功能的 USR、UCR1 和 UCR2 寄存器,控制波特率的 BRG 寄存器,管理发送和接收数据的数据寄存器 TXR_RXR。
寄存器这方面没什么好赘述的,看清楚每个位的功能,配置好自己想要的工作模式和数据格式就好了。比较值得注意的是,波特率的设置,数据手册中有给到对应设置的计算格式,但因为有个误差,波特率配不了太高,高了误差太大,误码率高。稍微算了一下,在8M的系统时钟告诉模式下,57600bit/s 误差就达13.2%,实测发送1byte就错了。
UART 模块中断结构
看上述结构图倒推可知,想要产生对应的中断:中断总开关EMI使能→UART中断控制位URE使能→对应的中断事件控制位使能(TEIE、TIIE、RIE、ADDEN、WAKE)→对应的事件标志位置位。
程序编写
有了上述对UART的了解就可以编写程序,例程演示的是接收到上位机的数据立马回传到上位机,验证了接收和发送。
1、系统初始化
void main()
{
unsigned char buf[] ="system init ok\r\n";
_wdtc = 0b10101111; //关闭看门狗,因为看门狗默认是开启状态
_smod = 0b00000011; //系统时钟为外部振荡器,不分频
uart_init(BaudRate_4800);
_emi = 1; //开启总中断开关
uart_send_str(buf);
while(1)
{
}
}
//串口接收中断服务函数
void __attribute((interrupt(0x2c))) Interrupt_Uart(void)
{
unsigned char temp = 0x00;
while(!_rxif); //RXIF位被置位,说明RXR寄存器中有一帧以上的数据
temp = _txr_rxr; //读取接收到的数据
uart_send_byte(temp);
//一旦中断子程序被响应,系统将自动清除EMI位,所有其他的中断将被屏蔽
_emi = 1;
}
2、URAT初始化
#include "uart.h"
void uart_init(unsigned int baudrate)
{
_ace7 = 0; //PB3引脚默认是AD输入,要先把它取消
_txps = 1; //将TX配置到PB3输出
_rxps = 1; //将RX配置到PB4输入
_pbc3 = 0; //PB3输出模式
_pbpu3= 1; // 上拉
_pbc4 = 1; //PB4输入模式
_pbpu4= 1; // 上拉
_ucr1 = 0x80; //UART使能、8-bit传输数据、无校验、1位停止位、没有暂停字发送
_ucr2 = 0xe4; //UART发送使能、UART接收使能、高速波特率、接收中断使能
_brg = baudrate; //配置波特率,根据数据手册提供的计算公式
_ure = 1; //UART中断控制位 1 使能
}
void uart_send_byte(unsigned char dat)
{
while(!_tidle); //若_tidle == 0,说明数据在传输中,等待数据传输完毕
_txr_rxr = dat; //上byte数据传输完毕,将要发送的数据填入TXR
}
void uart_send_str(unsigned char *dat)
{
unsigned char *p;
p = dat;
while(*p != '\0')
{
uart_send_byte(*p);
p++;
}
}
总结
初次接触合泰的单片机,合泰的单片机在网上的资料相对还是比较少。自己看寄存器配置,但在调试过程还是有不少问题,感觉数据手册写的还是不够详细,可能是自己菜的缘故。
“PB3引脚默认是AD输入,故要先把它取消,不然引脚不受控。”RX引脚仍要把它上拉,不然接收中断会老是误触发,不知是不是因为PB4不是默认的RX引脚。在这个两个问题上还是花了不少,捋了一遍又一遍寄存器都发现不了问题,后来早上醒来想到是不是要上拉RX,抱着试一试的心态。
调完就当是捋一捋思路,加深一下有些坑的印象,故写点东西记录、分享。有出入错欢迎指正,不喜请喷。