基于Kinetis的简单webserver(五篇连载)——转帖
项目描述项目名称基于Kinetis的简单webserver
预计实施时间2011-12-22
采用平台K40
是否需要Kinetis塔式开发板(K40)特别支持是
设计大赛将为没有开发工具的网友,提供200个开发板支持名额,提供Kinetis K40塔式开发板一个,供网友完成设计。特别声明:开发板资源有限,如申请到开发板却又不能按计划完成设计,请联系工作人员退还开发板,我们将把开发板的名额顺延给更多的网友。请大家珍惜有限资源,为同道朋友提供更多机会。
背景描述近年来,物联网应用越来越普及,单片机控制系统实现远程网络控制成为趋势。
功能描述webserver的实现可以充分利用网络(有线或者无线)来控制单片机系统,为单片机的控制或采集数据等提供便利性,灵活性。
应用领域电子显示屏远程网络控制,家居电子设备远程控制等等。
解决办法使用单片机扩展简单的网络接口芯片,常见的ENC28J60
预期效果远程控制LCD的字符显示,更新等.
时间安排2011.12.31-2012.1.31Freesecal Kinetis平台软硬件学习
2012.2.1- 2012.2.29 基本功能实现
2012.3.1-2012.3.30扩展功能实现
总结
备注需要完整的软硬件平台调试
K40平台软硬件学习
K40开发板硬件框图
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930283897.jpg
平台的部分硬件特性:a.Cortex-M4核+DSP指令;b.最高100Mz主频;c.1.71-3.6V供电电压;d.256KB FLASH+64KB SRAM;e.256KB FlexNVM+4KB FlexRAM;f.10种电源模式;g.16-bit SAR ADC,12-bit DAC;h.USB OTG,充电检测;i.SPI,I2C,UART,CAN,I2S,T卡;j.电容触摸输入;
2012-1-18K40和K60的功能差异:红色标记为K60特有,蓝色为LCD差异
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930321935.jpg
2012-1-192012-1-20Micrium官方提供的K40-uc-OS-III和K60-uc-OS-II编译没有问题,准备用其中之一版本来做,首先把freescale官方的demo移植到其中之一;
试验先把LCD移植到uc-OS上,来回折腾了近两天,在K40-uc-OS-III版本上都没有问题了,但是在K60-uc-OS-II的版本上掉电再重启后,没有显示了,还没搞清哪边有问题,暂不搞了,确定下来先在K40-uc-OS-III的版本上来做。期间折腾的主要问题是,LCD的显示效果,直接从freescale demo软件包拷贝过来的LCD初始化代码,移植到uc-OS后显示效果就是没有demo的效果好,最终把LCD_GCR的部分位挨个试验,确认改成5V后,OK。而这一修改是在K60-uc-OS-II上试验出来的,K40-uc-OS-III上没发现,于是,又在这两个版本上徘徊了大半天。LCD的规格书上写的又是3V驱动,奇怪,坑爹啊。 | LCD_GCR_HREFSEL_MASK // ( 0 - 3 Volts LCDs / 1 - 5 Volts LCDs)
2012-1-29增加ENC28J60网络模块进行调试,根据原理图选用T卡部分的GPIO来连接ENC28J60,具体连接如下,其余就只连3.3V电源和地/********************************************************************* Hardware : CONNECTION K40x256 -> Enc28j60 PTD 12( SCLK ) SCK PTD 13( MISO ) SO PTD 14( MOSI ) SI PTD 15( CS ) CS# *********************************************************************/具体方案是采用GPIO来模拟SPI通信,虽然K40本身是带SPI控制器的,但是这个很不熟悉,暂时还是使用之前成熟的GPIO来模拟部分关键代码如下
#define PORTD_GPIO_PTR((GPIO_MemMapPtr)0x400ff0c0u) //定义PTD的基地址
//通过PDOR寄存器的设定来设置GPIO输出高还是低#define set_clk_hGPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x1000 #define set_sdo_hGPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x4000 #define set_cs_h GPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x8000
#define set_clk_lGPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x1000)#define set_sdo_lGPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x4000)#define set_cs_l GPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x8000)
//通过读PDIR寄存器,读PTD13的输入#define get_sdi (GPIO_PDIR_REG(PORTD_GPIO_PTR) & 0x2000) //
初始化GPIO,模拟SPI总线void spi_init(void) { // use PORTD 12,13,14,15 to emulate SPI function
//configure as GPIO function PORTD_PCR12= PORT_PCR_MUX(1); PORTD_PCR13= PORT_PCR_MUX(1); PORTD_PCR14= PORT_PCR_MUX(1); PORTD_PCR15= PORT_PCR_MUX(1);
GPIO_PDDR_REG(PORTD_GPIO_PTR) |= 0xD000; //bit=1101 GPIO_PDDR_REG(PORTD_GPIO_PTR) &= ~(0x2000); //make sure to set bit 13=0,may be commented ;
}
关键的SPI读和写代码void WriteByte(uint8_t data){ unsigned char i = 0; unsigned char byte_mask = 0x80; unsigned char tx_byte = data;
set_cs_l;for(i = 0; i < 8; i++){set_clk_l;delay(1); //about 4uS if(tx_byte & byte_mask) {set_sdo_h; } else {set_sdo_l; }delay(1);set_clk_h; tx_byte = tx_byte << 1;delay(1);}set_clk_l;}
uint8_t ReadByte(void){unsigned char i = 0;uint8_t data=0;set_clk_l; for(i = 0; i < 8; i++) {set_clk_h;delay(1); data = data << 1;if(get_sdi) { data |= 0x01;//get HIGH } else { data |= 0x00;//get LOW }delay(1);set_clk_l;delay(1); }return data;}
ENC28J60部分的模块,参照网上的,基本没有改动,把参考代码中的main函数,依照uc-OS-III的格式改写成任务函数,并且在点灯的部分改成点LCD(LCD的初始化及显示所有内容已经移植好),之间主要就是K40操作GPIO的部分不太熟悉,还好,参照网上的部分代码和规格书,很快就搞定了,秀一下成果
网络控制界面
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930362302.jpg
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930383233.jpg
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930402749.jpg
网络的控制没有问题了,下一步开始把SLCD的其它功能函数移植进去,字符的显示,滚动效果等等。
2012-1-30开始移植SLCD的其它功能函数这一步更简单了,直接将Kwikstik_Demo中的Driver_SLCD.h,Driver_SLCD.c,Fonts_LCD.c,Fonts_LCD.h拷贝过来,重定义下数据类型的转定义编译后没有问题了整理下软件代码结构,在uc-OS-III的根目录下创建Drivers文件夹和Net文件夹,把驱动文件都移到Drivers目录下,ENC28J60部分的放到Net目录下。方便后续代码的完善,增强代码的可读性。
2012-1-31参照http://tuxgraphics.org/electronics/200702/article07021.shtml 上的代码,整合web控制往LCD写字符显示。最初总是执行到app_vect.c的staticvoidApp_Fault_ISR (void)中,死循环,看函数好像跟应用有关,模拟器执行也是一样的,后来单步执行,最终发现是调用的_SLCDModule_PrintScrolling(char *SourceString)函数有问题,屏蔽掉后,OK。
秀一下最终图片
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930438319.jpg
2012-2-1提供WEB控制SLCD显示字符及开关SLCD的显示视频见附件。系统连接在wifi路由器上,通过电脑无线网络控制,也可以使用带wifi模块的手机控制。
小结:到此,整个项目已经完成。单片机系统通过扩展网络模块,可以让开发者更好的利用网络来使用系统资源,给终端用户提供人性化,便利化的完美用户体验。本文只是使用网络来远程控制LCD的显示,在此基础平台上可以开发出更多的终端应用,比如简单的远程控制系统,远程监测测量等等。
END
如果是使用ENC28J60
那么程序基本与Kinetis关系不大
设置好IO口,模拟SPI时序,能读写ENC28J60就可以了 又见楼主转帖 楼主辛苦了,转这么多好资料来 楼主辛苦了。 顶lz 感谢楼主分享,这东西感觉蛮好玩。 高人贴,顶一下! mark
页:
[1]