[活动专区] 【AT-START-F407测评】+ OLED液晶显示TCP接收数据

[复制链接]
1457|11
 楼主| forgot 发表于 2023-1-6 10:17 | 显示全部楼层 |阅读模式
本帖最后由 forgot 于 2023-1-6 10:33 编辑

    参加本次活动申请的是雅特力的F407板子,主要看中的就是MCU高效能以太网口模块,之前做过的很多项目用的是en28j60,w5500这种外置emac,用过的内置mac项目还是很久之前的microchip的pic8位单片机。正好借这次机会体验一下,为以后的项目开发做个备选。

    厂家的资料做的很全,从官网上下载下来,软硬件文档应有尽有,板子也很漂亮。这是从官网下载的一些必要文件。
文件目录.png

    首先是跑一下Firmware_Library中的examples,其中的emc文件夹下有dns、mqtt_client、tcp_client、tcp_server等例程,都是基于middlewares中的lwip_2.1.2写的。其中tcp_client是主动发送一串数据到tcp_server,并且接收到tcp_server的数据之后再回传。

1、基于这个例程,添加自己的oled.c、oled.h、oledfont.h等文件。
keil.png
2、屏是1.3寸的OLED,IIC通讯接口选取PD2、PD4、PD6分别作为OLED的RET、SCLK、SDIN引脚。
  1. //管脚配置
  2. #define RET_PIN                         GPIO_PINS_2
  3. #define RET_GPIO                        GPIOD
  4. #define RET_GPIO_CRM_CLK                CRM_GPIOD_PERIPH_CLOCK

  5. #define SCLK_PIN                         GPIO_PINS_4
  6. #define SCLK_GPIO                        GPIOD
  7. #define SCLK_GPIO_CRM_CLK                CRM_GPIOD_PERIPH_CLOCK

  8. #define SDIN_PIN                         GPIO_PINS_6
  9. #define SDIN_GPIO                        GPIOD
  10. #define SDIN_GPIO_CRM_CLK                CRM_GPIOD_PERIPH_CLOCK

  11. #define OLED_RET_Clr()        gpio_bits_write(RET_GPIO,RET_PIN,FALSE)
  12. #define OLED_RET_Set()        gpio_bits_write(RET_GPIO,RET_PIN,TRUE)
  13. #define OLED_SCLK_Clr()        gpio_bits_write(SCLK_GPIO,SCLK_PIN,FALSE)
  14. #define OLED_SCLK_Set()        gpio_bits_write(SCLK_GPIO,SCLK_PIN,TRUE)
  15. #define OLED_SDIN_Clr()        gpio_bits_write(SDIN_GPIO,SDIN_PIN,FALSE)
  16. #define OLED_SDIN_Set()        gpio_bits_write(SDIN_GPIO,SDIN_PIN,TRUE)

3、添加各相关头文件,oled.c中采用at32f403a_407_board.c中的delay_us作为延时函数。
  1. void MY_Delay(unsigned int Del_s)
  2. {
  3.     unsigned int j;

  4. #if 1
  5.     delay_us(Del_s);
  6. #else
  7.     while(Del_s--) {
  8.         for(j=0; j<20; j++);
  9.     }
  10. #endif
  11. }

4、编写
void MY_GPIO_Init(void);
void MY_OLED_Init(void);        
void MY_OLED_START(void);
三个主要函数,其中MY_OLED_START();中实现开始显示及TCP接收打印功能。
  1. //液晶显示
  2. void MY_OLED_START(void)
  3. {
  4.     int i;
  5.     static int power_on = 0;
  6.     char Line[4][20];

  7.     if(!power_on) {
  8.         power_on = 1;
  9.         memcpy(&Line[0][0],"Hello 21ic!",sizeof("Hello 21ic!"));
  10.         memcpy(&Line[1][0],"ID:forgot",sizeof("ID:forgot"));
  11.         memcpy(&Line[2][0],"AT_START_F407",sizeof("AT_START_F407"));
  12.         memcpy(&Line[3][0],"EMAC_TCP_TEST",sizeof("EMAC_TCP_TEST"));
  13.         OLED_Clear();
  14.         for(i = 0; i < 4; i++) {
  15.             OLED_ShowString(0,i*2,(u8 *)&Line[i][0],16);
  16.         }
  17.     }
  18.     Show_Rev();
  19. }

5、在tcp_client.c中的tcp_client_recv函数里实现接收数据copy到液晶显示的show_buff[]中。
  1. //TCP接收数据
  2. err_t tcp_client_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
  3. {
  4.     if(p != NULL) {
  5.         show_need = 1;
  6.         memcpy(show_buff,p->payload,p->tot_len);
  7.         tcp_recved(pcb, p->tot_len);
  8.         tcp_write(pcb,p->payload,p->tot_len,TCP_WRITE_FLAG_COPY);
  9.         tcp_output(pcb);
  10.     } else {
  11.         tcp_close(pcb);
  12.     }
  13.     pbuf_free(p);
  14.     err = ERR_OK;
  15.     return err;
  16. }

6、在main.c中初始化oled。
        MY_GPIO_Init();
        MY_OLED_Init();
在for(;;)中调用MY_OLED_START();
  1. int main(void)
  2. {
  3.     error_status status;

  4.     system_clock_config();
  5.     at32_board_init();
  6.     nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  7.     delay_init();
  8.     status = emac_system_init();
  9.     while(status == ERROR);
  10.     tcpip_stack_init();
  11.     tcp_client_init(TCP_LOCAL_PORT,TCP_SERVER_PORT,TCP_SERVER_IP);
  12.     MY_GPIO_Init();
  13.     MY_OLED_Init();

  14.     for(;;) {
  15.         /* lwip receive handle */
  16.         lwip_rx_loop_handler();
  17.                         
  18.         /*timeout handle*/
  19.         lwip_periodic_handle(local_time);
  20.                         
  21.         /*oledshow*/
  22.         MY_OLED_START();
  23.     }
  24. }

    这样就实现了开机显示:
Hello 21ic!
ID:forgot
AT_START_F407
EMAC_TCP_TEST
    当接收到tcp_server的数据之后,显示:
TCP_REV:
XXXXXX
整体开机界面:
微信图片_20230106092035.jpg

TCP发送&接收数据:
ok.gif

OLED显示TCP接收到数据:
ok2.gif

视频链接:
https://www.bilibili.com/video/BV1QG4y117Xe/

总结一下:
    实际上除了emc,也尝试跑了一下其他的一些功能模块,ADC和usart等,这些都是个人比较常用的模块,感觉厂家的BSP做的非常好,给开发者提供的极大的便利性,在一些物联网关的项目,像网络收发服务器和串口收发服务器等产品上,这颗MCU确实非常不错的选择。

最后祝雅特力越做越好。

/***********************END***********************/


评论

给自己点个赞  发表于 2023-1-17 09:03
10299823 发表于 2023-2-2 13:38 | 显示全部楼层
TCP怎么实现ping通信呢?              

评论

烧原厂例程就直接可以ping了  发表于 2023-2-2 14:53
minzisc 发表于 2023-2-2 13:47 | 显示全部楼层
在哪里下载的相关的例程呢              

评论

抽空我上传一下  发表于 2023-2-2 14:54
linfelix 发表于 2023-2-2 14:25 | 显示全部楼层
为什么不使用串口发送tcp的数据?

评论

这个是做了一个网络功能测评  发表于 2023-2-2 14:54
wilhelmina2 发表于 2023-2-4 11:23 | 显示全部楼层
这个w5500传输速度怎么样              
51xlf 发表于 2023-2-4 12:21 | 显示全部楼层
这个可以做http的数据获取?              

评论

可以的,有例程  发表于 2023-2-4 16:11
wwppd 发表于 2023-2-4 15:30 | 显示全部楼层
厂家的板子做的确实不错,资料也很全面的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2112

主题

14683

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部