原创 【原创】基于Kinetis的简单webserver

2012-3-6 14:46 1953 12 13 分类: MCU/ 嵌入式

 

基于Kinetis的简单webserver

tziang@hotmail.com

 

2012-1-17

Kick off

项目描述

项目名称

  基于Kinetis的简单webserver

预计实施时间

  2011-12-22

采用平台

  K40

是否需要Kinetis塔式开发板(K40)特别支持

设计大赛将为没有开发工具的网友,提供200个开发板支持名额,提供Kinetis K40塔式开发板一个,供网友完成设计。

特别声明:开发板资源有限,如申请到开发板却又不能按计划完成设计,请联系工作人员退还开发板,我们将把开发板的名额顺延给更多的网友。请大家珍惜有限资源,为同道朋友提供更多机会。

背景描述

  近年来,物联网应用越来越普及,单片机控制系统实现远程网络控制成为趋势。

 

功能描述

  webserver的实现可以充分利用网络(有线或者无线)来控制单片机系统,为单片机的控制或采集数据等提供便利性,灵活性。

 

应用领域

  电子显示屏远程网络控制,家居电子设备远程控制等等。

解决办法

  使用单片机扩展简单的网络接口芯片,常见的ENC28J60

 

预期效果

  远程控制LCD的字符显示,更新等. 

 

时间安排

2011.12.31-2012.1.31

  Freesecal Kinetis平台软硬件学习

2012.2.1- 2012.2.29 

  基本功能实现

2012.3.1-2012.3.30

  扩展功能实现

总结

 

备注

  需要完整的软硬件平台调试

 

 

K40平台软硬件学习

 

K40开发板硬件框图

 

图片6.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-18

K40和K60的功能差异:红色标记为K60特有,蓝色为LCD差异

 

图片7.jpg

2012-1-19

2012-1-20

Micrium官方提供的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_h  GPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x1000        

#define set_sdo_h  GPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x4000        

#define set_cs_h   GPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x8000 

 

#define set_clk_l  GPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x1000)

#define set_sdo_l  GPIO_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[15:12]=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的部分不太熟悉,还好,参照网上的部分代码和规格书,很快就搞定了,秀一下成果

 

网络控制界面

 

图片8.jpg
图片9.jpg
图片10.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的static  void  App_Fault_ISR (void)中,死循环,看函数好像跟应用有关,模拟器执行也是一样的,后来单步执行,最终发现是调用的

_SLCDModule_PrintScrolling(char *  SourceString)函数有问题,屏蔽掉后,OK。

 

秀一下最终图片

 

图片11.jpg

2012-2-1

提供WEB控制SLCD显示字符及开关SLCD的显示视频见附件。

系统连接在wifi路由器上,通过电脑无线网络控制,也可以使用带wifi模块的手机控制。

 

小结:到此,整个项目已经完成。

单片机系统通过扩展网络模块,可以让开发者更好的利用网络来使用系统资源,给终端用户提供人性化,便利化的完美用户体验。本文只是使用网络来远程控制LCD的显示,在此基础平台上可以开发出更多的终端应用,比如简单的远程控制系统,远程监测测量等等。

 

END

前段时间申请了freescale的K40开发板,整理了点学习笔记,比较凌乱。

相关内容见链接,呵呵,本人最近刚申请嵌入式系统与软件的版主,希望大家多多关照哦。

http://bbs.ednchina.com/FORUM_POST_17_508191_0.HTM

文章评论1条评论)

登录后参与讨论

用户403664 2012-3-26 17:23

感谢感谢 !
相关推荐阅读
pinuoelec 2017-06-03 13:34
CC3D有刷小飞机(3)-设置指南
1.CC3D有刷设置 1.1.CC3D有刷飞控软件升级 推荐使用dronin或者Taulabs固件,dronin和Taulabs针对有刷电机将飞控的PWM输出进行过优化调节。具体参照dronin或者T...
pinuoelec 2017-05-31 10:56
CC3D有刷小飞机(2)
1.CC3D有刷飞控简介 CC3D有刷飞控是在openpilot的Atom基础上进行的重构设计,主要针对有刷小四轴进行部分电路优化。 1.1.CC3D有刷飞控尺寸及实物图片 采用4层板PCB设计,长宽...
pinuoelec 2017-05-28 10:41
CC3D有刷小飞机(1)
最近,好像飞行器管控越来越严了。超过 250g都要登记,申报飞行等等。大家还是遵纪守法吧,玩玩有刷小飞行器吧。 从 今天 开始,准备把去年做的有刷飞控,分享出来,抛砖引玉。 整机才28g,不超重,而...
pinuoelec 2015-07-03 09:30
给直升机电调刷BLHELI固件参考步骤
其实Blheli固件一开始就是为直升机电调设计的    Atmel芯片电调BLHeli固件升级步骤参考   xfce@sina.com QQ:1626607998 2015...
pinuoelec 2015-07-03 08:57
性感的V尾四轴
好久没折腾了 重新安装了V-TAIL         第一次试飞视频    ...
pinuoelec 2015-07-03 08:51
直升机斜盘调试完成了
周末把直升机斜盘调试了, 遥控螺距摇杆最小,最大,中间摇杆时,斜盘保持水平就差不多了 看看简单的视频测试  ...
我要评论
1
12
关闭 站长推荐上一条 /2 下一条