[8/16-bit MCU] MC9S12XEP100的XGATE

[复制链接]
 楼主| herohxb 发表于 2015-11-5 11:43 | 显示全部楼层 |阅读模式
小弟做一个简单的AD采样,主要在协处理器里完成,在主程序里面读取采样结果。如下,主程序中的配置:

#define ROUTE_INTERRUPT(vec_adr, cfdata)                \
  INT_CFADDR= (vec_adr) & 0xF0;                         \
  INT_CFDATA_ARR[((vec_adr) & 0x0F) >> 1]= (cfdata)
#define ATD0_VEC 0xd2
//#define SOFTWARETRIGGER0_VEC  0x72 /* vector address= 2 * channel id */

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);

  /* switch software trigger 0 interrupt to XGATE */
  ROUTE_INTERRUPT(ATD0_VEC, 0x81); /* RQST=1 and PRIO=1 */

二、协处理器的设置
interrupt void ATD0_Thread(MyDataType* __restrict pData)
{
   AD_in0 = ATD0DR0;
   AD_in1 = ATD0DR1;
   DCPU = 0;
     ATD0CTL2_ASCIE = 0;
    asm SIF;
}

const XGATE_TableEntry XGATE_VectorTable[] = {..........
{(XGATE_Function)ATD0_Thread, 0x69},  //channel 69 - ATD0

........}

三、返回主函数main中,响应协处理器函数
/************************************************************/
/*              主处理器响应协处理器的中断函数              */
/************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 22 void ATD0_handler(void)
{
  x = AD_in0;
  y = AD_in1;
  ATD0CTL2_ASCIE = 1;
}
#pragma CODE_SEG DEFAULT



以上是我的程序,仿真结果是每次只能采集一次数据,且进入不了主函数中响应协处理器的那个函数。
FSL_TICS_ZJJ 发表于 2015-11-5 14:19 | 显示全部楼层
非常感谢你的技术问题。非常抱歉中国没有16位单片机方面的技术专家。请您在飞思卡尔的英文论坛提交请求。网址是https://community.freescale.com/welcome 谢谢。
杨爱林林 发表于 2015-11-6 13:34 | 显示全部楼层
首先  协处理器 是专门用来处理中断的  
你xgate里面有中断   main里面也有中断   这不是瞎搞吗

其次   进入中断记得清标志位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部