DSP简单例程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不知道你学过单片机没有。
37个寄存器是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)
类似于单片机的R0-R7.
GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P1,TCON,等等。
GPXCON:是X管脚的控制寄存器,控制它们的模式,比如输出模式,输入模式……GPXDAT:是X管脚的数据寄存器,存储它们的数据,
比如:
在输出模式中,想在X管脚输出什么数据,就在这个寄存器里写入什么数据,
在输入模式中,这个寄存器中存储的就是外部输入的数据。
手把手教你找GPIO寄存器IODIR 定义
手把手教你找寄存器定义
一直就很纳闷,没有一个向c8051f410.h的头文件定义特殊功能寄存器,找不见定义,使用起来就无从下手,心里总是不舒坦;
从网上看了一些帖子,都说就是在头文件里(我也是这么认为的,肯定要有定义的,不然无法调用)
StartUp{
………..
……….
GEL_MapAdd(0x3400u,2,0x0400u,1,1); /* GPIO 1KW */
………..
}
这段映射0x3400u 为GPIO空间,其实只是表示这段i/o空间可读可写;
下面是我一步一步地追踪,这些都是要用到的宏定义;
#define PREG16(addr) (*(volatile ioport Uint16*)(addr)) 从一个ioport Uint16*类型的地址中取出地址内容,就是IODIR寄存器的值了
#define _GPIO_IODIR_ADDR (0x3400u) //定义了IO地址常量
#define _GPIO_IODIR PREG16(_GPIO_IODIR_ADDR) //得到寄存器的地址
#define _IODIR _GPIO_IODIR 定义了 _IODIR 常量
#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR 两个变量合并
#define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)Val
#define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val)
从这个宏定义开始
1:GPIO_RSET(IODIR,1)
这句很明显了,把IODIR寄存器的值置1
2:_PREG_SET(GPIO_ADDR(##IODIR),1)
利用这两个宏
#define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val)
#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR
分解的到
a:GPIO_ADDR(IODIR) _GPIO_##Reg##_ADDR
_GPIO_ IODIR _ADDR
b:_PREG_SET(_GPIO_ IODIR _ADDR,1)
3:接下来
#define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)Val
PREG16(_GPIO_ IODIR _ADDR) =1;
4::#define PREG16(addr) (*(volatile ioport Uint16*)(addr)) *
*(_GPIO_ IODIR _ADDR) = 1;
5:这句就简单了*(0x3400u) = 1;
一步一步顺藤摸瓜,总算摸到;但我们的问题,还是没讲清楚;
究竟IODIR 是在哪里定义的呢?
开始我也很迷惑,仔细想想后,惶然大悟,快乐!!
问题出在,这些都是宏语句,执行编译前,就已经把GPIO_RSET(IODIR,1) 翻译成*(0x3400u) = 1;
编译器不认识IODIR ,而IODIR在直到
#define GPIO_ADDR(Reg) _GPIO_##Reg##_ADDR 两个变量合并
前就是个字符串,连个常量都算不上(不知道这么说确切不,完全是因为它在语句的位置,赋予了它意义)
跟单片机类比 SFR IODIR = 0X3400;
编译器绕了这么一大圈,其实做得工作太简单了,究竟为什么这么做,我还没来得及想。
总之这个问题已经很明白了;
数字地和模拟地
模拟和数字的概念要搞清楚,模拟是连续的,数字通常就是高低电平信号,之所以模拟地和数字地要分开原因就是担心两总信号之间的干扰。
举个例子说吧,你的耳机是就是由模拟信号来驱动的,它就有一个地,这个地就是模拟地,然后这个地要通过一个磁珠来和你解码芯片的地连接,这样你的输出音质才会好。
是模拟或者数字是由你的后端电路来决定的,而不是你稳压出的电压决定的!!!也就是说你稳压出的电压,可以用在模拟也可以用作数字。