打印
[学习笔记]

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

[复制链接]
537|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forgot|  楼主 | 2023-12-23 22:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 中断回调已经提前测试过一下,总体测试还算比较顺利。

附件为完整的评测工程文件:
游客,如果您要查看本帖隐藏内容请回复


使用特权

评论回复

相关帖子

沙发
Diegoronal1| | 2023-12-25 23:20 | 只看该作者
谢谢!~

使用特权

评论回复
板凳
Shanyakai| | 2024-2-21 16:12 | 只看该作者
学习一下

使用特权

评论回复
地板
来年秋风起| | 2024-2-23 16:02 | 只看该作者

使用特权

评论回复
5
long-4321| | 2024-2-28 16:18 | 只看该作者
谢谢

使用特权

评论回复
6
jhzxzss| | 2024-4-16 18:39 | 只看该作者
谢谢楼主分享!!!

使用特权

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

本版积分规则

1257

主题

10849

帖子

51

粉丝