【 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> 照你说的单独做了一个项目,
1、ETH的GPIO速度都改成VERY HIGH,只有ETH_MDC改不成,因为只有LOW项。
2、编译时照你的图也改了
3、在main中while(1)加入了MX_LWIP_Process();
但是,还是不行!!!
bigbat 发表于 2019-3-1 20:24
照你说的单独做了一个项目,
1、ETH的GPIO速度都改成VERY HIGH,只有ETH_MDC改不成,因为只有LOW项。
2、 ...
先看能不能PING通,或者watch里看gnetif里的IP地址有没有,还有一个在初始化里加__HAL_RCC_D2SRAM3_CLK_ENABLE();
这个试试。 我在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!
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:) <p>楼主,可以发一份工程干吗?学习一下,最近在搞H743。<img height="50" src="https://home.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--100.gif" width="50" /> 邮箱: yakun81131@yeah.net</p>
<p>可以发一份给我吗,eczc@qq.com </p>
<p>楼主,可以分享一下代码,993960025@qq.com,谢谢啦</p>
页:
[1]