关于EEPROM读写,小弟很是疑惑

2019-07-20 19:38发布

本帖最后由 liuchang 于 2016-10-10 11:45 编辑

小弟这几天在玩stm32F4(探索者F4,MDK5,上ucosii操作系统)上自带的EEPROM(AT24C02).对其中的读写函数,小弟有几个疑惑,恳请大神指教~~~
1>现象1: 这是一个tcp client线程
[mw_shl_code=c,true]void tcp_client_thread(void *arg)
{        
        struct netconn *conn;
        struct lwip_info info;
        struct ip_addr server_ip;
        uint8_t RecvBuf[6] = {0};
        uint8_t System_Par_Temp_Buf[55];
        uint8_t str_ip[16] = {0}, str_port[16] = {0};
        
        Address_Init();
        LED_Init();        
        LCD1602_Init();
        LCD1602_Clear();
        delay_ms(30); //经过试验验证:这里必须delay 30ms或者以上,AT24CXX_Read()才能将数据读到System_Par_Temp_Buf中
        AT24CXX_Read(0, System_Par_Temp_Buf, 55);
        StringToNum(&info, System_Par_Temp_Buf);
        StringToLCD1602(str_ip, str_port, System_Par_Temp_Buf);        
        LCD1602_WriteString(0, 0, (char *)str_ip);        
        LCD1602_WriteString(0, 1, (char *)str_port);
               
        while(1)
        {        
                err_t connect_err;
                err_t recv_err;
                struct netbuf *inbuf;
               
                if(OSSemAccept(sem_server_reset) || OSSemAccept(sem_server_config))
                {
                        //delay_ms(30); //这里不需要使用delay(),AT24CXX_Read()就能将数据读到System_Par_Temp_Buf,为什么???
                        AT24CXX_Read(0, System_Par_Temp_Buf, 55);
                        StringToNum(&info, System_Par_Temp_Buf);
                        StringToLCD1602(str_ip, str_port, System_Par_Temp_Buf);        [/mw_shl_code]

现象2:这是另外一个线程
[mw_shl_code=c,true]void lwip_reset_thread(void *p_arg)
{
        OS_CPU_SR cpu_sr;
        while(1)
        {
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) //reload°′¼ü±»°′ÏÂ,»Ö¸′3ö3§éèÖÃ
                {                                                            
                        OSTimeDlyHMSM(0, 0, 3, 0);                                                                              
                        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
                        {        
                               //OS_ENTER_CRITICAL();
                                AT24CXX_Write(0, System_Par_Init_Buf, 55);                                //经过试验,这里不能使用OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); 否则,AT24CXX_Write()写入System_Par_Init_Buf的数据就会有错误,我实在想不通为什么,恳请大神指教
                                //OS_EXIT_CRITICAL();
                                IP4_ADDR(&ipaddr,  info.local_ip[0], info.local_ip[1], info.local_ip[2], info.local_ip[3]);
                                IP4_ADDR(&netmask, info.netmask[0], info.netmask[1], info.netmask[2], info.netmask[3]);
                                IP4_ADDR(&gateway, info.gateway[0],  info.gateway[1],  info.gateway[2],  info.gateway[3]);                       }
                 }
        }
}[/mw_shl_code]



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。