这篇博客是我第一次使用合泰8位单片机遇到的困难的记录,之前对51,32单片机中断的认识只停留在一个中断对应一个中断函数,但合泰单片机使用了多个中断共用一个中断函数,这种类型的中断统称为多功能中断,包括 TM 中断,LVD 中断,EEPROM 写操作中断,SIM接口中断,SPIA 接口中断和 UART 接口中断。下面直接放simHT66F2390规格书的原图。
这在214页
但要使用多个同类型的中断时,这里以UART0,UART1为例,我们只需要在原来使用一个中断的基础上上判断哪一个中断旗标被置1,就可以使两个中断互相独立使用。(原本因为我的错误思路导致只能交替使用两个串口中断)
这在191页
下面是程序部分
uart串口初始化
void inituart()
{
_wdtc=0b10101111; //关闭看门狗
_pas1=0b11110000; //PA7为TX0功能、PA6为RX0功能
_u0cr1=0b10000000; //使能UART0,8-bit数据传输,关闭奇偶校验功能,1位停止位,不发送暂停字。
_u0cr2=0b11100100; //使能发送器,使能接收器,高速波特率,关闭地址检测功能,关闭RX0唤醒功能,使能接收器中断功能,关闭发送器空闲中断,关闭发送器已空中断
_brg0=fH/((u32)16*BR)-1; //配置波特率19200
_ur0e = 1; //开启中断标志位
_pds0=0b00101000;//PD2为TX1功能、PD1为RX1功能
_u1cr1=0b10000000; //使能UART1,8-bit数据传输,关闭奇偶校验功能,1位停止位,不发送暂停字。
_u1cr2=0b11100100; //使能发送器,使能接收器,高速波特率,关闭地址检测功能,关闭RX0唤醒功能,使能接收器中断功能,关闭发送器空闲中断,关闭发送器已空中断
_brg1=fH1/((u32)16*BR1)-1; //配置波特率19200
_ur1e = 1; //开启中断标志位
_mf5e=1;
_emi=1;
}
这里要把MF5E多功能中断打开,这是重点!至于上面的配置可以参考规格书
这里注释一下,在配置波特率的时候因为单片机本身的特性,选用115200的波特率会因为误差太大而无法正常接收发送(至少我是这样认为的。保命狗头.jpg),所以建议选用其他可行的波特率,比如19200,9600等。
中断程序
我们可以先使用一个中断通过电脑的串口调试助手练练手,这样更容易理解
DEFINE_ISR(UART0,0x3C)
{
char buff[100]={'\0'};
get_buff0(buff,'\n');//获取一串字符串(该字符串要有换行符号)
send_buff0(buff);//把接收到的字符串再发送出去
_ur0f = 0;
}
这里中断地址可以参考上面的图表
下面是使用两个uart串口的中断语句
DEFINE_ISR(UART0,0x3C)
{
char buff[50]={'\0'};
char buff1[50]={'\0'};
if(_ur0f==1)
{
get_buff0(buff,'\n');
send_buff0(buff);
}
if(_ur1f==1)
{
get_buff0_uart1(buff1,'\n');
send_buff0_uart1(buff1);
}
_mf5f=0;
_ur0f=0;
_ur1f=0;
_emi=0;
}
这里的重点是要去判斷哪個旗標被置1
双路与单路是一样的,只是判断哪一个uart产生的中断,二者就只有这种区别。