本帖最后由 forgot 于 2023-12-23 22:35 编辑
#有奖活动# #申请原创# 前面做过一篇评测,所以环境都搭建好了,准备在freertos下面再创建一个任务做一下ESP8266 WIFI模块的串口驱动实现STA模式TCP客户端连接到PC服务进行ADC采集数据的显示。
因为例程是用uart1进行的debug打印,我注释掉InitDebug();我采用uart1进行ESP8266驱动。串口采用Polling查询方式模式,配置波特率为115200,奇校验,8 位数据,1 位停止位。 void UART1_Polling_Init(void)
{
uart_user_config_t userConfig;
/*GPIO Configuration for UART1 */
GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
memset(&userConfig, 0U, sizeof(userConfig));
userConfig.baudRate = 115200; /*波特率配置 */
userConfig.parityMode = UART_PARITY_DISABLED; /*不校验*/
userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择,1-bit */
userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
userConfig.rxDMAChannel = 0; /*DMA传输方式下的DMA rx 通道*/
userConfig.txDMAChannel = 0; /*DMA传输方式下的DMA tx 通道*/
UART_DRV_Init(1, &s_uartState, &userConfig);
}
工程的相关文件有: ADC相关: adc_sample.c、adc_sample.h等 Oled相关: oled.c、oled.h、oledfont.h
WIFI相关: esp8266.c、esp8266.h、tcp.c、tcp.h等
UART相关: uart_sample.c、uart_sample.h等 初始化并创建各个系统任务: int main(void)
{
BaseType_t xReturn = pdPASS; /* 定义一个创建信息返回值,默认为pdPASS */
CKGEN_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT, g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CKGEN_DRV_UpdateConfiguration(0, CLOCK_MANAGER_POLICY_AGREEMENT);
SystemCoreClockUpdate();
// InitDebug();
GPIO_LedInit();
GPIO_KeyInit();
GPIO_OledInit();
MY_OLED_Init();
ESP8266_Init();
ADC_Init();
UART1_Polling_Init();
WDG_Basic();
printf("ac7840x test\r\n");
/* 创建开始任务 */
xReturn = xTaskCreate((TaskFunction_t)start_task, /* 任务函数 */
(const char*)"start_task", /* 任务名称 */
(configSTACK_DEPTH_TYPE)256, /* 任务堆栈大小 */
(void*)NULL, /* 传递给任务函数的参数 */
(UBaseType_t)19, /* 任务优先级 */
(TaskHandle_t*)&StartTask_Handler); /* 任务句柄 */
if (pdPASS == xReturn)
{
vTaskStartScheduler(); /* 开启任务调度 */
}
while (1);
}
/* 开始任务函数 */
void start_task(void *pvParameters)
{
BaseType_t xReturn = pdPASS; /* 定义一个创建信息返回值,默认为pdPASS */
taskENTER_CRITICAL(); /* 进入临界区 */
/* 创建OLED_Task任务 */
xReturn = xTaskCreate((TaskFunction_t)OLED_Task,
(const char*)"OLED_Task",
(configSTACK_DEPTH_TYPE)256,
(void*)NULL,
(UBaseType_t)17,
(TaskHandle_t*)&OLED_Task_Handler);
if (pdPASS == xReturn)
{
printf("OLED_Task was created successfully\r\n");
}else{
__NOP();
}
/* 创建WIFI_Task任务 */
xReturn = xTaskCreate((TaskFunction_t)WIFI_Task,
(const char*)"WIFI_Task",
(configSTACK_DEPTH_TYPE)256,
(void*)NULL,
(UBaseType_t)18,
(TaskHandle_t*)&WIFI_Task_Handler);
if (pdPASS == xReturn)
{
printf("WIFI_Task was created successfully\r\n");
}else{
__NOP();
}
/* 创建ADC_Task任务 */
xReturn = xTaskCreate((TaskFunction_t)ADC_Task,
(const char*)"ADC_Task",
(configSTACK_DEPTH_TYPE)256,
(void*)NULL,
(UBaseType_t)16,
(TaskHandle_t*)&ADC_Task_Handler);
if (pdPASS == xReturn)
{
printf("ADC_Task was created successfully\r\n");
}else{
__NOP();
}
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
taskEXIT_CRITICAL(); /* 退出临界区 */
}
/* OLED_Task任务函数 */
void OLED_Task(void *pvParameters)
{
while (1)
{
printf("OLED_Task Runing\r\n");
LED3_TOGGLE;
MY_OLED_START();
vTaskDelay(500);
}
}
/* WIFI_Task任务函数 */
void WIFI_Task(void *pvParameters)
{
while (1)
{
printf("WIFI_Task Runing\r\n");
LED4_TOGGLE;
vTaskDelay(500);
ESP8266_STA_TCPClient_Test();
}
}
/* ADC_Task任务函数 */
void ADC_Task(void *pvParameters)
{
while (1)
{
printf("ADC_Task Runing\r\n");
RGB_Toggle();
ADC_TriggerTest();
WDG_DRV_Trigger(0);
vTaskDelay(500);
}
}
配置好任务相关的堆栈大小和调度相关的参数设置: /* Constants that describe the hardware and memory usage. */
#define configCPU_CLOCK_HZ AC7840X_CORE_CLOCK /* CPU频率 */
#define configTICK_RATE_HZ ((TickType_t)1000) /* 时钟节拍频率,这里设置为1000,周期就是1ms */
#define configTOTAL_HEAP_SIZE ((size_t)8192*2) /* 系统所有总的堆大小 */
#define configMINIMAL_STACK_SIZE ((uint16_t)128) /* 空闲任务使用的堆栈大小 */
#define configSUPPORT_DYNAMIC_ALLOCATION 1 /* 支持动态内存申请 */
#define configSUPPORT_STATIC_ALLOCATION 0 /* 静态内存申请 */
/* Constants related to the behaviour or the scheduler. */
#define configMAX_PRIORITIES 30 /* 可使用的最大优先级 */
#define configUSE_PREEMPTION 1 /* 1使用抢占式内核,0使用协程 */
#define configUSE_TIME_SLICING 1
#define configIDLE_SHOULD_YIELD 0
#define configMAX_TASK_NAME_LEN (20) /* 任务名字字符串长度 */
#define configUSE_16_BIT_TICKS 0 /* 系统节拍计数器变量数据类型 */
OLED_Task功能: LED3闪烁、OLED液晶显示开机字符和4路ADC的采样结果,采用的是十进制显示的; void Show_WIFI(void)
{
int ret;
char s[4][10];
//show data
OLED_ShowString(0,0,(unsigned char *)"AC7840x_USART",16);
OLED_ShowString(0,2,(unsigned char *)"WIFI_TCP_Client",16);
OLED_ShowString(0,4,(unsigned char *)"bbs.21ic.com",16);
OLED_ShowString(0,6,(unsigned char *)"id:forgot",16);
}
//MY TEST 21ic:forgot
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],"AC7840x",sizeof("AC7840x"));
memcpy(&Line[3][0],"FreeRTOS_TEST",sizeof("FreeRTOS_TEST"));
OLED_Clear();
for(i = 0; i < 4; i++) {
OLED_ShowString(0,i*2,(unsigned char *)&Line[i][0],16);
}
vTaskDelay(2000);
OLED_Clear();
}
Show_WIFI();
}
ADC_Task功能: RGB闪烁、ADC规则组采集和喂狗; WIFI_Task功能: LED4闪烁、WIFI TCP连接和传输ADC采用结果等; extern uint16_t g_adc_array[4];
void ESP8266_STA_TCPClient_Test(void)
{
uint8_t res;
char str[100]={0};
ESP8266_Rst();
vTaskDelay(2000);
ESP8266_USART("AT+RESTORE\r\n");
vTaskDelay(1000);
ESP8266_USART("AT\r\n");
vTaskDelay(1000);
ESP8266_USART("AT+CWMODE=1\r\n");
vTaskDelay(1000);
ESP8266_USART("AT+CWJAP=\"wifi003\",\"88888888888\"\r\n");
vTaskDelay(20000);
ESP8266_USART("AT+CIPMUX=0\r\n");
vTaskDelay(1000);
ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0);
vTaskDelay(1000);
ESP8266_USART("AT+CIPMODE=1\r\n");
vTaskDelay(1000);
ESP8266_USART("AT+CIPSEND\r\n");
vTaskDelay(2000);
printf("\r\n配置完成");
while(1){
sprintf (str,"ac7840x_freertos_Adc_2_WIFI_TCP_Client\r\n" );
ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
vTaskDelay(2000);
sprintf (str,"ADC_value: VR1 = 0x%-5x VR2 = 0x%-5x TSENSOR = 0x%-5x SUPPLY = 0x%-5x \r\n", g_adc_array[0], g_adc_array[1], g_adc_array[2], g_adc_array[3]);//格式化发送字符串到TCP服务器
ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
vTaskDelay(2000);
sprintf (str,"bbs.21ic.com\r\nid:forgot\r\n");
ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
vTaskDelay(2000);
}
}
实验效果:
串口工具 显示配置过程和WIFI连接成功:
服务端TCP SERVER 连接成功收到数据:
总结: 因为没有实验TCP回传,感觉可能用UART 中断方式通信更合适一点,之前UART 中断回调已经提前测试过一下,总体测试还算比较顺利。
附件为完整的评测工程文件:
|