[学习笔记] 【杰发科技AC7840x测评】Freertos_Adc_2_WIFI_TCP客户端

[复制链接]
 楼主| forgot 发表于 2023-12-23 22:26 | 显示全部楼层 |阅读模式
<
本帖最后由 forgot 于 2023-12-23 22:35 编辑

#有奖活动# #申请原创#
      前面做过一篇评测,所以环境都搭建好了,准备在freertos下面再创建一个任务做一下ESP8266 WIFI模块的串口驱动实现STA模式TCP客户端连接到PC服务进行ADC采集数据的显示。
22.png

微信截图_20231223204722.png

      因为例程是用uart1进行的debug打印,我注释掉InitDebug();我采用uart1进行ESP8266驱动。串口采用Polling查询方式模式,配置波特率为115200,奇校验,8 位数据,1 位停止位。
  1. void UART1_Polling_Init(void)
  2. {
  3.     uart_user_config_t userConfig;

  4.     /*GPIO Configuration for UART1 */
  5.     GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2);  /* PC8: UART1_RX */
  6.     GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2);  /* PC9: UART1_TX */

  7.     GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
  8.     GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);

  9.     memset(&userConfig, 0U, sizeof(userConfig));

  10.     userConfig.baudRate = 115200;                         /*波特率配置 */
  11.     userConfig.parityMode = UART_PARITY_DISABLED;         /*不校验*/
  12.     userConfig.stopBitCount = UART_ONE_STOP_BIT;          /*停止位选择,1-bit */
  13.     userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR;    /*数据长度选择8 */
  14.     userConfig.transferType = UART_USING_INTERRUPTS;      /*UART传输方式选择 (interrupt or dma) */
  15.     userConfig.rxDMAChannel = 0;                          /*DMA传输方式下的DMA rx 通道*/
  16.     userConfig.txDMAChannel = 0;                          /*DMA传输方式下的DMA tx 通道*/

  17.     UART_DRV_Init(1, &s_uartState, &userConfig);
  18. }

工程的相关文件有:
ADC相关:
adc_sample.c、adc_sample.h等
Oled相关:
oled.c、oled.h、oledfont.h
微信截图_20231223205237.png

WIFI相关:
esp8266.c、esp8266.h、tcp.c、tcp.h等
微信截图_20231223205143.png

UART相关:
uart_sample.c、uart_sample.h等
初始化并创建各个系统任务:
  1. int main(void)
  2. {
  3.     BaseType_t xReturn = pdPASS;    /* 定义一个创建信息返回值,默认为pdPASS */

  4.     CKGEN_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT, g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
  5.     CKGEN_DRV_UpdateConfiguration(0, CLOCK_MANAGER_POLICY_AGREEMENT);
  6.     SystemCoreClockUpdate();
  7. //    InitDebug();

  8.     GPIO_LedInit();
  9.     GPIO_KeyInit();
  10.                 GPIO_OledInit();
  11.                 MY_OLED_Init();
  12.                 ESP8266_Init();
  13.                 ADC_Init();
  14.                 UART1_Polling_Init();
  15.                 WDG_Basic();

  16.     printf("ac7840x test\r\n");

  17.     /* 创建开始任务 */
  18.     xReturn = xTaskCreate((TaskFunction_t)start_task,             /* 任务函数 */
  19.                           (const char*)"start_task",              /* 任务名称 */
  20.                           (configSTACK_DEPTH_TYPE)256,            /* 任务堆栈大小 */
  21.                           (void*)NULL,                            /* 传递给任务函数的参数 */
  22.                           (UBaseType_t)19,                        /* 任务优先级 */
  23.                           (TaskHandle_t*)&StartTask_Handler);     /* 任务句柄 */

  24.     if (pdPASS == xReturn)
  25.     {
  26.         vTaskStartScheduler();                                    /* 开启任务调度 */
  27.     }

  28.     while (1);
  29. }

  30. /* 开始任务函数 */
  31. void start_task(void *pvParameters)
  32. {
  33.     BaseType_t xReturn = pdPASS;    /* 定义一个创建信息返回值,默认为pdPASS */
  34.     taskENTER_CRITICAL();           /* 进入临界区 */

  35.     /* 创建OLED_Task任务 */
  36.     xReturn = xTaskCreate((TaskFunction_t)OLED_Task,
  37.                           (const char*)"OLED_Task",
  38.                           (configSTACK_DEPTH_TYPE)256,
  39.                           (void*)NULL,
  40.                           (UBaseType_t)17,
  41.                           (TaskHandle_t*)&OLED_Task_Handler);
  42.     if (pdPASS == xReturn)
  43.     {
  44.         printf("OLED_Task was created successfully\r\n");
  45.     }else{
  46.                         __NOP();
  47.                 }

  48.     /* 创建WIFI_Task任务 */
  49.     xReturn = xTaskCreate((TaskFunction_t)WIFI_Task,
  50.                           (const char*)"WIFI_Task",
  51.                           (configSTACK_DEPTH_TYPE)256,
  52.                           (void*)NULL,
  53.                           (UBaseType_t)18,
  54.                           (TaskHandle_t*)&WIFI_Task_Handler);
  55.     if (pdPASS == xReturn)
  56.     {
  57.         printf("WIFI_Task was created successfully\r\n");
  58.     }else{
  59.                         __NOP();
  60.                 }

  61.     /* 创建ADC_Task任务 */
  62.     xReturn = xTaskCreate((TaskFunction_t)ADC_Task,
  63.                           (const char*)"ADC_Task",
  64.                           (configSTACK_DEPTH_TYPE)256,
  65.                           (void*)NULL,
  66.                           (UBaseType_t)16,
  67.                           (TaskHandle_t*)&ADC_Task_Handler);
  68.     if (pdPASS == xReturn)
  69.     {
  70.         printf("ADC_Task was created successfully\r\n");
  71.     }else{
  72.                         __NOP();
  73.                 }

  74.     vTaskDelete(StartTask_Handler); /* 删除开始任务 */

  75.     taskEXIT_CRITICAL();            /* 退出临界区 */
  76. }

  77. /* OLED_Task任务函数 */
  78. void OLED_Task(void *pvParameters)
  79. {
  80.     while (1)
  81.     {
  82.         printf("OLED_Task Runing\r\n");
  83.         LED3_TOGGLE;
  84.                                 MY_OLED_START();
  85.         vTaskDelay(500);
  86.     }
  87. }

  88. /* WIFI_Task任务函数 */
  89. void WIFI_Task(void *pvParameters)
  90. {
  91.     while (1)
  92.     {
  93.         printf("WIFI_Task Runing\r\n");
  94.         LED4_TOGGLE;
  95.         vTaskDelay(500);
  96.                                 ESP8266_STA_TCPClient_Test();
  97.     }
  98. }

  99. /* ADC_Task任务函数 */
  100. void ADC_Task(void *pvParameters)
  101. {
  102.     while (1)
  103.     {
  104.         printf("ADC_Task Runing\r\n");
  105.         RGB_Toggle();
  106.                                 ADC_TriggerTest();
  107.                                 WDG_DRV_Trigger(0);
  108.         vTaskDelay(500);
  109.     }
  110. }

配置好任务相关的堆栈大小和调度相关的参数设置:
  1. /* Constants that describe the hardware and memory usage. */
  2. #define configCPU_CLOCK_HZ                    AC7840X_CORE_CLOCK    /* CPU频率 */
  3. #define configTICK_RATE_HZ                    ((TickType_t)1000)    /* 时钟节拍频率,这里设置为1000,周期就是1ms */
  4. #define configTOTAL_HEAP_SIZE                 ((size_t)8192*2)        /* 系统所有总的堆大小 */
  5. #define configMINIMAL_STACK_SIZE              ((uint16_t)128)       /* 空闲任务使用的堆栈大小 */
  6. #define configSUPPORT_DYNAMIC_ALLOCATION      1                     /* 支持动态内存申请 */
  7. #define configSUPPORT_STATIC_ALLOCATION       0                     /* 静态内存申请 */

  8. /* Constants related to the behaviour or the scheduler. */
  9. #define configMAX_PRIORITIES                  30    /* 可使用的最大优先级 */
  10. #define configUSE_PREEMPTION                  1     /* 1使用抢占式内核,0使用协程 */
  11. #define configUSE_TIME_SLICING                1
  12. #define configIDLE_SHOULD_YIELD               0
  13. #define configMAX_TASK_NAME_LEN               (20)  /* 任务名字字符串长度 */
  14. #define configUSE_16_BIT_TICKS                0     /* 系统节拍计数器变量数据类型 */

OLED_Task功能:
LED3闪烁、OLED液晶显示开机字符和4路ADC的采样结果,采用的是十进制显示的;
  1. void Show_WIFI(void)
  2. {
  3.         int ret;
  4.         char s[4][10];
  5.         
  6.         //show data
  7.                 OLED_ShowString(0,0,(unsigned char *)"AC7840x_USART",16);
  8.                 OLED_ShowString(0,2,(unsigned char *)"WIFI_TCP_Client",16);
  9.                 OLED_ShowString(0,4,(unsigned char *)"bbs.21ic.com",16);
  10.                 OLED_ShowString(0,6,(unsigned char *)"id:forgot",16);               
  11. }

  12. //MY TEST 21ic:forgot
  13. void MY_OLED_START(void)
  14. {
  15.     int i;
  16.     static int power_on = 0;
  17.     char Line[4][20];

  18.     if(!power_on) {
  19.         power_on = 1;
  20.         memcpy(&Line[0][0],"Hello 21ic!",sizeof("Hello 21ic!"));
  21.                                 memcpy(&Line[1][0],"ID:forgot",sizeof("ID:forgot"));
  22.         memcpy(&Line[2][0],"AC7840x",sizeof("AC7840x"));
  23.                                 memcpy(&Line[3][0],"FreeRTOS_TEST",sizeof("FreeRTOS_TEST"));
  24.         OLED_Clear();
  25.         for(i = 0; i < 4; i++) {
  26.             OLED_ShowString(0,i*2,(unsigned char *)&Line[i][0],16);
  27.         }
  28.                                 vTaskDelay(2000);
  29.                                 OLED_Clear();
  30.     }
  31.                 Show_WIFI();
  32. }

ADC_Task功能:
RGB闪烁、ADC规则组采集和喂狗;
WIFI_Task功能:
LED4闪烁、WIFI TCP连接和传输ADC采用结果等;
  1. extern uint16_t g_adc_array[4];

  2. void ESP8266_STA_TCPClient_Test(void)
  3. {
  4.     uint8_t res;
  5.                 char str[100]={0};
  6.         
  7.                 ESP8266_Rst();
  8.                 vTaskDelay(2000);
  9.                 ESP8266_USART("AT+RESTORE\r\n");
  10.                 vTaskDelay(1000);
  11.                 ESP8266_USART("AT\r\n");
  12.                 vTaskDelay(1000);
  13.                 ESP8266_USART("AT+CWMODE=1\r\n");
  14.                 vTaskDelay(1000);
  15.     ESP8266_USART("AT+CWJAP="wifi003","88888888888"\r\n");
  16.                 vTaskDelay(20000);
  17.                 ESP8266_USART("AT+CIPMUX=0\r\n");
  18.                 vTaskDelay(1000);
  19.                 ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0);
  20.                 vTaskDelay(1000);
  21.                 ESP8266_USART("AT+CIPMODE=1\r\n");
  22.                 vTaskDelay(1000);
  23.                 ESP8266_USART("AT+CIPSEND\r\n");
  24.                 vTaskDelay(2000);
  25.                 printf("\r\n配置完成");
  26.                
  27.                 while(1){
  28.                         sprintf (str,"ac7840x_freertos_Adc_2_WIFI_TCP_Client\r\n" );
  29.                         ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
  30.                         vTaskDelay(2000);
  31.                         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服务器
  32.                         ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
  33.                         vTaskDelay(2000);
  34.                         sprintf (str,"bbs.21ic.com\r\nid:forgot\r\n");
  35.                         ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
  36.                         vTaskDelay(2000);        
  37.                 }
  38. }

实验效果:
2.png

串口工具
显示配置过程和WIFI连接成功:
微信截图_20231223195856.png

服务端TCP SERVER
连接成功收到数据:
微信截图_20231223200428.png

总结:
      因为没有实验TCP回传,感觉可能用UART 中断方式通信更合适一点,之前UART 中断回调已经提前测试过一下,总体测试还算比较顺利。

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


Diegoronal1 发表于 2023-12-25 23:20 | 显示全部楼层
谢谢!~
Shanyakai 发表于 2024-2-21 16:12 | 显示全部楼层
学习一下
来年秋风起 发表于 2024-2-23 16:02 | 显示全部楼层
long-4321 发表于 2024-2-28 16:18 | 显示全部楼层
谢谢
jhzxzss 发表于 2024-4-16 18:39 来自手机 | 显示全部楼层
谢谢楼主分享!!!
hjtian 发表于 2024-6-2 00:48 | 显示全部楼层
谢谢分享!!!
yuouzy 发表于 2025-1-11 11:09 | 显示全部楼层
谢谢楼主分享!!!
623544074 发表于 2025-3-24 11:19 | 显示全部楼层
谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2064

主题

14491

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部