自控笔记

基于FPGA的SRAM设计

一、不利用FPGA内部存储单元,只利用VerilogHDL硬件描述语言来设计。

分为两个部分,SRAM内核,SRAM接口。SRAM接口利用三态门使数据口具有双向(输入\输出)功能。RTL结构如下:

RTL

altera_reports

SRAM内核代码:

 

SRAM接口代码:

SRAM顶层代码:

 

modelsim仿真程序:

用modelsim仿真如下:

modelsim

二、利用VerilogHDL,调用FPGA内部存储单元

altera 内部存储单元需要时钟来驱动,但是异步sram是没有时钟的,只需把时钟接在锁相环上,利用晶振来驱动即可。sram顶层bdf图如下所示:

sram2

altera_reports2

sram内核代码:

sram接口代码:

modelsim仿真程序:

modelsim仿真结果:

(将顶层文件生成HDL语言文件后,在工程中移除bdf文件,并添加生成的HDL文件后才可仿真)

modelsim2

利用ARM测试:

综合后,连接上LPC1788 EMC(外部存储器控制器)接口上,经过测试可以正常读写。

嵌入式格式化输出

在C语言中,一般用printf进行格式化输出。但是在ARM使用标准C库时,printf一般用于半主机模式(semihosting)的输出。可以对printf进行重定向,但是要求使用microlib。在使用microlib时,利用printf进行输出,会优先调用用户自定义的函数fputc,所以对fputc进行重写既可以完成printf的重定向。在标准C库下,如果取消半主机模式,也可以通过定义fputc实现对printf的重定向。

除此之外,还可以自己编写格式化输出函数,实现格式化的输出。

一、使用microlib,对printf重定向

只需重写fputc,并勾选microlib即可。

二、使用标准C库,对printf进行重定向

取消半主机模式

重写fputc函数

 

三、自己编写格式化输出函数

 

自己编写格式化输出,另外一种简单的办法

基于uC/OS-II与LwIP的WEB服务器搭建

拿到新唐公司送的NUC472开发板已经有一段时间了,主要学习了一下以太网。毕业课题,准备找工作。。。时间有限,对NUC472开发板就到处为止吧。

以前总是想学习一下以太网,但是一直没有付诸行动。新唐公司的NUC472开发板恰好带有以太网接口,并且外置了以太网PHY,终于下定决心学习一下以太网。

先是了解了下以太网的几种基本的协议,以及大多芯片上采用的MII和RMII接口,最后做了UDP和TCP通信实验,最后搭建了动态的http服务器。

自己在NUC472上编写了服务器端的SSI和CGI。CGI用于处理网页提交的GET方法,SSI用于服务器端对网页的处理,主页是把设置的标签替换成所要在web页面上显示的数据。

web目录结构如下:.

                                ./index.shtml

                                ./404.html

                                ./cgi_respond.shtml

                                ./image/mytown.jpg

                                ./image/favicon.ico

页面主要有以下特点:

  • 页面无刷新,动态获取服务器数据,动态显示uC/OS-II系统时钟及LED闪烁状态
  • 页面无刷新,设置并控制NUC472开发板LED闪烁周期

http1http2

nuc472

LPC1788 emWIN屏幕闪烁瞬间花屏问题解决方案

LPC1788的emWIN移植好以后发现,静态的画片显示效果良好,虽然上次选择USE MICROLIB后,效果好的多,但是一旦加上交互(比如触屏动作)或者画面切换时仍然会出现瞬间的闪屏和图片错位,虽然不影响使用,但是对用户体验来说还是有很大的影响的。怀疑是SDRAM速度跟不上的原因,但是别人移植的emWIN同样的时钟频率,同样的SDRAM都没有出现这种情况,心中甚是疑惑,搞了好久,问题都没有解决。

今天把EMC时钟调高后瞬间闪屏错位的现象完全消除。

原来的EMC时钟为CPU核心时钟的一半,现在改为和CPU时钟频率相同。CPU核心时钟为120MHz,所以原来EMC时钟为60MHz,现在为120MHz。看了下SDRAM的数据手册,最高支持频率可达:166MHz/CL3,133MHz/CL2,所以SDRAM 120MHz在规定的频率范围内。

emcclk

sdram_clk

LPC1788 emWIN移植笔记(二)–触摸屏驱动移植

昨天对emWIN的LCD驱动进行了移植,今天要对触摸屏驱动进行移植。

对emWIN编写触摸屏驱动很简单,方法也有很多。在这里只详细介绍其中一种方法。

对emWIN触屏驱动进行移植,只需要配置GUI_TOUCH_X_ActivateX(), GUI_TOUCH_X_ActivateY(),GUI_TOUCH_X_MeasureX(), GUI_TOUCH_X_MeasureY()四个函数即可。

可以根据自己的驱动编写方式进行配置,一般GUI_TOUCH_X_ActivateX(), GUI_TOUCH_X_ActivateY()可以为空,只需要在GUI_TOUCH_X_MeasureX(), GUI_TOUCH_X_MeasureY()函数中返回触摸屏X轴和Y轴物理测量值即可。

还有一个十分重要的函数GUI_TOUCH_Exec(),这个函数需要定期调用已更新触摸屏的输出值。这个函数会在执行期间调用GUI_TOUCH_X_ActivateX(), GUI_TOUCH_X_ActivateY(),GUI_TOUCH_X_MeasureX(), GUI_TOUCH_X_MeasureY()四个函数来获取触摸屏X轴和Y轴物理测量值,然后根据GUI_TOUCH_Calibrate()校准后的参数进行触摸坐标的物理值和逻辑值的转换。然会把坐标的逻辑值存储在emWIN系统中。所以在触摸屏初始化时,需要调用GUI_TOUCH_Calibrate()函数进行校准。

GUI_TOUCH_Exec()可以放在系统节拍定时器或者普通定时器的中断函数中,至少应每10ms调用一次,利用查询的方式对触摸坐标进行更新;也可以放在触摸屏的外部中中断函数中,及时的对触摸坐标进行更新。

根据NXP官方例程中已有的触屏驱动,只要对其修改即可。项目中HW_X_Config()对系统节拍时钟进行了初始化,并使能了中断,每1ms中断一次。

touch1 项目中是通过系统节拍SysTick对GUI_TOUCH_Exec()进行调用,GUI_TOUCH_Exec()在ExecTouch()函数中,所以修改ExecTouch()函数即可。ExecTouch()在LCDconf.c中。

touch2

ExecTouch()中只需要把_CheckUpdateTouch()函数改成自己获取X轴和Y轴物理值的驱动即可,同时删除_SSP_SendCmd(PWRDOWN);

touch4

由于在ExecTouch()函数中调用了获取X轴和Y轴物理值的驱动函数,并且存储在了全局变量_TouchX和_TouchY中,所以在GUI_TOUCH_X_MeasureX()和GUI_TOUCH_X_MeasureY()中只需要返回变量_TouchX和_TouchY的值即可。

下面只剩下最后一步,对触屏进行校准,以找到触屏坐标物理值和逻辑值的对应关系。

找到LCD_X_DisplayDriver中调用的_InitController函数,接触在移植LCD驱动时对_InitTouch()函数的注释,并对_InitTouch()函数进行修改。修改为

TOUCH_BOARD_800_480_AD_LEFT,TOUCH_BOARD_800_480_AD_RIGHT,TOUCH_BOARD_800_480_AD_TOP,TOUCH_BOARD_800_480_AD_BOTTOM值可以根据NXP_emWin522_BSP\Start\Sample\Tutorial目录下的TOUCH_Sample.c测得。

touch5

然后在主程序或者_InitTouch函数中加入触摸屏驱动初始化函数,这样emWIN的触摸屏驱动就移植完成了。

touch3 测试了一下,触屏正常。

touch6