最近要用5509A做一些工作,平日里很少使用DSP,这次算是比较系统的来使用DSP了。当我浏览一些例程的时候发现对寄存器操作的时候都是调用的CSL封装好的库,这样确实挺方便的,直接套寄存器和值就好了,但是一个对DSP陌生的新手来说,什么时候该使用什么样的CSL库又该怎样操作这些库呢,确实挺苦恼的,起码我是挺郁闷的,到底该用哪个库函数。当然也可以直接在CSL库函数说明文档里一个一个去查,这样也挺麻烦的。我就想可不可以不调用库函数,而是直接操作寄存器。

方法还是有的。我想到在Linux系统中对寄存器操作是直接定义宏定义的,比如:#define A (*(volatial unsigned long *)B)的形式,那么在DSP中是不是也是可以的呢?

我用操作GPIO来做实验。实验效果闪烁一个灯。

最初的代码:

#define IODIR  (*(unsigned long *)0x3400)
#define IODATA (*(unsigned long *)0x3401)
main()
{/*初始化CSL库*/    CSL_init();//初始化CSL,使用任何CSL函数前必须初始化,只需初始化一次PLL_config(&myConfig);  /*确定方向为输出*/IODIR = 0xFF;while(1){     IODATA = 0x040;delay();IODATA = 0x00;delay();}
}
void delay()
{Uint32 j = 0,k = 0;for(j = 0;j<0x30;j++){for(k= 0;k<0xffff;k++){}}
}

下载运行。。。不成功!!!

郁闷,为何不行呢?于是我顺着操作GPIO用的库函数GPIO_RSET一直找下去,终于发现了秘密:在CSL_stdhal.h文件中发现了这么一行:#define PREG16(addr) (*(volatile ioport Uint16*)(addr))

原来玄机在这里,于是我修改代码:

#define IODIR  (*(volatile ioport unsigned short *)0x3400)
#define IODATA (*(volatile ioport unsigned short *)0x3401)

其他不变,下载运行。。。OK!灯是闪烁的。窃喜!对比之前的宏定义发现亮点不同:1。添加了“ioport” 2、是unsigned short型。我又试了unsigned int,unsigned char都可行,唯独unsigned long型不行,我猜测是寄存器地址是16位的不能用大于16位的类型定义。但是不明白这里的ioport是何意?

于是我想到了CCS的编译器,猜测是没加ioport时编译器不能识别我所定义的地址指针也就不能将数据写入地址,加了ioport就可以识别了。但是怎么来证明我的猜想。

于是去官网查找关于编译器的文档,终于被我找到了

ioport是我们访问IO空间的关键字,可用于2x,2xx,5x系列的编译器,看类型,必须是char,short,int跟我之前实验的结果是一样的

到这里就可以做个结论了:ioport是编译器识别端口寄存器地址的关键字也就是识别标志,类型必须是char,short,int,那么以后操作寄存器就可以不用调用库函数,直接宏定义进行操作就可以了。(必要的时候还是要调用的)

DSP 55xx操作外围寄存器简便方法相关推荐

  1. ccs中c语言定义布尔常量,CCS中寄存器定义方法

    <TMS 320 F28x源码解读>第1章DSP F28x 使用入门,通过位域结构体的方法为F28x 提供了一个完整的头文件体系,并且针对F28x 的外围设备给出了20 个外设示例,这是D ...

  2. 在Java中使用分隔符(拆分的对立面)连接数组元素的快速简便方法

    本文翻译自:A quick and easy way to join array elements with a separator (the opposite of split) in Java [ ...

  3. linux读写文件实例,Linux在应用层读写寄存器的方法及实现实例

    Linux在应用层读写寄存器的方法 可以通过操作/dev/mem设备文件,以及mmap函数,将寄存器的地址映射到用户空间,直接在应用层对寄存器进行操作,示例如下: #include #include ...

  4. cortex-m3 操作模式 寄存器组 异常类型 堆栈 中断

    cortex-m3 操作模式 寄存器组 异常类型 堆栈 中断 参考 操作模式 处理器的操作模式:为了区别正在执行代码的类型.复位后,处理器进入线程模式.特权级. 处理者模式(handler mode) ...

  5. 单片机快速将库函数版代码移植为寄存器代码方法

      现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了.但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快.所以在对时间要求比较严格的项目中,还是需要 ...

  6. [笔记].浅析在Nios II中的两种寄存器映射方法的异同

    此处以我所写的MAX7219为范例,从HDL接口描述到C语言软件编程,分析两种表面不一样.但实质是一样的寄存器映射方法,找出其中联系与区别. 方法1 使用Altera提供的API 1. 使用HDL描述 ...

  7. 【STM32F429的DSP教程】第6章 ARM DSP源码和库移植方法(MDK5的AC5和AC6)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第6章   ARM DSP源码和库移植方法(MDK5的AC5 ...

  8. java list iterable_java - 将Iterable转换为Collection的简便方法

    java - 将Iterable转换为Collection的简便方法 在我的应用程序中,我使用第三方库(确切地说是MongoDB的Spring Data). 此库的方法返回foreach,而我的其余代 ...

  9. python excel操作单元格_python 操作excel表格的方法

    说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...

最新文章

  1. python学费多少-python培训学费一般多少?
  2. PESTEL的风险建模
  3. c语言有一个正整数加上100,c语言编程实现:一个整数,它加上100后是完全平方数,再加168又是完全平方数,求该数。...
  4. [css] css中class和id选择器有什么区别?
  5. influxdb mysql对比_influxdb基础入门
  6. YoloV5实战:手把手教物体检测
  7. Redis实现分布式锁2
  8. 运维学习之自动化安装系统的配置
  9. Atitit nlp文本挖掘和自然语言处理方面,常用的算法总结 比如tf-idf 目录 1.1. tf:词频,是指某个词在某篇文章中出现的频率 2 1.2. 去停用词算法 2 1.3. idf。
  10. 忘记root密码,怎么办
  11. 大学excel题库含答案_Excel练习题及答案
  12. 线程安全的单例模式C++实现
  13. 均匀分布方差的计算方法
  14. varchar(1)的怪异现象
  15. 气温和降水空间栅格数据下载RS123
  16. 基于OBD系统的量产车评估测试(PVE)
  17. Python计算圆的周长与面积
  18. 用python计算方差,标准差和百分位数
  19. JavaScript知识之正则表达式(RegExp)
  20. 文献调研之如何查找文献及源码

热门文章

  1. python定义一个解一元二次方程的函数
  2. Python期货量化交易中常用的数据类型有哪些?
  3. 怎么通过id选择器将按钮隐藏
  4. stm32 IOT_嵌入式云IOT技术圈公众号精选文章专题汇总
  5. 【日照百度推广seo】想要转行做SEO?《SEO面试指南》拿去!
  6. 计算机(二):计算机存储系统(内存、外存)。
  7. 使用VBA生成设备调拨单
  8. Error:Cannot build Artifact :war exploded because it is included into a circular depency
  9. ADS1292R 心电图 如何计算心率
  10. 第一个asm……好囧