DSP

DSP 2812: 使用C++封装中断控制器PIE

2019-07-13 15:36发布

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