做的过程中发现,lpc54102的资料完全没有stm32多,而且讲的详细的人也很少,官方公布出来的也不太多,我分析一些实用但是讲的少的东西。 就是延时控制问题。对于ms级别的延时,还是比较好处理,用freertos的话,系统有计数,对于非系统,utick,sctime,都是比较好处理的。Us级别的处理,讲的人就少了。万利的板子用的是直接空循环延时的办法处理,方法倒是可以,觉得有点太简单粗暴了一些,而且具体的延时不好判断。 Systick就是一个不错的办法。 设置分频数和重载值基本就可以使用了。 我实验过了,使用systick产生一个us级别的中断,完全没有问题。 就是官方的说法,intended for 10 ms。令人有些困惑。我只能理解为,官方推荐10ms中断,可以保证精度,其他的不一定,但是对于我们需要us级别中断的精度,基本是够。 推荐一个us中断函数。 在systick里不断的增加一个u32变量。 U32 TimeCount; void SysTick_Handler(void) { TimeCount++; } void delay_us(uint32_t _ulDelayTime) { uint32_t tCnt, tDelayCnt; uint32_ttStart; tStart= TimeCount; tCnt= 0; tDelayCnt= _ulDelayTime; while(tCnt< tDelayCnt) { tCnt= TimeCount - tStart; } } 由于unsigned int的特点,过了最大值,就是0,可以方便的运用在计数函数里。 另外,lpc54102中同样具有DWT,这个调试跟踪单元,它可以作为一个单独的计数器,而不会占用系统资源,可以用来做us级别定时。 最近项目,需要一面读取视频,一面刷新lcd,一面存储,就不得不提一下双核的运用。双核的运用最重要的mutex和mailbox。 双核的启动中涉及到M4发送mailbox触发mo reset,有网友讲的挺清楚。 就不细说了。 Mailbox这个功能其实非常简单, 多了一个锁,接收方,收到之后,锁定,另外一方就用不了。涉及到函数就两个。 mutexTake(); mutexGive(); 使能MAILBOX_IRQ后,收到邮箱,进入中断。 由于就两个对象,不是m0,就是m4.逻辑上也没有啥优先级反转之类的问题。处理起来还是挺方便。 讲一个我的运用场景。Mo接收视频图像到一个指定的ram区,接收完成后,发缓冲区的地址给m4.M4处理,刷屏或者存储。处理完之后,把指针反馈给m0.mo才开始更新缓冲区。由于mailbox的锁是针对邮箱内容的。所以对于缓冲区,我也需要保护机制,互锁机制。 由于占用的ram非常大,这边自己需要设定一个内存池,方便管理,对于内存池的内存访问,必须只有接受到mailbox指针信息后,才可以访问或者写内存。这样才可以防止读写过程中出错。 理论上如此,涉及到图像处理,还是比较麻烦,占用资源,目前还在调试。完成后,会和大家分享心得。
|