您的位置:首页 > 其它

嵌入式开发的一些经验和教训。

2011-07-31 15:28 239 查看
终于有机会从头到尾开发一个系统了。是基于TI Stellaris Cortex-3系列的微控制器。



1 Don't re-invent the wheel。(TI已经提供了Bootloader,UCOS官网也已经有了移植好的OS)。

我们要把宝贵的时间放在业务逻辑和核心算法上。

2 一些注意的开发细节:

给操作系统提供时钟中断---》用户第一个进程中启动时钟中断,有了时钟(操作系统的脉搏)才能进行多任务的切换。

Cortex-3集成了周期时钟中断的模块。【让移植系统变得非常简单】

UCOS中,在OSInit函数[该函数用来初始化OS的全局结构和变量]之前不能调用任何UCOS的系统函数。

驱动开发:

对于外围设备来说,第一件事情就是要"使能时钟"(enable clock)。

GPIO配置:

GPIO口在系统启动之后默认是tri-states。一般可以统一把GPIO口配置成上拉或者下拉。

配置GPIO口得时候还要配置驱动电流大小。

对于把GPIO配置成中断触发的时候,我们要先把GPIO口配置成输入模式。

1如何编写分散加载文件。

2如何把printf重定位到串口。

3如何引用链接符号

多看些KEIL自带的编译帮助文档。

注意底层驱动接口提供的是机制而不是策略。

3 定时器配置:

Once the 0x0000 state is reached, the timer reloads its start value from GPTMTnILR and GPTMTnPR on the next cycle 。

也就是说,定时器到时(也就是0)的时候重新载入 load_value和prev_value。而不是“想当然”的保持在0值。

ONE-SHOT模式下,也可以只配置一次:原因是,当定时器到时,寄存器将会重载,而且自动disable,所以只需要enable就可以了重启定时器。

GPTMTnILR and GPTMTnPR on the next cycle

4 SPI通信

SPI通信犯了几个错误呢 (slave device是Effio-E)

1 手动CS的拉低与发送的时间延时。

对,这次没有采用SPI自己的CS信号。

而是通过GPIO模拟片选。来手动拉高拉低。因为根据Effio-E的文档。CS信号在通信过程中要一直为低。而SPI控制芯片的发送模式是ONCE。也就是每发送一个 BYTE就拉低拉高一次。而且发送很可能被中断,这个时候要手动拉高CS来通知Effio通信结束。

如果采用SPI自己控制。则直接发送数据就好。控制芯片会自动控制CS信号与TX_DATA信号之间的延时。

但是手动控制CS信号。则在拉低CS信号的时候,必须有一定的延时,才能驱动TX_DATA信号。也就是CS拉低是为了表明。主设备要准备发送的数据的信号。

但是从设备要有一定的准备时间。而这个时间就是延时时间的依据。

文档上:After a further one-half SSIClk period, both master and slave data are enabled onto their respective transmission lines.

也就是说在CS拉低之后的半个时钟周期以后才能驱动TX_DATA。

2 字节发送之间的间隔

每个字节发送之间要有间隔的,这样从设备才能分辨出来(Effio Doc上有说明)。但是不详细。最好通过示波器查看具体波形。来确定延时的长短。

3 bit发送顺序

Effio是按照LSB来接受和发送数据的

但是LM3S的SPI都是以MSB来接受和发送数据的。所以发送之前byte的bit order要反转。

4 Effio Busy信号的检测

以前发送字节结束之后,立马检测Busy信号。其实不准确。因为Effio从设备需要一定的时间来反映。所以最好延时一段时间。(通过示波器来查看波形)

通过示波器的显示结果来看(CS一旦被拉高,Busy信号就开始拉高了)

5 SPI时钟频率

最恶心的BUG。CS CLK BUSY信号(BUSY有时候也有问题)都是对的。但是TX_DATA信号在空闲的时候被莫名的拉高。怎么分析都不对,以为是硬件的BUG。

但是不连接Effio。TX_DATA的信号是对的。连入Effio就不对。

秉着多尝试的态度。我降低了SPI的时钟。结果一切都OK了。看来时钟频率太快。Effio反应不过来。(SPI的标准配置是1MHZ。Effio竟然说自己支持。太无耻了)

6 CheckSum的小问题

所有的BYTE bit order全部反转之后 求得的CheckSum

和 BYTE bit求完CheckSum之后,在反转CheckSum bit order 值是不同的。

因为这里的CheckSum只是字节的简单求和。涉及到进位。。。进位将被舍弃。。。而不同bit order求的舍弃的进位不同。也就导致反转之后不同。

7 有些chip的SPI通信时:每两次通信之间都需要一个最短延时以保证通信的正确性。而ISP(image signal process)是通过一个BUSY引脚来反映当前chip状态。如果BUSY状态为1,则不能进行SPI通信,如果为0,则可以进行SPI通信。

8 SPI为同步通信。对于主设备先发送命令到从设备,然后主设备再驱动时钟从从设备中接收数据的方式。

发送命令时,SPI的接收端口可能会收到一些干扰数据。所以在接收正式数据前,应该先清空接收队列中的数据。

5 WATCHDOG

LM3S中的 watchdog超时并不直接reset。而是产生一个interrupt,然后重新reload count。第二次超时的时候才reset系统(如果开启resen标志位)。

所以如果设这超时时间为T2,其实reset的时间为2*T2。因为第一次超时不重启。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: