PIE事实上是一个将多个外设中断合并成单个CPU中断的单元组,这些单元组被分别映射到CPU中断上。
而应用程序一般也是使用PIE来管理中断服务的。
简单的说,PIE需要实现的主要功能就是能够设置各种外设的中断向量即可。
这块的代码使用了大量的位操作,所以包含了位操作的头文件:
#include
在这里专门对中断服务函数类型进行定义。
PIE类申明在命名空间中:
namespace NF281x{
extern "C"{
typedef interrupt void(*INT_FUN)(void);
}
/**
* PIE操作类
* 一般的中断设置过程:
* 1 禁用CPU全局中断,清除CPU中断使能和中断标志
* 2 禁用PIE模块。初始化中断向量表
* 3 设置中断服务,使能相应的PIEIER,使能相应的CPU中断
* 4 使能PIE模块, 启用CPU全局中断
*/
class CPie{
public:
CPie();
这里为了使用内联函数,能够快速操纵,引用了相关的控制寄存器:
private:
volatile unsigned int& m_ack;
volatile unsigned int& m_ier1;
volatile unsigned int& m_ier2;
volatile unsigned int& m_ier3;
volatile unsigned int& m_ier4;
volatile unsigned int& m_ier5;
volatile unsigned int& m_ier6;
volatile unsigned int& m_ier7;
volatile unsigned int& m_ier8;
volatile unsigned int& m_ier9;
volatile unsigned int& m_ier10;
volatile unsigned int& m_ier11;
volatile unsigned int& m_ier12;
};
}
要对中断组进行确认,定义了一个ack函数。
事实上这个函数不够友好,应用程序不必要记住各种外设中断对应是哪个组,将来我们还要对各外设中断封装一层相应的ack函数。
所以我们只需要申明成保护的成员函数即可:
protected:
/**
* 中断确认
* @param group
*/
inline void ack( const int& group ){
m_ack |= (0x0001<
然后定义各种外设中断相关的函数。包括:使能中断,设置中断服务程序,对中断进行ack。
// group 1
inline void en_pdpIntA(){ NDm::bitSet(m_ier1); }
inline void dis_pdpIntA(){ NDm::bitClr(m_ier1); }
bool isEnabled_pdpIntA()const;
void setIrs_pdpIntA( INT_FUN irs );
inline void ack_pdpIntA(){
ack(0);
}
inline void en_pdpIntB(){ NDm::bitSet(m_ier1); }
inline void dis_pdpIntB(){ NDm::bitClr(m_ier1); }
bool isEnabled_pdpIntB()const;
void setIrs_pdpIntB( INT_FUN irs );
inline void ack_pdpIntB(){
ack(0);
}
inline void en_xint1(){ NDm::bitSet(m_ier1); }
inline void dis_xint1(){ NDm::bitClr(m_ier1); }
bool isEnabled_xInt1()const;
void setIrs_xInt1( INT_FUN irs );
inline void ack_xInt1(){
ack(0);
}
inline void en_xint2(){ NDm::bitSet(m_ier1); }
inline void dis_xint2(){ NDm::bitClr(m_ier1); }
bool isEnabled_xInt2()const;
void setIrs_xInt2( INT_FUN irs );
inline void ack_xInt2(){
ack(0);
}
inline void en_adcInt(){ NDm::bitSet(m_ier1); }
inline void dis_adcInt(){ NDm::bitClr(m_ier1); }
bool isEnabled_adcInt()const;
void setIrs_adcInt( INT_FUN irs );
inline void ack_adcInt(){
ack(0);
}
inline void en_tInt0(){ NDm::bitSet(m_ier1); }
inline void dis_tInt0(){ NDm::bitClr(m_ier1); }
bool isEnabled_tInt0()const;
void setIrs_tInt0( INT_FUN irs );
inline void ack_tInt0(){
ack(0);
}
inline void en_wakeInt(){ NDm::bitSet(m_ier1); }
inline void dis_wakeInt(){ NDm::bitClr(m_ier1); }
bool isEnabled_wakeInt()const;
void setIrs_wakeInt( INT_FUN irs );
inline void ack_wakeInt(){
ack(0);
}
// group 2
inline void en_cmp1Int(){ NDm::bitSet(m_ier2); }
inline void dis_cmp1Int(){ NDm::bitClr(m_ier2); }
bool isEnabled_cmp1Int()const;
void setIrs_cmp1Int( INT_FUN irs );
inline void ack_cmp1Int(){
ack(1);
}
inline void en_cmp2Int(){ NDm::bitSet(m_ier2); }
inline void dis_cmp2Int(){ NDm::bitClr(m_ier2); }
bool isEnabled_cmp2Int()const;
void setIrs_cmp2Int( INT_FUN irs );
inline void ack_cmp2Int(){
ack(1);
}
inline void en_cmp3Int(){ NDm::bitSet(m_ier2); }
inline void dis_cmp3Int(){ NDm::bitClr(m_ier2); }
bool isEnabled_cmp3Int()const;
void setIrs_cmp3Int( INT_FUN irs );
inline void ack_cmp3Int(){
ack(1);
}
inline void en_t1PInt(){ NDm::bitSet(m_ier2); }
inline void dis_t1PInt(){ NDm::bitClr(m_ier2); }
bool isEnabled_t1PInt()const;
void setIrs_t1PInt( INT_FUN irs );
inline void ack_t1PInt(){
ack(1);
}
inline void en_t1CInt(){ NDm::bitSet(m_ier2); }
inline void dis_t1CInt(){ NDm::bitClr(m_ier2); }
bool isEnabled_t1CInt()const;
void setIrs_t1CInt( INT_FUN irs );
inline void ack_t1CInt(){
ack(1);
}
inline void en_t1UfInt(){ NDm::bitSet(m_ier2); }
inline void dis_t1UfInt(){ NDm::bitClr(m_ier2); }
bool isEnabled_t1UfInt()const;
void setIrs_t1UfInt( INT_FUN irs );
inline void ack_t1UfInt(){
ack(1);
}
inline void en_t1OfInt(){ NDm::bitSet(m_ier2); }
inline void dis_t1OfInt(){ NDm::bitClr(m_ier2); }
bool isEnabled_t1OfInt()const;
void setIrs_t1OfInt( INT_FUN irs );
inline void ack_t1OfInt(){
ack(1);
}
// group 3
inline void en_t2PInt(){ NDm::bitSet(m_ier3); }
inline void dis_t2PInt(){ NDm::bitClr(m_ier3); }
bool isEnabled_t2PInt()const;
void setIrs_t2PInt( INT_FUN irs );
inline void ack_t2PInt(){
ack(2);
}
inline void en_t2CInt(){ NDm::bitSet(m_ier3); }
inline void dis_t2CInt(){ NDm::bitClr(m_ier3); }
bool isEnabled_t2CInt()const;
void setIrs_t2CInt( INT_FUN irs );
inline void ack_t2CInt(){
ack(2);
}
inline void en_t2UfInt(){ NDm::bitSet(m_ier3); }
inline void dis_t2UfInt(){ NDm::bitClr(m_ier3); }
bool isEnabled_t2UfInt()const;
void setIrs_t2UfInt( INT_FUN irs );
inline void ack_t2UfInt(){
ack(2);
}
inline void en_t2OfInt(){ NDm::bitSet(m_ier3); }
inline void dis_t2OfInt(){ NDm::bitClr(m_ier3); }
bool isEnabled_t2OfInt()const;
void setIrs_t2OfInt( INT_FUN irs );
inline void ack_t2OfInt(){
ack(2);
}
inline void en_capInt1(){ NDm::bitSet(m_ier3); }
inline void dis_capInt1(){ NDm::bitClr(m_ier3); }
bool isEnabled_capInt1()const;
void setIrs_capInt1( INT_FUN irs );
inline void ack_capInt1(){
ack(2);
}
inline void en_capInt2(){ NDm::bitSet(m_ier3); }
inline void dis_capInt2(){ NDm::bitClr(m_ier3); }
bool isEnabled_capInt2()const;
void setIrs_capInt2( INT_FUN irs );
inline void ack_capInt2(){
ack(2);
}
inline void en_capInt3(){ NDm::bitSet(m_ier3); }
inline void dis_capInt3(){ NDm::bitClr(m_ier3); }
bool isEnabled_capInt3()const;
void setIrs_capInt3( INT_FUN irs );
inline void ack_capInt3(){
ack(2);
}
// group 4
inline void en_cmp4Int(){ NDm::bitSet(m_ier4); }
inline void dis_cmp4Int(){ NDm::bitClr(m_ier4); }
bool isEnabled_cmp4Int()const;
void setIrs_cmp4Int( INT_FUN irs );
inline void ack_cmp4Int(){
ack(3);
}
inline void en_cmp5Int(){ NDm::bitSet(m_ier4); }
inline void dis_cmp5Int(){ NDm::bitClr(m_ier4); }
bool isEnabled_cmp5Int()const;
void setIrs_cmp5Int( INT_FUN irs );
inline void ack_cmp5Int(){
ack(3);
}
inline void en_cmp6Int(){ NDm::bitSet(m_ier4); }
inline void dis_cmp6Int(){ NDm::bitClr(m_ier4); }
bool isEnabled_cmp6Int()const;
void setIrs_cmp6Int( INT_FUN irs );
inline void ack_cmp6Int(){
ack(3);
}
inline void en_t3PInt(){ NDm::bitSet(m_ier4); }
inline void dis_t3PInt(){ NDm::bitClr(m_ier4); }
bool isEnabled_t3PInt()const;
void setIrs_t3PInt( INT_FUN irs );
inline void ack_t3PInt(){
ack(3);
}
inline void en_t3CInt(){ NDm::bitSet(m_ier4); }
inline void dis_t3CInt(){ NDm::bitClr(m_ier4); }
bool isEnabled_t3CInt()const;
void setIrs_t3CInt( INT_FUN irs );
inline void ack_t3CInt(){
ack(3);
}
inline void en_t3UfInt(){ NDm::bitSet(m_ier4); }
inline void dis_t3UfInt(){ NDm::bitClr(m_ier4); }
bool isEnabled_t3UfInt()const;
void setIrs_t3UfInt( INT_FUN irs );
inline void ack_t3UfInt(){
ack(3);
}
inline void en_t3OfInt(){ NDm::bitSet(m_ier4); }
inline void dis_t3OfInt(){ NDm::bitClr(m_ier4); }
bool isEnabled_t3OfInt()const;
void setIrs_t3OfInt( INT_FUN irs );
inline void ack_t3OfInt(){
ack(3);
}
// group 5
inline void en_t4PInt(){ NDm::bitSet(m_ier5); }
inline void dis_t4PInt(){ NDm::bitClr(m_ier5); }
bool isEnabled_t4PInt()const;
void setIrs_t4PInt( INT_FUN irs );
inline void ack_t4PInt(){
ack(4);
}
inline void en_t4CInt(){ NDm::bitSet(m_ier5); }
inline void dis_t4CInt(){ NDm::bitClr(m_ier5); }
bool isEnabled_t4CInt()const;
void setIrs_t4CInt( INT_FUN irs );
inline void ack_t4CInt(){
ack(4);
}
inline void en_t4UfInt(){ NDm::bitSet(m_ier5); }
inline void dis_t4UfInt(){ NDm::bitClr(m_ier5); }
bool isEnabled_t4UfInt()const;
void setIrs_t4UfInt( INT_FUN irs );
inline void ack_t4UfInt(){
ack(4);
}
inline void en_t4OfInt(){ NDm::bitSet(m_ier5); }
inline void dis_t4OfInt(){ NDm::bitClr(m_ier5); }
bool isEnabled_t4OfInt()const;
void setIrs_t4OfInt( INT_FUN irs );
inline void ack_t4OfInt(){
ack(4);
}
inline void en_capInt4(){ NDm::bitSet(m_ier5); }
inline void dis_capInt4(){ NDm::bitClr(m_ier5); }
bool isEnabled_capInt4()const;
void setIrs_capInt4( INT_FUN irs );
inline void ack_capInt4(){
ack(4);
}
inline void en_capInt5(){ NDm::bitSet(m_ier5); }
inline void dis_capInt5(){ NDm::bitClr(m_ier5); }
bool isEnabled_capInt5()const;
void setIrs_capInt5( INT_FUN irs );
inline void ack_capInt5(){
ack(4);
}
inline void en_capInt6(){ NDm::bitSet(m_ier5); }
inline void dis_capInt6(){ NDm::bitClr(m_ier5); }
bool isEnabled_capInt6()const;
void setIrs_capInt6( INT_FUN irs );
inline void ack_capInt6(){
ack(4);
}
// group 6
inline void en_spiRxIntA(){ NDm::bitSet(m_ier6); }
inline void dis_spiRxIntA(){ NDm::bitClr(m_ier6); }
bool isEnabled_spiRxIntA()const;
void setIrs_spiRxIntA( INT_FUN irs );
inline void ack_spiRxIntA(){
ack(5);
}
inline void en_spiTxIntA(){ NDm::bitSet(m_ier6); }
inline void dis_spiTxIntA(){ NDm::bitClr(m_ier6); }
bool isEnabled_spiTxIntA()const;
void setIrs_spiTxIntA( INT_FUN irs );
inline void ack_spiTxIntA(){
ack(5);
}
inline void en_mrIntA(){ NDm::bitSet(m_ier6); }
inline void dis_mrIntA(){ NDm::bitClr(m_ier6); }
bool isEnabled_mrIntA()const;
void setIrs_mrIntA( INT_FUN irs );
inline void ack_mrIntA(){
ack(5);
}
inline void en_mxIntA(){ NDm::bitSet(m_ier6); }
inline void dis_mxIntA(){ NDm::bitClr(m_ier6); }
bool isEnabled_mxIntA()const;
void setIrs_mxIntA( INT_FUN irs );
inline void ack_mxIntA(){
ack(5);
}
// group 7
// group 8
// group 9
inline void en_rxAInt(){ NDm::bitSet(m_ier9); }
inline void dis_rxAInt(){ NDm::bitClr(m_ier9); }
bool isEnabled_rxAInt()const;
void setIrs_rxAInt( INT_FUN irs );
inline void ack_rxAInt(){
ack(8);
}
inline void en_txAInt(){ NDm::bitSet(m_ier9); }
inline void dis_txAInt(){ NDm::bitClr(m_ier9); }
bool isEnabled_txAInt()const;
void setIrs_txAInt( INT_FUN irs );
inline void ack_txAInt(){
ack(8);
}
inline void en_rxBInt(){ NDm::bitSet(m_ier9); }
inline void dis_rxBInt(){ NDm::bitClr(m_ier9); }
bool isEnabled_rxBInt()const;
void setIrs_rxBInt( INT_FUN irs );
inline void ack_rxBInt(){
ack(8);
}
inline void en_txBInt(){ NDm::bitSet(m_ier9); }
inline void dis_txBInt(){ NDm::bitClr(m_ier9); }
bool isEnabled_txBInt()const;
void setIrs_txBInt( INT_FUN irs );
inline void ack_txBInt(){
ack(8);
}
inline void en_eCan0IntA(){ NDm::bitSet(m_ier9); }
inline void dis_eCan0IntA(){ NDm::bitClr(m_ier9); }
bool isEnabled_eCan0IntA()const;
void setIrs_eCan0IntA( INT_FUN irs );
inline void ack_eCan0IntA(){
ack(8);
}
inline void en_eCan1IntA(){ NDm::bitSet(m_ier9); }
inline void dis_eCan1IntA(){ NDm::bitClr(m_ier9); }
bool isEnabled_eCan1IntA()const;
void setIrs_eCan1IntA( INT_FUN irs );
inline void ack_eCan1IntA(){
ack(8);
}
// group 10
// group 11
// group 12