1623|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

DSP 2812: 使用C++封装系统时钟管理模块 [复制链接]

对于2812的系统时钟控制部分,其实还是蛮实用的。比如倍频,分频等。又比如要想要获取各外设的输入时钟等。

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

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


[cpp] view plain copy
print?


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


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


[cpp] view plain copy
print?


  • private:  
  •     unsigned long m_oscClk;  
  • };  
  •   
  • }  


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

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


[cpp] view plain copy
print?


  • /**
  • * 获取系统主频
  • */  
  • 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 );  


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

[cpp] view plain copy
print?


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


[cpp] view plain copy
print?


  • /**
  • * 设置高速外设分频倍率
  • * @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;  
  • }  


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

[cpp] view plain copy
print?


  • 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还有对外设的休眠管理也是和时钟相关。将会放到一个单独的类中实现。

类的功能尽量设计功能专一或相近,和其他类关系松散。


点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表