UDP packages make my MCU reset
Hello,
I wrote this code to send each 100us a 16bytes to PC. (STM32f10x)
int32_t socket;
uint8_t *sendbuf;
void Time3(void){
TIM_TimeBaseInitTypeDef TimeStruct;
NVIC_InitTypeDef nvicStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
nvicStructure.NVIC_IRQChannel = TIM3_IRQn;
nvicStructure.NVIC_IRQChannelPreemptionPriority =1;
nvicStructure.NVIC_IRQChannelSubPriority = 0;
nvicStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvicStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TimeStruct.TIM_Prescaler=35;
TimeStruct.TIM_Period=200; ///200=100us
TimeStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TimeStruct.TIM_CounterMode= TIM_CounterMode_Up ;
TIM_TimeBaseInit(TIM3, &TimeStruct);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
}
/*###########################################
##############Main Function##################
###########################################*/
void SetSCK(){
socket = netUDP_GetSocket(udp_cb_func);
if (socket >= 0)
{
netUDP_Open(socket,0);
netUDP_SetOption (socket, netUDP_OptionTTL, 20);
}
}
int main (void){
CLOCK();
GPIO_SetBits(GPIOA,GPIO_Pin_5);
LongDelay();
netInitialize();
LongDelay();
Time3();
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
do {
osDelay(500U);
netIF_GetOption(NET_IF_CLASS_ETH | 0, netIF_OptionIP4_Address, (uint8_t *)&addr, sizeof (addr));
} while (addr == 0U);
SetSCK();
Watch();
while (1)
{
if(Alarm==1)
{
Alarm=0;
Ethers();
}
if(CheckAlarm>2)
{
netUDP_Close (socket);
netUDP_ReleaseSocket (socket);
SetSCK();
CheckAlarm=0;
}
IWDG_ReloadCounter();
}
}
void Ethers(void){
NET_ADDR addrUDP={ NET_ADDR_IP4, 5022, 192, 168,1,10};
if(socket>=0){
CheckAlarm=0;
Data();
sendbuf = netUDP_GetBuffer (Ether.Size);
memcpy (sendbuf, MSG, Ether.Size);
State=netUDP_Send (socket,&addrUDP,sendbuf,Ether.Size);
}
void TIM3_IRQHandler(){
CheckAlarm=CheckAlarm+1;
Alarm=1;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
void Watch(void){
NVIC_InitTypeDef nvicStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
nvicStructure.NVIC_IRQChannel = WWDG_IRQn;
nvicStructure.NVIC_IRQChannelPreemptionPriority = 2;
nvicStructure.NVIC_IRQChannelSubPriority = 2;
nvicStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvicStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
IWDG_SetPrescaler(IWDG_Prescaler_32);
IWDG_SetReload(200);
IWDG_Enable();
}
After some seconds/minutes my MCU get rested( I receive correct data before and after resting). It makes me crazy. I can't understand why?
I call SetSCK() when after 300us socket is failed(Socket<0). what is my mistake?
In addition in some situations while I am receiving the correct data, my mcu doesn't respond to ping command.(I have set the IP at Net_Config_ETH file).

