终于有机会从头到尾开发一个系统了。是基于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。因为第一次超时不重启。