基于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[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的部分不太熟悉,还好,参照网上的部分代码和规格书,很快就搞定了,秀一下成果
网络控制界面
网络的控制没有问题了,下一步开始把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开发板,整理了点学习笔记,比较凌乱。
相关内容见链接,呵呵,本人最近刚申请嵌入式系统与软件的版主,希望大家多多关照哦。
用户403664 2012-3-26 17:23