【杰发科技AC7840x测评】Freertos_Adc_2_WIFI_TCP客户端

前面做过一篇评测,所以环境都搭建好了,准备在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 中断回调已经提前测试过一下,总体测试还算比较顺利。


附件为完整的评测工程文件:。
---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3350236-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值