tag 标签: uc-os-iii

相关博文
  • 热度 13
    2012-3-6 14:46
    1947 次阅读|
    1 个评论
      基于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开发板硬件框图   平台的部分硬件特性: 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差异   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 =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的部分不太熟悉,还好,参照网上的部分代码和规格书,很快就搞定了,秀一下成果   网络控制界面   网络的控制没有问题了,下一步开始把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。   秀一下最终图片   2012-2-1 提供WEB控制SLCD显示字符及开关SLCD的显示视频见附件。 系统连接在wifi路由器上,通过电脑无线网络控制,也可以使用带wifi模块的手机控制。   小结:到此,整个项目已经完成。 单片机系统通过扩展网络模块,可以让开发者更好的利用网络来使用系统资源,给终端用户提供人性化,便利化的完美用户体验。本文只是使用网络来远程控制LCD的显示,在此基础平台上可以开发出更多的终端应用,比如简单的远程控制系统,远程监测测量等等。   END 前段时间申请了freescale的K40开发板,整理了点学习笔记,比较凌乱。 相关内容见链接,呵呵,本人最近刚申请嵌入式系统与软件的版主,希望大家多多关照哦。 http://bbs.ednchina.com/FORUM_POST_17_508191_0.HTM