1. 关于协处理器XGATE
Freescale公司推出的S12XE系列双核单片机,其内部集成了一个可编程RISC内核的XGATE协处理器(双核),专门用来处理I/O和中断,其性能就相当于一个DMA控制器。由于采用了RISC架构,且处理速率比CPU快一倍,从而提高了系统的实时处理能力,极大的减轻了CPU的工作负荷,让CPU有能多的“精力”用于处理逻辑及计算上的问题,提高了单片机的工作效率。
2. 协处理器XGATE的工作模式
协处理器XGATE工作独立,和主CPU之间通过片内的双口RAM实现数据交互。同时,两个内核之间可以相互发送中断请求。当主CPU与XGATE之间存在竞争问题时,单片机采用了8个内部硬件信号量予以解决。
对于S12XE系列双核单片机来说,默认状态下,协处理器XGATE功能是不开启的。如果要开启XGATE双核功能,主要通过以下两个步骤:
新建工程时,添加设置XGATE工作模式;
利用代码配置、开启XAGTE功能。
3. 软件实现
关于串口的空闲中断就不在多做说明,这里我们以MC9S12XEP100单片机为例,利用协处理器,实现串口0的空闲中断收发功能,类似于STM32的串口DMA接收功能。
3.1 协处理器XGATE开启及配置
3.1.1 协处理器XGATE初始化配置
首先在main.c中实现协处理器XGATE的初始化,里面包括初始化协处理器的中断向量表以及注册串口中断并指定由协处理器来实现串口0的中断功能,最后开启协处理器中断。
#define SCI0_VEC 0xD6 /* 定义SCI0中断向量地址 */
static void SetupXGATE(void)
{
/* initialize the XGATE vector block and set the XGVBR register to its start address */
XGVBR= (unsigned int)(void*__far)(XGATE_VectorTable - XGATE_VECTOR_OFFSET);
ROUTE_INTERRUPT(SCI0_VEC, 0x81); /* RQST=1 and PRIO=1 */
XGMCTL= 0xFBC1; /* enable XGATE mode and interrupts XGE | XGFRZ | XGIE */
}
3.1.2 协处理器XGATE与CPU间共享内存定义
我们需要定义一片区域,来实现协处理器XGATE与CPU间的数据共享(类似进程间共享内存),这里需要注意定义的格式。
#pragma DATA_SEG SHARED_DATA
volatile unsigned char sic0_rx[256] = {0};
volatile int sic0_rx_len;
3.1.3 协处理器XGATE串口中断函数编写
在xaget.cxgate文件中注册串口0的中断函数并通过代码实现。
const XGATE_TableEntry XGATE_VectorTable[] = {
{ErrorHandler, 0x09}, // Channel 09 - Reserved
...
{(XGATE_Function)Sci0_Thread, 0x6B}, // Channel 6B - SCI0
...
{ErrorHandler, 0x79}, // Channel 79 - IRQ
}
当XGATE核检测到空闲中断后,向CPU核发送一个中断信号,表示数据接收完成。
interrupt void Sci0_Thread(void)
{
unsigned char tmp;
if(SCI0SR1_RDRF==1) /* 中断接收数据 */
{
sic0_rx[sic0_rx_len] = SCI0DRL;
sic0_rx_len++;
}
if(SCI0SR1_IDLE==1) /* 检测到空闲中断 */
{
tmp = SCI0SR1;
tmp = SCI0DRL;
SCI0SR1_IDLE = 0;
asm SIF; /* 向cpu发送中断信号 */
}
}
以上就是协处理器串口中断代码的实现,接下来我们继续完善CPU这边数据的处理工作。
3.2 主CPU功能配置
3.2.1 串口初始化配置
这里我们首先对SCI0进行初始化配置,包括波特率、数据位、校验位、停止位等,最后使能串口发送、空闲中断接收功能。
void sci0_init(dword baud)
{
dword baudRateReg;
baudRateReg = 24000000/16/baud; /* 配置波特率,外部晶振24M*/
SCI0BDH = 0x1f & (baudRateReg >> 8);
SCI0BDL = 0xff & baudRateReg; /* 波特率设置 */
SCI0CR1 = 0X04; /* 无奇偶校验,8位数据位,1位停止位 */
SCI0CR2 = 0X3C; /* 发送空闲中断接收使能*/
}
3.2.2 串口接收中断实现
在main.c中编写实现串口0的中断处理函数,这里我们只需要等待XGATE的中断信号,接收到中断信号后,说明空闲中断完成,执行用户操作后(我们这里利用一个flag来表示接收到空闲中断),清除协处理器中断标志位。
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 20 void SCI_Handler(void)
{
XGIF1 = 0x0800; /* 清除XAGTE串口0中断标志*/
sic0_send_flag = 1;
}
最后我们在主函数中判断空闲中断标志位,将接收到的数据再通过串口0发送出去。
if(sic0_send_flag==1)
{
sci0_send_data(sic0_rx,sic0_rx_len);
sic0_send_flag = 0;
memset(sic0_rx,0,sizeof(sic0_rx));
sic0_rx_len = 0;
}
4. 结果演示
打开串口调试助手,定时发送一帧数据,可以看到串口正常接收数据并反馈了回来。整个过程中,串口接收数据都由协处理器来完成,主cpu不参与接收过程,只需等待协处理器完成后,发送一个中断信号即可。
上一篇:单片机机器码以及偏移地址的计算
下一篇:Upton谈树莓派RP2040名字的由来
推荐阅读最新更新时间:2024-11-06 03:08
设计资源 培训 开发板 精华推荐
- 使用 Cypress Semiconductor 的 CY7C9689 的参考设计
- 10MB/s 多协议芯片组支持 Net1 和 Net2 标准,使用 LTC1543 控制器可选 DCE 端口和 DB-25 连接器
- MC33269 800mA 可调输出、低压降稳压器、数控稳压器的典型应用
- 基于STSPIN32F0252的电池供电的无刷电动工具的紧凑型参考设计
- 使用 Analog Devices 的 LT6600CDF-10 的参考设计
- 用于手机的 4-LED 白光 LED 驱动器
- CN5611-LED驱动
- NCP3063SMDBCKEVB:表面贴装降压稳压器评估板
- 迷你特斯拉线圈
- 使用 DAC 的软件可配置 14 位四通道单极/双极电压输出