[资料分享] DSP 2812: 使用C++封装GPIO

fish001   2020-12-5 21:37 楼主

2812中的GPIO被分成很多组:GPA,GPB,GPD,GPE,GPF,GPG。
我们将组进行抽象。

组抽象:CGpio类
使用命名空间对类进行包裹
namespace NF281x{
class CGpio{
    CGpio( const CGpio& );
public:
    CGpio( volatile unsigned int& mux,volatile unsigned int& dir,
            volatile unsigned int& dat,volatile unsigned int& set,volatile unsigned int& clr,
            volatile unsigned int& tog );

这里对拷贝构造进行了限制。
一下包含了相关寄存器的引用。定义这些寄存器,是为了在头文件中暴露出来,可以使用内联函数访问到。在一些需要快速操作的应用中,这样的设计是必要的。

protected:
    volatile unsigned int& m_mux;
    volatile unsigned int& m_dir;

    volatile unsigned int& m_dat;
    volatile unsigned int& m_set;
    volatile unsigned int& m_clr;
    volatile unsigned int& m_toggle;
};
}

对MUX进行封装
    /**
     * 获取该组GPIO第i个io口的MUX
     * @param i 0~15
     * @return
     * - 0 作为IO
     * - 1 作为外设
     */
    inline unsigned int getMux( const int& i )const{
        return m_mux&(0x0001<<i);
    }

    inline bool isMuxIo( const int& i )const{
        return getMux(i)==0;
    }

    inline bool isMuxPeripheral( const int& i )const{
        return getMux(i)!=0;
    }

    /**
     * 设置GPIO作为IO
     * @param i
     */
    void setMuxIo( const int& i );

    /**
     * 设置GPIO为外设模式
     * @param i
     */
    void setMuxPeripheral( const int& i );

    /**
     * 设置GPIO的MUX
     * @param i
     * @param mux
     * - 0 IO模式
     * - 1 外设模式
     */
    inline void setMux( const int& i,const unsigned int& mux ){
        if( mux==0 )
            setMuxIo(i);
        else
            setMuxPeripheral(i);
    }

对IO模式的操作进行封装
    inline unsigned int getIoDir( const int& i )const{
        return m_dir&(0x0001<<i);
    }

    inline void setIoDir( const int& i,const unsigned int& dir ){
        if( dir==0 )
            setIoIn(i);
        else
            setIoOut(i);
    }

    void setIoIn( const int& i );
    void setIoOut( const int& i );

    inline bool isIoIn( const int& i )const{
        return getIoDir(i)==0;
    }

    inline bool isIoOut( const int& i )const{
        return getIoDir(i)!=0;
    }

对于DO进行封装
    inline void set( const int& i ){
        m_set |= (0x0001<<i);
    }

    inline void clear( const int& i ){
        m_clr |= (0x0001<<i);
    }

    inline void toggle( const int& i ){
        m_toggle |= (0x0001<<i);
    }

子类CGpa,CGpb等
- 这里举一个例子,CGpa的类设计

namespace NF281x{

class CGpa:public CGpio{
    CGpa( const CGpa& );
public:
    CGpa();
};
}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复