MCL0/MCH0/BTH1/MCT1几个寄存器应该是御祥谨有映射至特殊寄存器!
你可以看看程序中对MCL0/MCH0/BTH1/MCT1几个寄存器的定义,映射到了什么地址!
你的单宴雹片机型号是什么?最好将变量定义的语镇基句贴上来!
#pragma NOAREGS //禁止编译器使用绝对寄存器寻址,一定要加上#include <REG52.H> //51单片机头文件#include "CH375INC.H" //CH372/CH375头文件 ///////////////////丛衡//////////////////////////////说明: CH372总线地址// 采用别的方式,地址另外设定///////////////////////////////////////////////unsigned char volatile xdata CH375_CMD_PORT _at_ 0x03F1 unsigned char volatile xdata CH375_DAT_PORT _at_ 0x03F0/*********************延时程序********************/////////////////////////辩芹/////////////////////////函数:delay2us//说明:延时2us//入口:无//返回:无/////////////////////////////////////////////// voiddelay2us( ) { unsigned char i for ( i = 2i != 0i -- ) }/////////////////////////////////////////////////函数:delay50ms//说明:延时50ms//入口:无//返回:无///////////////////////////////////////////////voidDelay50ms( ) { unsigned char i, j for ( i="200"i!=0i-- ) for ( j="250"j!=0j-- ) }/*********************基本读写程序********************/////////////////////////////渗灶做/////////////////////函数:CH375_WR_CMD_PORT//说明:写USB命令//入口:unsigned char cmd:待写入命令//返回:无///////////////////////////////////////////////void CH375_WR_CMD_PORT( unsigned char cmd ){delay2us() CH375_CMD_PORT=cmd delay2us() }/////////////////////////////////////////////////函数:CH375_WR_DAT_PORT//说明:写一字节USB数据//入口:unsigned char dat:待写入一字节数据//返回:无///////////////////////////////////////////////void CH375_WR_DAT_PORT( unsigned char dat ){ CH375_DAT_PORT=dat } /////////////////////////////////////////////////函数:CH375_RD_DAT_PORT//说明:读一字节USB数据//入口:无//返回:从CH372/CH375读一字节数据///////////////////////////////////////////////unsigned char CH375_RD_DAT_PORT( void ){ return( CH375_DAT_PORT ) } /*********************初始化和中断服务程序********************//////////////////////////////////////////////////函数:CH375_Init//说明:CH372/CH375初始化//入口:无//返回:无///////////////////////////////////////////////voidCH375_Init( ) { /* 设置USB工作模式, 必要 *** 作 */unsigned char i CH375_WR_CMD_PORT( CMD_SET_USB_MODE ) //设置USB工作模式CH375_WR_DAT_PORT( 2 ) //设置为内置固件模式for ( i="100"i!=0i-- ){ /* 等待 *** 作成功,通常需要等待10uS-20uS */if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break } /* 下面启用USB中断,CH372/CH375的INT#引脚可以连接到单片机的中断引脚,中断为低电平有效或者下降沿有效,如果不使用中断,那么也可以用查询方式,由单片机程序查询CH372/CH375的INT#引脚为低电平 */IT0 = 0/* 置外部信号为低电平触发 */IE0 = 0/* 清中断标志 */EX0 = 1 /* 允许CH372中断,假定CH372的INT#引脚连接到单片机的INT0 */} /////////////////////////////////////////////////函数:mCh375Interrupt//说明:CH372/CH375中断程序//入口:无//返回:无///////////////////////////////////////////////void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char i, length unsigned char data buffer[64] unsigned char InterruptStatus CH375_WR_CMD_PORT( CMD_GET_STATUS ) //获取中断状态并取消中断请求 InterruptStatus = CH375_RD_DAT_PORT( ) //获取中断状态//采用边沿触发的外部中断请求,CPU在相应中断后,自动清除中断标志switch ( InterruptStatus ){ case USB_INT_BUS_RESET1: //USB总线复位{ break}case USB_INT_BUS_RESET2: //USB总线复位{ break}case USB_INT_BUS_RESET3: //USB总线复位{ break}case USB_INT_BUS_RESET4: //USB总线复位{ break}case USB_INT_EP0_SETUP: {//端点0 的接收器接收到数据,SETUP 事务成功,内部固件模式时不需要处理break}case USB_INT_EP0_OUT:{//端点0 的接收器接收到数据,OUT 事务成功,内部固件模式时不需要处理break }case USB_INT_EP0_IN:{ //端点0 的发送器发送完数据,IN 事务成功,内部固件模式时不需要处理break }case USB_INT_EP2_OUT://批量端点/端点2接收到数据,OUT成功{ //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ) length = CH375_RD_DAT_PORT( ) /* 首先读取后续数据长度 */ for ( i = 0i <lengthi ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ) //接收数据包 /* -----------测试数据正确性,将接收到的命令包数据返回给PC机----------- */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ) /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( length ) /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0i <lengthi ++ ) CH375_WR_DAT_PORT( buffer[ i ] ) /* 数据返回,由计算机应用程序测试数据是否正确 */ /* ------------------------------------------------------------------------------------------------------ */ break } case USB_INT_EP2_IN: //批量端点/端点2发送完数据,IN成功{ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ) //释放当前USB缓冲区break } default: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ) break } } }/////////////////////////////////////////////////函数:main//说明:主程序。对CH372初始化,对USB进行读写及其他程序//入口:无//返回:无///////////////////////////////////////////////main( ) { Delay50ms( ) CH375_Init( )//对CH375/CH372初始化EA = 1 //允许中断while(1)}定义中断的方式有两种,第一种
interrupt void PTH_inter(void) //PTH_inter 是中断函数名,这个可以任意取
这种方式需要在Project.prm文件中将这个函数名改谈与中断向量对应上。
如在prm文件处写上"VECTOR ADDRESS 0xFFE8 PTH_inter" (0xFFE8是中断向量地址,在这只是举个例子),也可以写成“VECTOR VectorNumber_Vtimch7 PTH_inter” (VectorNumber_Vtimch7是中断向量号)
第二种
#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”是中断号,它是由文件“MC9S12XS128.h”中定义的宏,这个中断亩烂号在它的技术手册中找到,但是我建议你采用这种宏迅歼漏的形式,因为这个宏不容易出错,可读性较高,比如“VectorNumber_Vtimch7”即为定时器(TIM)通道7(CH7)所对应的中断号。中断函数名“ICU_Ch7Int”可任意取,没有影响。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)