当前位置:文档之家› 单片机界联网UIP如何实现tcp与udp协议

单片机界联网UIP如何实现tcp与udp协议

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率
static u8 timer_ok=0;
if(timer_ok==0)//仅初始化一次
{
timer_ok = 1;
timer_set(//创建1个0.5秒的定时器
timer_set(//创建1个10秒的定时器
{
uip_timer++;//uip计时器增加1
}
TIM_ClearITPendingBit(TIM6,TIM_IT_Update); //清除TIMx的中断待处理位:TIM中断源
}
//基本定时器6中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
#endif /* __CLOCK_ARCH_H__ */
上面是100,也就是说定时器的长度应该是10MS
接下来是配置回调函数
//uip事件处理函数
//必须将该函数插入用户主循环,循环调用。
void uip_polling(void)
{
u8 i;
static struct timer periodic_timer,arp_timer;
{
u8 i,res=0;
res=ENC28J60_Init((u8*)macaddr); //初始化ENC28J60
//把IP地址和MAC地址写入缓存区
for(i = 0; i《6; i++)uip_ethaddr.addr[i]=macaddr[i];
//指示灯状态:0x476 is PHLCON LEDA(绿)=links status,LEDB(红)=receive/transmit
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM6,//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
单片机界联网UIP如何实现tcp与udp协议
UIP是单片机界联网的一个很好地选择,移植这个库有点复杂,首先是第一步,网卡驱动要写好,使用的网卡芯片为ENC28J60,驱动可以再工程包里面找到
//配置网卡硬件,并设置MAC地址
//返回值:0,正常;1,失败;
u8 tapdev_init(u8* macaddr)
clock_TIme(void)
{
return uip_TImer; /* 10ms单位*/
}
u32 uip_TImer=0;//uip计时器,每10ms增加1.
//定时器6中断服务程序
TIM6_IRQHandler(void)
{ if(TIM_GetITStatus(TIM6,TIM_IT_Update)!= RESET)//检查指定的TIM中断发生与否:TIM中断源
//PHLCON:PHY模块LED控制寄存器
ENC28J60_PHY_Write(PHLCON,0x0476);
return res;
}
//读取一包数据
uint16_t tapdev_read(void)
{
return ENC28J60_Packet_Receive(MAX_FRAMELEN,uip_buf);
}
//发送一包数据
void tapdev_send(void)
{
ENC28J60_Packet_Send(uip_len,uip_buf);
}
分别是初始化,读,写
这些驱动会在一个叫做uip_call的函数中用到,其次,要设置uip的时钟,这个时钟适用于arp表的更新的
#include“clock-arch.h”
//这里使用的是定时器3!
void TIM6_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); //时钟使能
TIM_ITConfig(TIM6,TIM_IT_Update|TIM_IT_Trigger,ENABLE);//使能定时器6更新触发中断
TIM_Cmd(TIM6,ENABLE); //使能TIMx外设
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //TIM3中断
NVIC_Init(//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
定时器的定时长度取决于这个宏定义
#ifndef __CLOCK_ARCH_H__
#define __CLOCK_ARCH_H__
typedef int clock_time_t;
#define CLOCK_CONF_SECOND 100
#include“sys.h”
//时钟驱动文件,
//uip时钟
extern u32 uip_timer;//uip计时器,每10ms增加1.
/*---------------------------------------------------------------------------*/
clock_TIme_t
相关主题