本帖最后由 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***********************/
|