DSP 2812: 使用C++封装系统时钟管理模块
2016-03-02 21:38
716 查看
对于2812的系统时钟控制部分,其实还是蛮实用的。比如倍频,分频等。又比如要想要获取各外设的输入时钟等。
只需要设置晶振时钟,可以很容易的获取各外设时钟,以及设置外设时钟等。
在头文件中声明命名空间和类名
声明一个保存晶振频率的变量
作为全系统,可以定义一个全局的对象。
提供访问系统时钟频率的接口
提供访问高速外设时钟和低速外设时钟的接口
inline unsigned long getHiSpClk()const{
return getSysClk()/getHiSpRate();
}
inline unsigned long getLoSpClk()const{
return getSysClk()/getLoSpRate();
}
提供一些便利的封装。主要是获取各外设的时钟接口,免去查询文档,究竟外设是高速还是低速。
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还有对外设的休眠管理也是和时钟相关。将会放到一个单独的类中实现。
类的功能尽量设计功能专一或相近,和其他类关系松散。
只需要设置晶振时钟,可以很容易的获取各外设时钟,以及设置外设时钟等。
在头文件中声明命名空间和类名
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还有对外设的休眠管理也是和时钟相关。将会放到一个单独的类中实现。
类的功能尽量设计功能专一或相近,和其他类关系松散。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性