-
:handshake 我理解楼主,我也用过STM8S103F3P6芯片,PF6 - PF7引脚,当PF6输出为1时,PF7也为1 ,我怀疑是芯片出厂时根本就没有进行全部测试,或者说芯片设计就存在问题,最好的办法就是不用PF6、PF7二个引脚,最好换其它芯片了。
-
:P 奖品不错,这样的活动多多支持
-
:kiss: 自己顶一下,哈哈:lol
-
:) C:\StellarisWare\boards\ek-lm3s8962
当然要在库路径下才能找到文件哦,我是放在C盘
-
我在这里要说明的是,前面的LED处理与PWM处理程序 只是改变了相关变量使 相关引脚反复切换状来控制LED的开/关,或者是改变切换的频率及占空比来控制PWM(即 蜂鸣器的驱动频率及占空比),这样可以改变 蜂鸣器的声音。
重点介绍的是红色部分程序:FS_ROOT 是一个 所有网页与图片数据 名称的结构体变量。
程序中 name 为要找的一个网页或者图片的 名称,然后程序中对 结构体变量中的所有的相关名称进行一一对比,如果name与相关名称相同,则把 FS_ROOT 结构体中的 子结构体变量的数据 赋值 给 ptFile 结构体变量。这样就达到了以名称name来寻找相关网页与图片数据的目的。
const struct fsdata_file file_block_htm[] =
{
{ file_family_htm,
data_block_htm,
data_block_htm + 11,
sizeof(data_block_htm) - 11
}};
const struct fsdata_file file_404_htm[] =
{
{ file_block_htm,
data_404_htm,
data_404_htm + 9,
sizeof(data_404_htm) - 9
}};
大家从上面的结构体中看出了什么?我们会发现这是一个嵌套的结构体,这样的目的也许是方便我们寻找相关文件及其相关数据。
系列三 就暂时讲述到这里了,如果上面表达不清楚或描述欠妥的地方请大家谅解,并回贴提出建议及改过方案。谢谢大家!
-
// 设置PWM的占空比
io_pwm_dutycycle(ustrtoul(g_cSampleTextBuffer,NULL,10));
// Setup the file structure to return whatever.
ptFile->data = NULL;
ptFile->len = 0;
ptFile->index = 0;
ptFile->pextension = NULL;
// 返回系统指针.
return(ptFile);
}
//检查LED的开关状态?
if(strncmp(name, "/ledstate?id", 12) == 0)
{
static char pcBuf[4];
//获取LED的状态
io_get_ledstate(pcBuf, 4);
ptFile->data = pcBuf;
ptFile->len = strlen(pcBuf);
ptFile->index = ptFile->len;
ptFile->pextension = NULL;
return(ptFile);
}
// 检查PWM的频率状态?
if(strncmp(name, "/pwmstate?id", 12) == 0)
{
static char pcBuf[4];
// 获得PWM的状态
io_get_pwmstate(pcBuf, 4);
ptFile->data = pcBuf;
ptFile->len = strlen(pcBuf);
ptFile->index = ptFile->len;
ptFile->pextension = NULL;
return(ptFile);
}
// Request PWM Frequency?
if(strncmp(name, "/pwmfreqget?id", 14) == 0)
{
static char pcBuf[16];
// Get the frequency of the PWM
usprintf(pcBuf,"%d",io_get_pwmfreq());
ptFile->data = pcBuf;
ptFile->len = strlen(pcBuf);
ptFile->index = ptFile->len;
ptFile->pextension = NULL;
return(ptFile);
}
// 检查PWM的占空比?
if(strncmp(name, "/pwmdutycycleget?id", 19) == 0)
{
static char pcBuf[16];
// 获得PWM的占空比
usprintf(pcBuf,"%d",io_get_pwmdutycycle());
ptFile->data = pcBuf;
ptFile->len = strlen(pcBuf);
ptFile->index = ptFile->len;
ptFile->pextension = NULL;
return(ptFile);
}
else
{
/*00 把全部网页名称 都 赋值给 ptTree 变量 ,以便下面的 名称 比较*/ ptTree = FS_ROOT;
/* 检查 网页名称 不为 NULL */ while(NULL != ptTree)
{
/*01 当输入的 NAME 变量不是上面的任何一个情况时,则为一个网页名称.
// 于是就和 网页名称 数组 进行全部比较,如果是其中一个网页名称则进入如下程序*/
if(strncmp(name, (char *)ptTree->name, ptTree->len) == 0)
{
ptFile->data = (char *)ptTree->data;
ptFile->len = ptTree->len;
ptFile->index = ptTree->len;
ptFile->pextension = NULL;
// 退出循环,返回系统文件.
/* 02 执行完上面的程序后说明 NAME 的相关操作已经得到 数据处理 直接退出即可 */
break;
}
/*01 否则就将下一个网页名称赋值给ptTree回到上面的while(NULL != ptTree) 进行比较是否相同*/
ptTree = ptTree->next;
/*03 其中 next 就为网页 的 名称 指针,用 NEXT 来代替 名称 方便 编程 */
}
}
/* 检查 通过 处理后(也有可能没有得到数据,也就没有进入过循环) 的数据 是否为空 */ if(NULL == ptTree)
{
mem_free(ptFile);
ptFile = NULL;
}
/* 返回得到 数据 或 为 空的 ptFile 变量*/ return(ptFile);
}
-
// 处理PWM 频率更新
if(strncmp(name, "/pwm_freq?value=", 16) == 0)
{
// Get Frequency String
data = name;
data += 16;
i = 0;
do
{
switch(data)
{
case 0:
case '&':
g_cSampleTextBuffer = 0;
break;
case '+':
g_cSampleTextBuffer = ' ';
break;
default:
g_cSampleTextBuffer = data;
break;
}
if(g_cSampleTextBuffer == 0)
{
break;
}
i++;
}while(i < sizeof(g_cSampleTextBuffer));
// 设置PWM频率
io_pwm_freq(ustrtoul(g_cSampleTextBuffer,NULL,10));
// Setup the file structure to return whatever.
ptFile->data = NULL;
ptFile->len = 0;
ptFile->index = 0;
ptFile->pextension = NULL;
// 返回系统文件指针。
return(ptFile);
}
// 处理PWM占空比的更新
if(strncmp(name, "/pwm_dutycycle?value=", 21) == 0)
{
// 得到占空比字符串
data = name;
data += 21;
i = 0;
do
{
switch(data)
{
case 0:
case '&':
g_cSampleTextBuffer = 0;
break;
case '+':
g_cSampleTextBuffer = ' ';
break;
default:
g_cSampleTextBuffer = data;
break;
}
if(g_cSampleTextBuffer == 0)
{
break;
}
i++;
}while(i < sizeof(g_cSampleTextBuffer));
-
二、具体介绍
1、这个例程仿照了 enet_io 例程的过程,不过我在这里主要是讲述一下我自己的学习经验,以及如何进行类似的操作:
例程中同样采用了直接给 ulUser0=0x5555aaaa;ulUser1=0x5555aaaa; 赋值的办法
它的赋值规则在 Luminary Micro?Flash Programmer-Build 776 中也有介绍:
如果 MAC 地址是:00-1A-B6-00-02-74 话,则 ulUser0=0x00B61A00 ; ulUser1=0x00740200;
例程中: lwIPInit(pucMACArray, 0xC0A80164, 0xffffff00, 0xC0A80101, IPADDR_USE_STATIC);
这条语句是设置 MAC 地址、子网掩码的、网关地址。其中网关地址 可设置为 0 也不会影响正常的网络通讯。关于电脑的本地连接上的设置,大家可以参考前面我写的《基于LM3S8962以太网的简单TFTP的服务器学习系列一》PDF 文档。
2、这里我具体分析一下 lmi_fs.c 这个C文件:
struct fs_file *
fs_open(char *name)
{
char *data;
int i;
const struct fsdata_file *ptTree;
struct fs_file *ptFile = NULL;
/*分派内存给文件系统 */
ptFile = mem_malloc(sizeof(struct fs_file));
if(NULL == ptFile)
{
return(NULL);
}
/* 19代表字符串长度*/
if(strncmp(name, "/cgi-bin/toggle_led", 19) == 0)
{
io_set_led(!io_is_led_on());
ptFile->data = NULL;
ptFile->len = 0;
ptFile->index = 0;
ptFile->pextension = NULL;
return(ptFile);
}
// 处理PWM ON/OFF状态的请求
if(strncmp(name, "/cgi-bin/pwm_onoff", 18) == 0)
{
io_set_pwm(!io_is_pwm_on());
ptFile->data = NULL;
ptFile->len = 0;
ptFile->index = 0;
ptFile->pextension = NULL;
return(ptFile); }
-
:P 顶楼主
-
:handshake 上传分享成果总值得赞扬,呵呵:congratulate:
-
:D 我来顶一个,祝贺各位了:P :pleased:
-
;P GOOD,楼主太无私 了
-
:time: 不错,呵呵,支持一下:D
-
楼主太佩服你了:congratulate:
-
:handshake
-
;P 太强了,多谢了
-
:kiss: 这个概念我不懂,看一下了
-
:) 当然要支持了
-
:funk: 太强了
-
谢谢分享,这个很强大:kiss: