中断服务函数要放在非分页区
#include <hidefh> / common defines and macros /
#include <MC9S12XS128h> / derivative-specific definitions /
void initPIT(void)
{
PITMTLD0=199; //设定8-bit MICRO Timer0寄存器,它每次从199降到0,花费时
//间为2000125us=25us
PITCFLMT|=0x83; /0x83=1(PITE)000 0011(PFLMT[1:0]);PITE:使能PIT
PFLMT强制加载8位计数器值/
PITMUX&=0xfe; /定时器0对应8位计数器0/
PITLD0=15999; //定时周期=(15999+1)25us=400ms
PITINTE|=0x01; /使能定时器0的time-out中断/
PITFLT|=0x01; //强制加载
PITCE|=0x01; /使能定时器0,开始定时/
}
void main(void)
{
DDRB=0xff;
initPIT();
for(;;) ;
}
#pragma CODE_SEG NON_BANKED
//////////////////////就是上面这句话
void interrupt 66 PIT0_RE(void)
{
PITTF=0x01; /清除中断标志位/
PORTB =~PORTB; /改变led 状态/
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //中断函数置于非分页区内
interrupt VectorNumber_Vtimch7 void ICU_Ch7Int(void)
{
TFLG1_C7F = 1; //清中断标志位
}
#pragma CODE_SEG DEFAULT //后续代码置于默认区域内
我一般是用上述方式声明中断函数。
由于飞思卡尔16位单片机的中断向量是16位,所以中断函数只有被置于非分页区内才能被寻址到,这就是第一行的作用。
第二行中“VectorNumber_Vtimch7”是中断号,它是由文件“MC9S12XS128h”中定义的宏,这个中断号在它的技术手册中找到,但是我建议你采用这种宏的形式,因为这个宏不容易出错,可读性较高,比如“VectorNumber_Vtimch7”即为定时器(TIM)通道7(CH7)所对应的中断号。中断函数名“ICU_Ch7Int”可任意取,没有影响。
由于单片机内部非分页区大小有限,非中断函数一般置于分页区内,最后一行即为此作用。
// ---------------------------------ADC0-------------------------
ADC0_DP0,
ADC0_DP1,
PGA0_DP, //不支持ADC,需要配置 ADC PGA register 设置放大增益
ADC0_DP3,
//软件触发不支持B通道
ADC0_SE4b, // PTC2 不支持软件ADC
ADC0_SE5b, // PTD1 不支持软件ADC
ADC0_SE6b, // PTD5 不支持软件ADC
ADC0_SE7b, // PTD6 不支持软件ADC
ADC0_SE8, // PTB0
ADC0_SE9, // PTB1
ADC0_SE10, // PTA7
ADC0_SE11, // PTA8
ADC0_SE12, // PTB2
ADC0_SE13, // PTB3
ADC0_SE14, // PTC0
ADC0_SE15, // PTC1
ADC0_SE16, // ADC0_SE16
ADC0_SE17, // PTE24
ADC0_SE18, // PTE25
ADC0_DM0, // ADC0_DM0
ADC0_DM1, // ADC0_DM1
RES0, // 保留
RES1, // 保留
DAC0_OUT, // DAC0输出 不支持ADC
RES2, // 保留
RES3, // 保留
Temp0_Sensor, // Temperature Sensor,内部温度测量,可用ADC函数
Bandgap0, // 温度补偿结构带隙基准源 不支持ADC
RES4, // 保留
VREFH0, // 参考高电压,可用ADC函数 ,结果恒为 2^n-1
VREFL0, // 参考低电压,可用ADC函数 ,结果恒为 0
Module0_Dis, // 不支持 ADC
// ---------------------------------ADC1-------------------------
ADC1_DP0,
ADC1_DP1,
PGA1_DP, // 不支持 ADC
ADC1_DP3,
ADC1_SE4a, // PTE0
ADC1_SE5a, // PTE1
ADC1_SE6a, // PTE2
ADC1_SE7a, // PTE3
ADC1_SE4b = ADC1_SE4a, // PTC8 不支持软件ADC ,传递 ADC1_SE4b 到软件ADC函数里,会当作 ADC1_SE4a 处理。
ADC1_SE5b = ADC1_SE5a, // PTC9 不支持软件ADC
ADC1_SE6b = ADC1_SE6a, // PTC10 不支持软件ADC
ADC1_SE7b = ADC1_SE7a, // PTC11 不支持软件ADC
ADC1_SE8, // PTB0
ADC1_SE9, // PTB1
ADC1_SE10, // PTB4
ADC1_SE11, // PTB5
ADC1_SE12, // PTB6
ADC1_SE13, // PTB7
ADC1_SE14, // PTB10
ADC1_SE15, // PTB11
ADC1_SE16, // ADC1_SE16
ADC1_SE17, // PTA17
VREF_OUTPUT, // VREF Output
ADC1_DM0, // ADC1_DM0
ADC1_DM1, // ADC1_DM1
RES5, //保留
RES6,
DAC1_OUT,
RES7, //保留
RES8,
Temp1_Sensor,
Bandgap1, // 温度补偿结构带隙基准源 不支持ADC
RES9,
VREFH1, // 参考高电压,可用ADC函数 ,结果恒为 2^n-1
VREFL1, // 参考低电压,可用ADC函数 ,结果恒为 0
Module1_Dis, // 不支持 ADC
、、、、、、、、、、、、、、、、
/!
COPYRIGHT NOTICE
Copyright (c) 2013,山外科技
All rights reserved
技术讨论:山外论坛 http://wwwvcan123com
除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
修改内容时必须保留山外科技的版权声明。
@file mainc
@brief 山外K60 平台主程序
@author 山外科技
@version v50
@date 2013-08-28
/
#include "commonh"
#include "includeh"
/!
@brief main函数
@since v51
@note 山外 ADC 实验
/
void main()
{
uint16 var;
adc_init(ADC1_SE16); //ADC初始化
while(1)
{
var = adc_once (ADC1_SE16, ADC_8bit);
printf("\nADC采样结果为:%d",var);
printf(" 相应电压值为%dmV",(3300var)/((1<<8)-1));
DELAY_MS(500);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)