您的位置:首页 > 编程语言 > C语言/C++

DSP 2812: 使用C++封装系统时钟管理模块

2016-03-02 21:38 716 查看
对于2812的系统时钟控制部分,其实还是蛮实用的。比如倍频,分频等。又比如要想要获取各外设的输入时钟等。

只需要设置晶振时钟,可以很容易的获取各外设时钟,以及设置外设时钟等。

在头文件中声明命名空间和类名

namespace NF281x{

/**
* 系统时钟控制类
*/
class CClocking{
public:
/**
* 构造时,必须指定系统晶振或者输入时钟频率
* @param oscClk 输入时钟频率,单位:赫兹
*/
CClocking( const unsigned long& oscClk );


声明一个保存晶振频率的变量

private:
unsigned long m_oscClk;
};

}


作为全系统,可以定义一个全局的对象。

提供访问系统时钟频率的接口

/**
* 获取系统主频
*/
inline unsigned long getSysClk()const{
return m_oscClk * getPllDiv() / 2;
}

/**
* 设置系统主频
* @param clk 要设置的主频
* @param wait 设置后等待计数次数
* @warning 本函数会禁用片上看门狗
*/
void setSysClk( unsigned long clk,const unsigned long& wait=10000 );


提供访问高速外设时钟和低速外设时钟的接口

inline unsigned long getHiSpClk()const{
return getSysClk()/getHiSpRate();
}

inline unsigned long getLoSpClk()const{
return getSysClk()/getLoSpRate();
}
/**
* 设置高速外设分频倍率
* @param rate
* 取值为部分值,@see setHiSpPrescaler()
*/
inline bool setHiSpRate( const int& rate ){
if( (rate!=1 && rate%2) || rate<1 || rate>14 )
return false;
else
setHiSpPrescaler(rate/2);
return true;
}

inline bool setLoSpRate( const int& rate ){
if( (rate!=1 && rate%2) || rate<1 || rate>14 )
return false;
else
setLoSpPrescaler(rate/2);
return true;
}


提供一些便利的封装。主要是获取各外设的时钟接口,免去查询文档,究竟外设是高速还是低速。

inline unsigned long getClk_ecan()const{
return getSysClk();
}

inline unsigned long getClk_timer()const{
return getSysClk();
}

inline unsigned long getClk_sci()const{
return getLoSpClk();
}

inline unsigned long getClk_spi()const{
return getLoSpClk();
}

inline unsigned long getClk_mcbsp()const{
return getLoSpClk();
}

inline unsigned long getClk_ev()const{
return getHiSpClk();
}

inline unsigned long getClk_adc()const{
return getHiSpClk();
}
有了这些功能基本对时钟的管理就完成了。

2812还有对外设的休眠管理也是和时钟相关。将会放到一个单独的类中实现。

类的功能尽量设计功能专一或相近,和其他类关系松散。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DSP开发 CCS5 C++