supermiao123 发表于 2019-3-1 16:34

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

<div class='showpostmsg'> 本帖最后由 supermiao123 于 2019-3-1 16:37 编辑

    今天带来H7的LWIP下的串口与网口数据交互测评。    由于H7相较于之前的系列有很大性能的提升,架构也变的更为复杂。
    STM32cube极大的提升了编程的速度,今天的测评也不例外。如下图,生成ETH的相关设置,需要注意的是下面的灰色字体,ETH只能工作在RAM为0x24000000的情况下。

于是看手册看到,0x24000000是AXI SRAM ,默认的0x20000000是DTCM。

再看下图,两种RAM的架构位置是不同的。

还有个需要注意的地方是ETH的IO速度都是LOW,这个最好改成VERY HIGH。


接着配置LWIP,固定IP经常会碰到撞IP,或者换交换机会遇到192.168.0.X,或者192.168.1.x的情况,索性就用自动获取IP的功能,配置TFT和串口在获得IP时都会输出IP地址。

下面是串口配置。

接着生成就好了。
然后注意前面的提示,编译器改了两个地方。


接着就是实现交互的代码了。
USART3->CR1 |= USART_CR1_TE |USART_CR1_RE |USART_CR1_RXNEIE;
      USART3->CR1 |= USART_CR1_UE;
      HAL_GPIO_WritePin(GPIOC, TFT_BL_Pin, GPIO_PIN_SET);
      SPI1->CR1 |=SPI_CR1_SPE ;
      SPI1->CR1 |= SPI_CR1_CSTART;
      lcd_initial();      
      dsp_single_colour(WHITE);
tcp_server_init();
上面是对串口,和TFT进行的初始化,串口使能接收中断,使能控制TFT的SPI,并且初始化TFT。
最后是TCP_SERVER的初始化。
void tcp_server_init(void)
{
err_t err;
tcp_server_pcb = tcp_new();
if(tcp_server_pcb !=NULL)
{
    err = tcp_bind(tcp_server_pcb,IP_ADDR_ANY,7);
    if(err == ERR_OK)
    {
      tcppcbconn = tcp_listen(tcp_server_pcb);
      tcp_accept(tcppcbconn,tcp_server_accept);
    }
    else
    {
      memp_free(MEMP_TCP_PCB, tcp_server_pcb);
    }
   
}

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

HAL_UART_Transmit(&huart3,p->payload,p->len,100);
pbuf_free(p);
      
      
return ERR_OK;
}
串口收到数据检测到0xA回车后发出
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
uart3_data=USART3->RDR;
      if(uart3_data==0xA)
      {
                uart3_data_valid=1;
                //uart3_rx_cnt=0;
               
      }
      else uart3_rx_cnt++;

/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */

/* USER CODE END USART3_IRQn 1 */
}

LWIP处理程序里添加IP获取后显示到TFT并发送到串口的操作。并收到串口有效指令后向TCP发出数据得代码。
void MX_LWIP_Process(void)
{
/* USER CODE BEGIN 4_1 */
      unsigned char ip={0};
      char ipstr={0};
/* USER CODE END 4_1 */
ethernetif_input(&gnetif);

/* USER CODE BEGIN 4_2 */
/* USER CODE END 4_2 */
/* Handle timeouts */
sys_check_timeouts();

/* USER CODE BEGIN 4_3 */
      
      if(gnetif.ip_addr.addr!=0&&!ipget)
      {      
                ip=(uint8_t)(gnetif.ip_addr.addr>>24);
                ip=(uint8_t)(gnetif.ip_addr.addr>>16);
                ip=(uint8_t)(gnetif.ip_addr.addr>>8);
                ip=(uint8_t)(gnetif.ip_addr.addr);
                printf("ip_addr : %d.%d.%d.%d \r\n",ip,ip,ip,ip);
                TFTStrDisplay_lite(0,0,"IP GET",6);
                sprintf(ipstr,"%d.%d.%d.%d",ip,ip,ip,ip);
                TFTStrDisplay_lite(1,0,ipstr,15);
                ipget=1;
      }
      uart_send_tcp_recv(uart3_data_valid,uart3_data,uart3_rx_cnt);
      if(uart3_data_valid)
                {
                        memset(uart3_data,0,100);
                        uart3_data_valid=0;
                        uart3_rx_cnt=0;
                }
/* USER CODE END 4_3 */
}
void uart_send_tcp_recv(unsigned char flag,unsigned char *data,unsigned char cnt)
{
      if(flag)
      {
                tcp_write(tcp_server_pcb,data,cnt,1);
               tcp_output(tcp_server_pcb);
      }
}

运行后TFT显示IP地址。


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



本人水平有限,欢迎大家交流指正,谢谢您的浏览!
{:1_119:}
此内容由EEWORLD论坛网友supermiao123原创,如需转载或用于商业用途需征得作者同意并注明出处



</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

bigbat 发表于 2019-3-1 20:24

照你说的单独做了一个项目,
1、ETH的GPIO速度都改成VERY HIGH,只有ETH_MDC改不成,因为只有LOW项。
2、编译时照你的图也改了
3、在main中while(1)加入了MX_LWIP_Process();
但是,还是不行!!!

supermiao123 发表于 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();
这个试试。

bigbat 发表于 2019-3-2 12:05

我在main.c中的void SystemClock_Config(void)里加入代码:
while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}
   __HAL_RCC_D2SRAM3_CLK_ENABLE();
结果还是不行。无法发现DHCP列表中有这个MAC【00:80:E1:00:00:02】地址的IP!


supermiao123 发表于 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:)

梦小坤 发表于 2019-12-10 19:16

<p>楼主,可以发一份工程干吗?学习一下,最近在搞H743。<img height="50" src="https://home.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--100.gif" width="50" />&nbsp; &nbsp;邮箱:&nbsp;yakun81131@yeah.net</p>

zc0429 发表于 2021-7-8 17:52

<p>可以发一份给我吗,eczc@qq.com </p>

诗与远方 发表于 2021-11-22 09:00

<p>楼主,可以分享一下代码,993960025@qq.com,谢谢啦</p>
页: [1]
查看完整版本: 【 ST NUCLEO-H743ZI测评】(2)LWIP下的串口与网口数据互相转换