[其他ST产品] STM32F427移植FreeRTOS

[复制链接]
1926|41
 楼主| 呈兴 发表于 2022-12-31 15:15 | 显示全部楼层 |阅读模式
移植FreeRTOS

老步骤在我上一节就说了,现在移植到F427上面只需要改点程序
首先第一步是替换include文件里面的FreeRTOSConfig.h文件。新的FreeRTOSConfig.h文件在demo里面找如下面第二张图


968163afe160ea958.png
8688863afe1678d47c.png
 楼主| 呈兴 发表于 2022-12-31 15:20 | 显示全部楼层
然后就是第二步修改FreeRTOSConfig.h文件
 楼主| 呈兴 发表于 2022-12-31 15:20 | 显示全部楼层
 楼主| 呈兴 发表于 2022-12-31 15:22 | 显示全部楼层
改成
  1. #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
  2.         #include <stdint.h>
  3.         extern uint32_t SystemCoreClock;
  4. #endif
 楼主| 呈兴 发表于 2022-12-31 15:23 | 显示全部楼层
然后改一下FreeRTOSConfig.h下面的宏定义和注释掉第126行的代码,ok这样FreeRTOSConfig.h就配置完成了
 楼主| 呈兴 发表于 2022-12-31 15:25 | 显示全部楼层
#define configUSE_IDLE_HOOK                                0
#define configUSE_TICK_HOOK                                0
#define configCHECK_FOR_STACK_OVERFLOW        0
#define configUSE_MALLOC_FAILED_HOOK        0
//#define xPortSysTickHandler SysTick_Handler
 楼主| 呈兴 发表于 2022-12-31 22:11 | 显示全部楼层
然后我使用了静态的栈所以还要打开FrRTOSconfig.h文件将下面标志开启
6690163b043113799d.png
 楼主| 呈兴 发表于 2022-12-31 22:12 | 显示全部楼层
然后在main.c或者自己另外写一个文件写两个源文件,我是在main.c里面添加的
 楼主| 呈兴 发表于 2022-12-31 22:12 | 显示全部楼层
  1. StackType_t xIdle3Static[1500];
  2. StaticTask_t xIdleTCB;

  3. StackType_t xITimeStatic[1500];
  4. StaticTask_t xITimeTCB;

  5. void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize ){
  6.                         *ppxIdleTaskTCBBuffer=&xIdleTCB;                               
  7.                         *ppxIdleTaskStackBuffer=xIdle3Static;
  8.                         *pulIdleTaskStackSize=1500;
  9. }
  10. void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
  11.                                           StackType_t ** ppxTimerTaskStackBuffer,
  12.                                               uint32_t * pulTimerTaskStackSize ){
  13.                         * ppxTimerTaskTCBBuffer=&xITimeTCB;                                                                                                                                                                       
  14.                         * ppxTimerTaskStackBuffer=xITimeStatic;
  15.                         * pulTimerTaskStackSize        =1500;                                                                                                                                                       
  16. }
 楼主| 呈兴 发表于 2022-12-31 22:13 | 显示全部楼层
然后在修改usart.c文件,因为我串口一是用的正点原子的hal库,这里需要修改第六行的代码
  1. #if SYSTEM_SUPPORT_OS
  2. #include "FreeRTOS.h"                                        //os ʹԃ          

  3. #endif
 楼主| 呈兴 发表于 2022-12-31 22:15 | 显示全部楼层
最后在stm32f4xx_it.h文件添加下面代码
  1. #include "FreeRTOS.h"
  2. #include "task.h"

  3. void SysTick_Handler(void)
  4. {
  5. #if (INCLUDE_xTaskGetSchedulerState == 1 )
  6. if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  7.         {
  8. #endif
  9.   xPortSysTickHandler();
  10. #if (INCLUDE_xTaskGetSchedulerState == 1 )
  11. }
  12. #endif
  13.        
  14. }
 楼主| 呈兴 发表于 2022-12-31 22:16 | 显示全部楼层
这就完成了

二、成果展示
1.图片展示
这是我学习lvgl后自己做的第一个实战项目,主要涉及到->lvgl+freeRTOS+TCP连接+ILI9488显示驱动
8755363b0442010dc6.png
4630063b04426bbe4c.png
 楼主| 呈兴 发表于 2022-12-31 22:18 | 显示全部楼层
部分代码展示
main.h文件因为是今天才写完还没抽时间把有些代码封装成库,main.c有点乱,等有时间我在把他封装成库
代码如下(示例):
  1. #include "main.h"
  2. #include "gpio.h"
  3. #include "USART.h"
  4. #include "Delay.h"
  5. #include "i2c.h"
  6. #include "AHT10_S.h"
  7. #include "lcd.h"
  8. #include "stdio.h"
  9. #include "touch.h"
  10. #include "tim.h"
  11. #include "lvgl.h"
  12. #include "lv_port_disp.h"
  13. #include "lv_port_indev.h"
  14. #include "ADC.h"
  15. #include "WIFI.h"
  16. #include "usart2.h"
  17. #include "cJSON.h"
  18. #include "lvgl_text.h"
  19. #include "jonsson.h"
  20. #include "time10.h"
  21. #include "FreeRTOS.h"
  22. #include "task.h"

  23. void GET_Time();
  24. void GET_DATA();


  25. int64_t st_time;
  26. int64_t end_time;

  27. int64_t st_data;
  28. int64_t end_data;
  29. char HUMI[64];
  30. char TEMP[64];

  31. uint8_t cp_time_buff[1024];
  32. char* time_p;
  33. char* weed_p;

  34. cJSON* TIME;
  35. cJSON* result;
  36. cJSON* DAT;

  37. char* one_p;
  38. char* tow_p;
  39. char* three_p;

  40. int16_t temp1;
  41. int16_t humi1;
  42. StackType_t xTask3Static[1500];
  43. StaticTask_t xTaskTCB;

  44. StackType_t xIdle3Static[1500];
  45. StaticTask_t xIdleTCB;

  46. StackType_t xITimeStatic[1500];
  47. StaticTask_t xITimeTCB;

  48. void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize ){
  49.                         *ppxIdleTaskTCBBuffer=&xIdleTCB;                               
  50.                         *ppxIdleTaskStackBuffer=xIdle3Static;
  51.                         *pulIdleTaskStackSize=1500;
  52. }
  53. void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
  54.                                           StackType_t ** ppxTimerTaskStackBuffer,
  55.                                               uint32_t * pulTimerTaskStackSize ){
  56.                         * ppxTimerTaskTCBBuffer=&xITimeTCB;                                                                                                                                                                       
  57.                         * ppxTimerTaskStackBuffer=xITimeStatic;
  58.                         * pulTimerTaskStackSize        =1500;                                                                                                                                                       
  59. }
  60. void Task1Funtion(void* param){
  61.        
  62.         for(;;){

  63.                
  64.         }
  65.        
  66. }

  67. void Task2Funtion(void* param){
  68.         AT_GET_Weather_dat();       
  69.         JSON_CP_Dat(Rxbuff);
  70.         printf("--------------------------------------------------------\r\n");
  71.         AT_GET_API_TIME();
  72.        
  73.   for(;;)
  74.   {
  75.                 vTaskDelay(20000);
  76.                 GET_DATA();
  77.                 GET_Time();
  78.           //GET_Time();
  79.                 //vTaskDelay(1);
  80.   }
  81. }       

  82. void Task3Funtion(void* param){
  83.                 LCD_Init();
  84.           tp_dev.init();       
  85.                 lv_init();
  86.                 lv_port_disp_init();
  87.                 lv_port_indev_init();       
  88.                
  89.                 lvgl_dome();
  90.                
  91.                 //解析时间               
  92.                 JSON_Read_buf(CP_Rxbuff);
  93.                 JSON_GET_three_Dat(data);
  94.                 lv_label_set_text(label_days,one_dat);
  95.                 one_p=one_dat+6;
  96.                 tow_p=tow_dat+6;
  97.                 three_p=three_dat+6;
  98.                 lv_label_set_text(Time_one,one_p);
  99.                 lv_label_set_text(Time_tow,tow_p);
  100.                 lv_label_set_text(Time_three,three_p);
  101.                 //解析温度
  102.                 JSON_Read_buf(CP_Rxbuff);
  103.                 JSON_GET_three_Dat(high);
  104.                 sprintf(TEMP,"%sC",one_dat);
  105.                 int temp_dat=atoi(one_dat);
  106.                 lv_label_set_text(temp_label,TEMP);
  107.                
  108.                 //解析湿度
  109.                 JSON_Read_buf(CP_Rxbuff);
  110.                 JSON_GET_three_Dat(humidity);
  111.                 sprintf(HUMI,"%s%%",one_dat);
  112.                 int humi_dat=atoi(one_dat);
  113.                 lv_label_set_text(humi_label,HUMI);
  114.                 lvgl_Indoor_humi_temp_display(temp_dat,humi_dat);
  115.                 chart_display_now(temp_dat,humi_dat);
  116.                 //解析天气
  117.                 JSON_Read_buf(CP_Rxbuff);
  118.                 JSON_GET_three_Dat(code_day);
  119.                 int weather=atoi(one_dat);
  120.                 int weather_tow=atoi(tow_dat);
  121.                 int weather_three=atoi(three_dat);
  122.                 lvgl_Right_display_weather(weather);
  123.                 lvgl_weather_one_display(weather);
  124.     lvgl_weather_tow_display(weather_tow);
  125.     lvgl_weather_three_display(weather_three);
  126.                 //解析时间
  127.                 TIME=cJSON_Parse((char*)Rxbuff);
  128.                 result=cJSON_GetObjectItem(TIME,"result");
  129.                 //cJSON* Date=cJSON_GetArrayItem(result,0);
  130.                 DAT=cJSON_GetObjectItem(result,"datetime_1");
  131.                 time_p=DAT->valuestring+11;
  132.                 printf("\r\nTIME=%s\r\n",time_p);
  133.                 lv_label_set_text(label_time,time_p);
  134.                 cJSON_Delete(TIME);       
  135.                 //解析星期
  136.                 TIME=cJSON_Parse((char*)Rxbuff);
  137.                 result=cJSON_GetObjectItem(TIME,"result");
  138.                 DAT=cJSON_GetObjectItem(result,"week_1");
  139.                 weed_p=DAT->valuestring;
  140.                 printf("WEED=%s\r\n",weed_p);
  141.                 int weed=atoi(weed_p);
  142.                 lvgl_Right_display_weed(weed);
  143.                 lvgl_Weed_display(weed);
  144.                 cJSON_Delete(TIME);       
  145.                
  146.                 uint32_t i;
  147.         while(1){
  148.                 tp_dev.scan(0);
  149.                 lv_task_handler();       
  150.         }
  151.        
  152. }
  153. int main(void)
  154. {
  155.                 TaskHandle_t xTask;
  156.     HAL_Init();
  157.     SystemClock_Config();
  158.                 MX_GPIO_Init();
  159.     Delay_init(180);
  160.            ADC_Config();
  161.                 uart_init(115200);
  162.                 printf("begin...\r\n");
  163.                 USART_config();
  164.           
  165.                 MX_TIM8_Init();
  166.                

  167.                 xTaskCreate(Task1Funtion,"Task1",1500,NULL,1,&xTask);
  168.                 xTaskCreate(Task2Funtion,"Task2",1500,NULL,1,NULL);
  169.                
  170.                 xTaskCreateStatic(Task3Funtion,"Task3",1500,NULL,1,xTask3Static,&xTaskTCB);
  171.        
  172.                 vTaskStartScheduler();
  173.                
  174.   while (1)
  175.   {
  176.         //        GET_DATA(20000);
  177.         //        GET_Time(600000);
  178.                 //atoi();//字符串转整形
  179.         //        tp_dev.scan(0);
  180.         //        lv_task_handler();
  181.   }

  182. }
  183. //**********************刷新时间
  184. void GET_DATA(){

  185.                 AT_WIFIMODE(STA);
  186.                 printf("\n");
  187.                 AT_CONNECT_WIFI(ssid,pass);
  188.                 printf("\n");
  189.                 AT_Connect_TCP(TCP_IP_TIME);
  190.                 printf("\n");
  191.                 AT_SET_TCPMODE(PT);
  192.                 printf("\n");
  193.                 AT_SEND_TCP();
  194.                 AT_SEND_MES(TCP_GET_TIMES);
  195.                 AT_BAKE_SEND();
  196.                 //解析时间
  197.                 cJSON* TIME=cJSON_Parse((char*)Rxbuff);
  198.                 cJSON* result=cJSON_GetObjectItem(TIME,"result");
  199.                 //cJSON* Date=cJSON_GetArrayItem(result,0);
  200.                 cJSON* DAT=cJSON_GetObjectItem(result,"datetime_1");
  201.                 time_p=DAT->valuestring+11;
  202.                 printf("\r\nTIME=%s\r\n",time_p);
  203.                 cJSON_Delete(TIME);       
  204.                 lv_label_set_text(label_time,time_p);
  205.                 //解析星期
  206.                 TIME=cJSON_Parse((char*)Rxbuff);
  207.                 result=cJSON_GetObjectItem(TIME,"result");
  208.                 DAT=cJSON_GetObjectItem(result,"week_1");
  209.                 weed_p=DAT->valuestring;
  210.                 printf("\r\nWEED=%s\r\n",weed_p);
  211.                 int weed=atoi(weed_p);
  212.                 lvgl_Right_display_weed(weed);
  213.                 lvgl_Weed_display(weed);
  214.                 cJSON_Delete(TIME);       
  215.                

  216.        
  217. }

  218. //************************************刷新温湿度和日期
  219. void GET_Time(){
  220.        
  221.        
  222.                 AT_GET_Weather_dat();
  223.                 JSON_CP_Dat(Rxbuff);
  224.                 JSON_Read_buf(CP_Rxbuff);
  225.                 JSON_GET_three_Dat(data);
  226.                 lv_label_set_text(label_days,one_dat);
  227.                 one_p=one_dat+6;
  228.                 tow_p=tow_dat+6;
  229.                 three_p=three_dat+6;
  230.                 lv_label_set_text(Time_one,one_p);
  231.                 lv_label_set_text(Time_tow,tow_p);
  232.                 lv_label_set_text(Time_three,three_p);
  233.                
  234.                 //解析温度
  235.                 JSON_CP_Dat(Rxbuff);
  236.                 JSON_Read_buf(CP_Rxbuff);
  237.                 JSON_GET_three_Dat(high);
  238.                 sprintf(TEMP,"%sC",one_dat);
  239.                 int temp_dat=atoi(one_dat);
  240.                 lv_label_set_text(temp_label,TEMP);
  241.                 //解析湿度
  242.                 JSON_CP_Dat(Rxbuff);
  243.                 JSON_Read_buf(CP_Rxbuff);
  244.                 JSON_GET_three_Dat(humidity);
  245.                 sprintf(HUMI,"%s%%",one_dat);
  246.                 int humi_dat=atoi(one_dat);
  247.                 lv_label_set_text(humi_label,HUMI);
  248.                 lvgl_Indoor_humi_temp_display(temp_dat,humi_dat);
  249.                 chart_display_now(temp_dat,humi_dat);
  250.                 //解析天气
  251.                 JSON_CP_Dat(Rxbuff);
  252.                 JSON_Read_buf(CP_Rxbuff);
  253.                 JSON_GET_three_Dat(code_day);
  254.                 int weather=atoi(one_dat);
  255.                 int weather_tow=atoi(tow_dat);
  256.                 int weather_three=atoi(three_dat);
  257.                 lvgl_Right_display_weather(weather);
  258.                 lvgl_weather_one_display(weather);
  259.     lvgl_weather_tow_display(weather_tow);
  260.     lvgl_weather_three_display(weather_three);
  261.                        
  262. }




 楼主| 呈兴 发表于 2022-12-31 22:19 | 显示全部楼层
总结
lvgl+freeRTOS的项目历经我几天时间终于完成一半,有个雏形了。还是可以。后面慢慢优化

Bowclad 发表于 2023-1-1 16:08 | 显示全部楼层
有别人的例程参考改起来很方便
tifmill 发表于 2023-1-5 12:03 | 显示全部楼层
可以使用是stm32cubemx生成工程文件。
febgxu 发表于 2023-1-6 15:06 | 显示全部楼层
使用的驱动时钟是什么?              
lzbf 发表于 2023-1-6 19:23 | 显示全部楼层
有什么需要注意的地方呢?              
sesefadou 发表于 2023-1-6 22:35 | 显示全部楼层
这个移植代码有什么需要注意的?              
timfordlare 发表于 2023-1-9 12:31 | 显示全部楼层
这个需要修改堆栈的大小的吗、              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

150

帖子

1

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