yangkaijing 发表于 2024-4-9 20:47:33

STM32+Freertos

大佬们,我用freertos创建2个串口控制上位机的任务,但是2个串口只能有一个能工作,单独测试的时候都没问题,串口接收是用中断去接收的

void WIFI_Task(void *Params)
{
        while (1)
        {
                if (WIFI_RX_STA & 0x8000)
                {
                        if(WIFI_MP3_State() == 0)
                        {
                                if (strstr((const char *)WIFI_RX_BUF, "Trash1"))
                                {
                                        MP3_Star(03);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                                }
                                if (strstr((const char *)WIFI_RX_BUF, "Trash2"))
                                {
                                        MP3_Star(04);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                                }
                                WIFI_MP3_State() == 1;
//                                vTaskDelay(10);
//                                vTaskDelete(NULL);
                        }                       
                        memset(WIFI_RX_BUF, 0, 600); // 将接收区清0
                        WIFI_RX_STA = 0;                       // WIFI模块标志位清零
                }
        }
}

void BlueTooth_Task(void *Params)
{
        while(1)
        {
                if (BlueTooth_RxFlag == 1) // 蓝牙接收到手机发送的数据时
                {
                        switch (BlueTooth_RxData)
                        {
                                if (BlueTooth_MP3_State() == 0)
                                {
                                case '1':
                                        MP3_Star(04);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                                        break;
                                case '2':
                                        MP3_Star(03);
                                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                                        break;
                                default:
                                        break;
                                }
                                BlueTooth_MP3_State() == 1;
//                                vTaskDelay(10);
//                                vTaskDelete(NULL);
                        }
                        BlueTooth_RxFlag = 0; // 蓝牙模块标志位清零

                }
        }
}

void Start_Task(void *Param)
{
        LED_Init();
        MP3_Init();
        WIFI_Init();
        BlueTooth_Init();
       
        taskENTER_CRITICAL(); // 进入临界区

        xTaskCreate((TaskFunction_t)WIFI_Task,                                // 任务函数名
                                (const char *)"WIFI_Task",                                // 任务名称(字符串)
                                (configSTACK_DEPTH_TYPE)256,                        // 任务堆栈大小(128/...)
                                (void *)NULL,                                                        // 任务传递参数(NULL/...)
                                (UBaseType_t)1,                                                        // 任务优先级
                                (TaskHandle_t *)NULL // 任务句柄
        );

        xTaskCreate((TaskFunction_t)BlueTooth_Task,                                // 任务函数名
                                (const char *)"BlueTooth_Task",                                // 任务名称(字符串)
                                (configSTACK_DEPTH_TYPE)256,                        // 任务堆栈大小(128/...)
                                (void *)NULL,                                                        // 任务传递参数(NULL/...)
                                (UBaseType_t)1,                                                        // 任务优先级
                                (TaskHandle_t *)NULL // 任务句柄
        );
        taskEXIT_CRITICAL(); // 退出临界区
        vTaskDelete(NULL);       // 不加无法运行
}

int main(void)
{
        xTaskCreate((TaskFunction_t)Start_Task,                               // 任务函数名
                                (const char *)"Start_Task",                               // 任务名称(字符串)
                                (configSTACK_DEPTH_TYPE)512,                       // 任务堆栈大小(128/...)
                                (void *)NULL,                                                       // 任务传递参数(NULL/...)
                                (UBaseType_t)2,                                                       // 任务优先级
                                (TaskHandle_t *)NULL // 任务句柄
        );

        vTaskStartScheduler(); // 开启任务调度器
}


eric2013 发表于 2024-4-10 09:07:06

两个串口是两个独立的硬件串口吗。

然后两个串口任务里面仅做个串口DR寄存器发送测试即可。

tovinz 发表于 2024-4-10 09:12:35

eric2013 发表于 2024-4-10 09:07
两个串口是两个独立的硬件串口吗。

然后两个串口任务里面仅做个串口DR寄存器发送测试即可。

老师,他这个是不是线程没有释放CPU的原因

eric2013 发表于 2024-4-10 09:51:01

tovinz 发表于 2024-4-10 09:12
老师,他这个是不是线程没有释放CPU的原因

还是你看的仔细,真有可能。

2360985396 发表于 2024-4-10 16:17:27

tovinz 发表于 2024-4-10 09:12
老师,他这个是不是线程没有释放CPU的原因

你的意思是 让该任务sleep吗 但是中断不是应该比任务优先级高吗? cpu不用释放也会被中断抢占把
页: [1]
查看完整版本: STM32+Freertos