|
楼主 |
发表于 2021-4-25 22:53:41
|
显示全部楼层
本帖最后由 liuxiaofei 于 2021-4-27 10:56 编辑
单片机这块采用STM32F103V8T6,程序简单分析一下看主函数初始化,源码已上传,可以参考
- int main(void)
- {
- //Systick_Init (72); // MCU时钟初始化
- RCC_Configuration(); //系统时钟
- //IWDG_Init(4,1250); //与分频数为64,重载值为1250,溢出时间为2s
- delay_ms(500);
- EEP_init(); //初始化EEProm,读取参数
- GPIO_Config(); //端口初始化
- CAN_Config(); //can通讯初始化
- GPIO_Configuration();
- Timer_Configuration(); // 定时器初始化
- NVIC_Configuration(); //中断优先级设定初始化
- ADE7758_IOINIT1(); //ADE7758管脚初始化
- ADE_AdjustSaveData(); //功能:保存校准数据
- ADE_Init();//初始化
- //TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
- uart_init(9600); //串口初始化
- DHT11_Init(); //温湿度传感器初始化
- //SPI1
- WIZ_SPI_Init(); // SPI初始化
- Reset_W5200(); // 硬重启W5500
- STMFLASH_Read(FLASH_SAVE_ADDR,eep_read,20); /*读取存储值 */
- set_network(); // 设置W5200的初始化IP信息
- GUI_init();//初始化屏状态
复制代码 存储数据这块采用单片机内部的flash,比如存储柜门的开门记录,报警记录等数据。以太网芯片W5200采用SPI通信,可以通过网络连接电脑来监控机柜状态。还有一个就是电能计量计ADE7758初始化,主要功能
- 高精度;支持IEC 60687、IEC 61036、IEC 61268、IEC 62053-21、IEC 62053-22和IEC 62053-23标准
- 兼容三相三线、三相四线及其它三相服务
- 25°C时,在1000:1的动态范围内有功电能误差小于0.1%
- 电源有功/无功/视在电能、电压均方根、电流均方根和采样波形数据
- 两个脉冲输出,其中一个用于有功功率,而另一个可通过可编程的频率在无功功率和视在功率之间选择
- 数字功率、相位和均方根失调校准
- 片内、用户可编程阈值,用于线路电压SAG和过压检测
一、分析以太网这块程序
1.设置W5200的初始化IP信息
- void set_network(void)
- {
- uint8 mac[6]={0x00,0x08,0xdc,0x01,0x02,0x03};
- uint8 sub[4]={255,255,255,0};
- uint8 gw[4]={192,168,1,1};
- uint8 lip[4];//={192,168,1,100};
- uint8 tmp[6]={0x00,};
- lip[0]=eep_read[6];
- lip[1]=eep_read[7];
- lip[2]=eep_read[8];
- lip[3]=eep_read[9];
- setSIPR(lip);
- setSHAR(mac);
- setSUBR(sub);
- setGAR(gw);
-
-
- //Init. TX & RX Memory size
- sysinit(txsize, rxsize);
-
- setRTR(2000);
- setRCR(3);
-
- getSHAR(tmp);
- // printf("mac: %02x:%02x:%02x:%02x:%02x:%02x\r\n",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],tmp[5]);
- getSIPR(tmp);
- // printf("ip: %d.%d.%d.%d\r\n",tmp[0],tmp[1],tmp[2],tmp[3]);
- getSUBR(tmp);
- //printf("subnet: %d.%d.%d.%d\r\n",tmp[0],tmp[1],tmp[2],tmp[3]);
- getGAR(tmp);
- // printf("gateway: %d.%d.%d.%d\r\n",tmp[0],tmp[1],tmp[2],tmp[3]);
- }
复制代码 2.TCP发送数据
- //TCP/IP_Modbus发送数据
- void TCP_SendDATA(void)
- {
-
- //if(Tcp_ip_connec_flag==1)
- // {
- // Tcp_ip_connec_flag=0;
- // socket(0, Sn_MR_TCP, 5000, 0x00); // 重新打开Socket //重启Socket
- // }
- //else
- //{
- switch(getSn_SR(0))
- {
-
- case SOCK_INIT: // Socket处于初始化状态
- {
- listen(0); // 开始监听
- ka_tick_flag=0; // KA定时器开始计时标志位清零
- ka_send_flag=0; // KA发送标志位清零
- ka_no_data_tick=0; // 无数据传输时间计时器清零
- }
- break;
- case SOCK_ESTABLISHED: // Socket处于连接建立状态
- // case SOCK_UDP:
- if(getSn_IR(0) & Sn_IR_CON)
- {
- setSn_IR(0, Sn_IR_CON); // Sn_IR的第0位置1
- ka_tick_flag=0; // KA定时器开始计时标志位清零
- ka_no_data_tick=0; // 无数据传输时间计时器
- ka_send_flag=0; // KA发送标志位清零
- ka_send_tick=0; // KA发送定时器清零
- }
- if ((len = getSn_RX_RSR(0)) > 0)
- {
- len = recv(0, RX_BUF, len); // W5200收到数据
- Tcp_ip_Recvdata();
- //send(0,RX_BUF,len,(bool)0); // W5200将收到的数据发回客户端形成回环
-
- if(ka_tick_flag==0)
- {
- ka_tick_flag=1; // W5200同客户端进行了一次通信后,将KA定时器开始计时标志位置1,进入定时器中断,只要接下来在NO_DATA_PERIOD内没有数据通信,就开始发KA包
- }
- ka_no_data_tick=0; // 无数据传输时间计时器清零
- ka_send_tick=0; // KA发送定时器清零
- }
- if(ka_send_flag)
- {
- ka_send_flag=0; // KA发送标志位清零
- ka_send_tick=0; // KA发送定时器清零
- send_keepalive(0); // W5200发KA包给客户端
- //printf("*");
- }
- break;
- case SOCK_CLOSE_WAIT: // Socket处于等待关闭状态
- if ((len = getSn_RX_RSR(0)) > 0) // 如果此时仍有数据
- {
- len = recv(0, RX_BUF, len); // W5200继续收数据
- Tcp_ip_Recvdata();
- // send(0,RX_BUF,len,(bool)0); // W5200将收到的数据发回客户端
-
- }
- disconnect(0); // 关闭Socket
- ka_tick_flag=0; // KA定时器开始计时标志位清零
- ka_send_flag=0; // KA发送标志位清零
- ka_no_data_tick=0; // 无数据传输时间计时器清零
- ka_send_tick=0; // KA发送定时器清零
- break;
- case SOCK_CLOSED: // Socket处于关闭状态
- socket(0, Sn_MR_TCP, 5000, 0x00); // 重新打开Socket
- break;
- }
- //} Sn_MR_UDP
- }
复制代码 二、迪文屏发送数据下位机接受
处理迪文屏触摸事件
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|