- 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 中断回调已经提前测试过一下,总体测试还算比较顺利。
附件为完整的评测工程文件: