本帖最后由 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***********************/
|
给自己点个赞