社区导航

 

搜索
查看: 554|回复: 4

[原创] 【 ST NUCLEO-H743ZI测评】(2)LWIP下的串口与网口数据互相转换

[复制链接]

544

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-3-1 16:34 | 显示全部楼层 |阅读模式
本帖最后由 supermiao123 于 2019-3-1 16:37 编辑

    今天带来H7的LWIP下的串口与网口数据交互测评。    由于H7相较于之前的系列有很大性能的提升,架构也变的更为复杂。
    STM32cube极大的提升了编程的速度,今天的测评也不例外。如下图,生成ETH的相关设置,需要注意的是下面的灰色字体,ETH只能工作在RAM为0x24000000的情况下。
2.jpg
于是看手册看到,0x24000000是AXI SRAM ,默认的0x20000000是DTCM。
7.jpg
再看下图,两种RAM的架构位置是不同的。
8.jpg
还有个需要注意的地方是ETH的IO速度都是LOW,这个最好改成VERY HIGH。
3.jpg

接着配置LWIP,固定IP经常会碰到撞IP,或者换交换机会遇到192.168.0.X,或者192.168.1.x的情况,索性就用自动获取IP的功能,配置TFT和串口在获得IP时都会输出IP地址。
1.jpg
下面是串口配置。
4.jpg
接着生成就好了。
然后注意前面的提示,编译器改了两个地方。
5.jpg
6.jpg
接着就是实现交互的代码了。
  1. USART3->CR1 |= USART_CR1_TE |USART_CR1_RE |USART_CR1_RXNEIE;
  2.         USART3->CR1 |= USART_CR1_UE;
  3.         HAL_GPIO_WritePin(GPIOC, TFT_BL_Pin, GPIO_PIN_SET);
  4.         SPI1->CR1 |=SPI_CR1_SPE ;
  5.         SPI1->CR1 |= SPI_CR1_CSTART;
  6.         lcd_initial();        
  7.         dsp_single_colour(WHITE);
  8.   tcp_server_init();
复制代码

上面是对串口,和TFT进行的初始化,串口使能接收中断,使能控制TFT的SPI,并且初始化TFT。
最后是TCP_SERVER的初始化。
  1. void tcp_server_init(void)
  2. {
  3.   err_t err;
  4.   tcp_server_pcb = tcp_new();
  5.   if(tcp_server_pcb !=NULL)
  6.   {
  7.     err = tcp_bind(tcp_server_pcb,IP_ADDR_ANY,7);
  8.     if(err == ERR_OK)
  9.     {
  10.       tcppcbconn = tcp_listen(tcp_server_pcb);
  11.       tcp_accept(tcppcbconn,tcp_server_accept);
  12.     }
  13.     else
  14.     {
  15.       memp_free(MEMP_TCP_PCB, tcp_server_pcb);
  16.     }
  17.    
  18.   }
  19.   
  20. }
复制代码

TCP收到后串口发出去。
  1. static err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p,err_t err)
  2. {

  3.   HAL_UART_Transmit(&huart3,p->payload,p->len,100);
  4.   pbuf_free(p);
  5.         
  6.         
  7.   return ERR_OK;
  8. }
复制代码

串口收到数据检测到0xA回车后发出
  1. void USART3_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART3_IRQn 0 */
  4.   uart3_data[uart3_rx_cnt]=USART3->RDR;
  5.         if(uart3_data[uart3_rx_cnt]==0xA)
  6.         {
  7.                 uart3_data_valid=1;
  8.                 //uart3_rx_cnt=0;
  9.                
  10.         }
  11.         else uart3_rx_cnt++;

  12.   /* USER CODE END USART3_IRQn 0 */
  13.   HAL_UART_IRQHandler(&huart3);
  14.   /* USER CODE BEGIN USART3_IRQn 1 */

  15.   /* USER CODE END USART3_IRQn 1 */
  16. }
复制代码

LWIP处理程序里添加IP获取后显示到TFT并发送到串口的操作。并收到串口有效指令后向TCP发出数据得代码。
  1. void MX_LWIP_Process(void)
  2. {
  3. /* USER CODE BEGIN 4_1 */
  4.         unsigned char ip[4]={0};
  5.         char ipstr[16]={0};
  6. /* USER CODE END 4_1 */
  7.   ethernetif_input(&gnetif);
  8.   
  9. /* USER CODE BEGIN 4_2 */
  10. /* USER CODE END 4_2 */  
  11.   /* Handle timeouts */
  12.   sys_check_timeouts();

  13. /* USER CODE BEGIN 4_3 */
  14.         
  15.         if(gnetif.ip_addr.addr!=0&&!ipget)
  16.         {        
  17.                 ip[3]=(uint8_t)(gnetif.ip_addr.addr>>24);
  18.                 ip[2]=(uint8_t)(gnetif.ip_addr.addr>>16);
  19.                 ip[1]=(uint8_t)(gnetif.ip_addr.addr>>8);
  20.                 ip[0]=(uint8_t)(gnetif.ip_addr.addr);
  21.                 printf("ip_addr : %d.%d.%d.%d \r\n",ip[0],ip[1],ip[2],ip[3]);
  22.                 TFTStrDisplay_lite(0,0,"IP GET",6);
  23.                 sprintf(ipstr,"%d.%d.%d.%d",ip[0],ip[1],ip[2],ip[3]);
  24.                 TFTStrDisplay_lite(1,0,ipstr,15);
  25.                 ipget=1;
  26.         }
  27.         uart_send_tcp_recv(uart3_data_valid,uart3_data,uart3_rx_cnt);
  28.         if(uart3_data_valid)
  29.                 {
  30.                         memset(uart3_data,0,100);
  31.                         uart3_data_valid=0;
  32.                         uart3_rx_cnt=0;
  33.                 }
  34. /* USER CODE END 4_3 */
  35. }
  36. void uart_send_tcp_recv(unsigned char flag,unsigned char *data,unsigned char cnt)
  37. {
  38.         if(flag)
  39.         {
  40.                 tcp_write(tcp_server_pcb,data,cnt,1);
  41.                  tcp_output(tcp_server_pcb);
  42.         }
  43. }
复制代码


运行后TFT显示IP地址。
微信图片_20190301163145.jpg

串口也看到了IP地址,根据所得IP,运行效果如下图,这样便简单的完成了网口和串口的数据互发。

QQ截图20190301152808.jpg

本人水平有限,欢迎大家交流指正,谢谢您的浏览!

此内容由EEWORLD论坛网友supermiao123原创,如需转载或用于商业用途需征得作者同意并注明出处



此帖出自stm32/stm8论坛


回复

使用道具 举报

614

TA的帖子

2

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-3-1 20:24 | 显示全部楼层
照你说的单独做了一个项目,
1、ETH的GPIO速度都改成VERY HIGH,只有ETH_MDC改不成,因为只有LOW项。
2、编译时照你的图也改了
3、在main中while(1)加入了MX_LWIP_Process();
但是,还是不行!!!

点评

先看能不能PING通,或者watch里看gnetif里的IP地址有没有,还有一个在初始化里加__HAL_RCC_D2SRAM3_CLK_ENABLE(); 这个试试。  详情 回复 发表于 2019-3-1 20:31


回复

使用道具 举报

544

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2019-3-1 20:31 | 显示全部楼层
bigbat 发表于 2019-3-1 20:24
照你说的单独做了一个项目,
1、ETH的GPIO速度都改成VERY HIGH,只有ETH_MDC改不成,因为只有LOW项。
2、 ...

先看能不能PING通,或者watch里看gnetif里的IP地址有没有,还有一个在初始化里加__HAL_RCC_D2SRAM3_CLK_ENABLE();
这个试试。


回复

使用道具 举报

614

TA的帖子

2

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-3-2 12:05 | 显示全部楼层
我在main.c中的void SystemClock_Config(void)里加入代码:
  1. while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}
  2.    __HAL_RCC_D2SRAM3_CLK_ENABLE();
复制代码

结果还是不行。无法发现DHCP列表中有这个MAC【00:80:E1:00:00:02】地址的IP!


点评

http://www.stmcu.org.cn/module/forum/thread-615089-1-3.html 那你可以看下这个帖子,先不使能MPU、CACHE之后PING一下,可以之后再使能MPU、CACHE  详情 回复 发表于 2019-3-2 19:02


回复

使用道具 举报

544

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2019-3-2 19:02 | 显示全部楼层
bigbat 发表于 2019-3-2 12:05
我在main.c中的void SystemClock_Config(void)里加入代码:

结果还是不行。无法发现DHCP列表中有这个MAC ...

http://www.stmcu.org.cn/module/forum/thread-615089-1-3.html 那你可以看下这个帖子,先不使能MPU、CACHE之后PING一下,可以之后再使能MPU、CACHE


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-5-24 09:24 , Processed in 0.176676 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表