打印
[活动专区]

【AT-START-F407测评】+ OLED液晶显示TCP接收数据

[复制链接]
940|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forgot|  楼主 | 2023-1-6 10:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 forgot 于 2023-1-6 10:33 编辑

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

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

    首先是跑一下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等文件。
2、屏是1.3寸的OLED,IIC通讯接口选取PD2、PD4、PD6分别作为OLED的RET、SCLK、SDIN引脚。
//管脚配置
#define RET_PIN                         GPIO_PINS_2
#define RET_GPIO                        GPIOD
#define RET_GPIO_CRM_CLK                CRM_GPIOD_PERIPH_CLOCK

#define SCLK_PIN                         GPIO_PINS_4
#define SCLK_GPIO                        GPIOD
#define SCLK_GPIO_CRM_CLK                CRM_GPIOD_PERIPH_CLOCK

#define SDIN_PIN                         GPIO_PINS_6
#define SDIN_GPIO                        GPIOD
#define SDIN_GPIO_CRM_CLK                CRM_GPIOD_PERIPH_CLOCK

#define OLED_RET_Clr()        gpio_bits_write(RET_GPIO,RET_PIN,FALSE)
#define OLED_RET_Set()        gpio_bits_write(RET_GPIO,RET_PIN,TRUE)
#define OLED_SCLK_Clr()        gpio_bits_write(SCLK_GPIO,SCLK_PIN,FALSE)
#define OLED_SCLK_Set()        gpio_bits_write(SCLK_GPIO,SCLK_PIN,TRUE)
#define OLED_SDIN_Clr()        gpio_bits_write(SDIN_GPIO,SDIN_PIN,FALSE)
#define OLED_SDIN_Set()        gpio_bits_write(SDIN_GPIO,SDIN_PIN,TRUE)

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

#if 1
    delay_us(Del_s);
#else
    while(Del_s--) {
        for(j=0; j<20; j++);
    }
#endif
}

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

    if(!power_on) {
        power_on = 1;
        memcpy(&Line[0][0],"Hello 21ic!",sizeof("Hello 21ic!"));
        memcpy(&Line[1][0],"ID:forgot",sizeof("ID:forgot"));
        memcpy(&Line[2][0],"AT_START_F407",sizeof("AT_START_F407"));
        memcpy(&Line[3][0],"EMAC_TCP_TEST",sizeof("EMAC_TCP_TEST"));
        OLED_Clear();
        for(i = 0; i < 4; i++) {
            OLED_ShowString(0,i*2,(u8 *)&Line[i][0],16);
        }
    }
    Show_Rev();
}

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

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

    system_clock_config();
    at32_board_init();
    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
    delay_init();
    status = emac_system_init();
    while(status == ERROR);
    tcpip_stack_init();
    tcp_client_init(TCP_LOCAL_PORT,TCP_SERVER_PORT,TCP_SERVER_IP);
    MY_GPIO_Init();
    MY_OLED_Init();

    for(;;) {
        /* lwip receive handle */
        lwip_rx_loop_handler();
                        
        /*timeout handle*/
        lwip_periodic_handle(local_time);
                        
        /*oledshow*/
        MY_OLED_START();
    }
}

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

TCP发送&接收数据:

OLED显示TCP接收到数据:

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

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

最后祝雅特力越做越好。

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


使用特权

评论回复
评论
forgot 2023-1-17 09:03 回复TA
给自己点个赞 
沙发
10299823| | 2023-2-2 13:38 | 只看该作者
TCP怎么实现ping通信呢?              

使用特权

评论回复
评论
forgot 2023-2-2 14:53 回复TA
烧原厂例程就直接可以ping了 
板凳
minzisc| | 2023-2-2 13:47 | 只看该作者
在哪里下载的相关的例程呢              

使用特权

评论回复
评论
forgot 2023-2-2 14:54 回复TA
抽空我上传一下 
地板
linfelix| | 2023-2-2 14:25 | 只看该作者
为什么不使用串口发送tcp的数据?

使用特权

评论回复
评论
forgot 2023-2-2 14:54 回复TA
这个是做了一个网络功能测评 
5
wilhelmina2| | 2023-2-4 11:23 | 只看该作者
这个w5500传输速度怎么样              

使用特权

评论回复
6
51xlf| | 2023-2-4 12:21 | 只看该作者
这个可以做http的数据获取?              

使用特权

评论回复
评论
forgot 2023-2-4 16:11 回复TA
可以的,有例程 
7
wwppd| | 2023-2-4 15:30 | 只看该作者
厂家的板子做的确实不错,资料也很全面的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1297

主题

10945

帖子

51

粉丝