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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值