这是俺最新成果,标准库工作的一部分,呵呵,这是应用部分,对ST16C554四串口扩展的应用驱动程序。
//-------------------------------------------------------- //16C554 //使用中断0接收 //-------------------------------------------------------- #include <libRain_Base.h> #include <libRain_Unsiversal.h> #include <libRain_M162.h>
struct InST16c554Drv { struct ST16C554 sST16C554[4]; }; struct InST16c554Drv sInST16c554Drv; #define this sInST16c554Drv
//-------------------------------------------------------- //554注册 //-------------------------------------------------------- void ST16c554Drv_Register( struct ST16C554 *psST16C554, U16 mConfig ) { U8 i; for( i=0; i<4; i++ ) { if( !this.sST16C554.psCommunicateQueue ){ //空白 this.sST16C554.mAddr_High = psST16C554->mAddr_High; this.sST16C554.psCommunicateQueue = psST16C554->psCommunicateQueue; ST16C554_Setup( psST16C554, mConfig ); return; } } }
//-------------------------------------------------------- //INT0中断:554接收数据 //-------------------------------------------------------- SIGNAL( SIG_INTERRUPT0 ) { U8 i; struct ST16C554 *psST16C554; psST16C554 = &this.sST16C554[0]; for( i=0; i<4; i++ ) { if( psST16C554->psCommunicateQueue ){ //空白 ST16C554_Interrupt( psST16C554 ); } else { return; } psST16C554++; } }
//-------------------------------------------------------- //初始化 //-------------------------------------------------------- void ST16c554Drv_Init( void ) { Memory_Memset( (U8 *)&this, 0, sizeof(struct InST16c554Drv) ); //设置INT0为低电平中断 GICR |= (1<<INT0); }
//-------------------------------------------------------- //析构 //-------------------------------------------------------- void ST16c554Drv_Destory( void ) { GICR &= ~(1<<INT0); }
全局变量被封装在内部,外部通过注册队列指针传递相关信息,外部模块只和本身的队列操作相关,所有接收和发送管理被这个封装了,这个封装模块又调用通用库中的函数,一层一层的。 |