你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2488|回复: 6

【F769IDISCOVERY评测】评测九 FREERTOS(增补篇)

[复制链接]

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
发表于 2016-12-14 16:37:36 | 显示全部楼层 |阅读模式
      STM32CubeMX(STM32官网)中已经集成了FREERTOS,这给我们使用RTOS带来不少方便。本评测在STM32CubeMX下建立一个新工程,启用FREERTOS,运行3个任务。项目中添加了STM32Cube_FW_V1.50中的STM32F769I Discovery LCD_DSI驱动,在开发板上的3个任务以不同频率各自点亮/熄灭LED,同时在LCD屏幕上将工作状态实时显示出来。


FREERTOS.png

              启用FREERTOS


CLOCK.png
            
                 配置系统时钟216MHZ

LED.png

GPIO.jpg

                配置LED的GPIO为输出


TASK.jpg

          FREERTOS配置,添加3个任务


lcd.jpg
         
STM32Cube_FW_F7_V1.5.0\Drivers\BSP\STM32F769I-Discovery 文件夹复制到项目的文件夹内,
把STM32Cube_FW_F7_V1.5.0\Drivers\BSP\Components\otm8009a 文件夹复制到项目的文件夹内,
   添加LCD驱动

无标题.png
            添加驱动的路径

无标题2.jpg
添加相关的STM32F7XX_HAL_Driver

LCD初始化在main()函数中
  1. #include "main.h"
  2. #include "stm32f7xx_hal.h"
  3. #include "cmsis_os.h"
  4. #include "usart.h"
  5. #include "gpio.h"
  6. static void LCD_Config(void);
  7. void SystemClock_Config(void);
  8. void Error_Handler(void);
  9. void MX_FREERTOS_Init(void);
  10. int main(void)
  11. {
  12.   SCB_EnableICache();
  13.   SCB_EnableDCache();
  14.   HAL_Init();
  15.   SystemClock_Config();
  16.   MX_GPIO_Init();
  17.   MX_USART1_UART_Init();
  18. LCD_Config();
  19.   MX_FREERTOS_Init();
  20.   osKernelStart();
  21.     while (1)
  22.   {
  23.   }
  24. }
  25. void SystemClock_Config(void)
  26. {
  27.   RCC_OscInitTypeDef RCC_OscInitStruct;
  28.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  29.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
  30.   __HAL_RCC_PWR_CLK_ENABLE();
  31.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  32.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  33.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  34.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  35.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  36.   RCC_OscInitStruct.PLL.PLLM = 25;
  37.   RCC_OscInitStruct.PLL.PLLN = 432;
  38.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  39.   RCC_OscInitStruct.PLL.PLLQ = 2;
  40.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  41.   {
  42.     Error_Handler();
  43.   }

  44.    
  45.   if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  46.   {
  47.     Error_Handler();
  48.   }
  49.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  50.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  51.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  52.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  53.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  54.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  55.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
  56.   {
  57.     Error_Handler();
  58.   }

  59.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  60.   PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  61.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  62.   {
  63.     Error_Handler();
  64.   }
  65.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  66.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  67.   HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
  68. }
  69. static void LCD_Config(void)
  70. {
  71.   uint32_t  lcd_status = LCD_OK;
  72.   lcd_status = BSP_LCD_Init();
  73.   while(lcd_status != LCD_OK);
  74.   BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
  75.   BSP_LCD_Clear(LCD_COLOR_WHITE);
  76.   BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
  77.   BSP_LCD_SetFont(&Font12);
  78.   BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 20, (uint8_t *)"Copyright (c) STMicroelectronics 2016", CENTER_MODE);
  79.   BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
  80.   BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 120);
  81.   BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  82.   BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
  83.   BSP_LCD_SetFont(&Font24);
  84.   BSP_LCD_DisplayStringAt(0, 20, (uint8_t *)"STM32F769I Discovery FreeRTOS Demo", CENTER_MODE);
  85.   BSP_LCD_DisplayStringAt(0, 50, (uint8_t *)"This example shows how to run ", CENTER_MODE);
  86.         BSP_LCD_DisplayStringAt(0, 80, (uint8_t *)"FREERTOS STM32F769I-DISCOVERY applications ", CENTER_MODE);
  87.   BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
  88.   BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  89.         
  90.         BSP_LCD_DisplayStringAt(150, 200, (uint8_t *)"Task1",LEFT_MODE);
  91.         BSP_LCD_DisplayStringAt(350, 200, (uint8_t *)"Task2",LEFT_MODE);
  92.         BSP_LCD_DisplayStringAt(550, 200, (uint8_t *)"Task2",LEFT_MODE);
  93.   BSP_LCD_SetFont(&Font24);
  94. }
  95. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  96. {
  97.   if (htim->Instance == TIM7) {
  98.     HAL_IncTick();
  99.   }
  100. }
复制代码
修改freertos.c中的任务
  1. <div>include "stm32f7xx_hal.h"
  2. #include "gpio.h"</div><div>
  3. </div><div>void  Task1(void const * argument)
  4. {static uint8_t i=0;
  5.   for(;;)
  6.   {i++;
  7.                 LD_USER1_Torggle();
  8.                 if(i&0x01)
  9.                 {
  10.                 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  11.                 }
  12.                 else
  13.                 {
  14.                 BSP_LCD_SetTextColor(LCD_COLOR_RED);
  15.                 }        
  16.                 BSP_LCD_FillCircle(200,300,50);
  17.     osDelay(100);
  18.   }
  19. }
  20. void  Task2(void const * argument)
  21. {static uint8_t j=0;
  22.   for(;;)
  23.   {j++;
  24.                 LD_USER2_Torggle();
  25.                 if(j&0x01)
  26.                 {
  27.                 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  28.                 }
  29.                 else
  30.                 {
  31.                 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
  32.                 }        
  33.                 BSP_LCD_FillCircle(400,300,50);
  34.                  osDelay(200);
  35.   }
  36. }
  37. void Task3(void const * argument)
  38. {static uint8_t k=0;
  39.   for(;;)
  40.   {k++;
  41.                 LD_USER3_Torggle();
  42.                 if(k&0x01)
  43.                 {
  44.                 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  45.                 }
  46.                 else
  47.                 {
  48.                 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
  49.                 }        
  50.                 BSP_LCD_FillCircle(600,300,50);
  51.     osDelay(1000);
  52.   }
  53. }


  54. </div></div>
复制代码

GPIO.h添加DEF


  1. #define LD_USER1_Pin GPIO_PIN_13
  2. #define LD_USER1_GPIO_Port GPIOJ

  3. #define LD_USER2_Pin GPIO_PIN_5
  4. #define LD_USER2_GPIO_Port GPIOJ

  5. #define LD_USER3_Pin GPIO_PIN_12
  6. #define LD_USER3_GPIO_Port GPIOA

  7. #define LD_USER1_ON() HAL_GPIO_WritePin(LD_USER1_GPIO_Port,LD_USER1_Pin,GPIO_PIN_SET)
  8. #define LD_USER1_OFF() HAL_GPIO_WritePin(LD_USER1_GPIO_Port,LD_USER1_Pin,GPIO_PIN_RESET)
  9. #define LD_USER1_Torggle() HAL_GPIO_TogglePin(LD_USER1_GPIO_Port,LD_USER1_Pin)

  10. #define LD_USER2_ON() HAL_GPIO_WritePin(LD_USER2_GPIO_Port,LD_USER2_Pin,GPIO_PIN_SET)
  11. #define LD_USER2_ON() HAL_GPIO_WritePin(LD_USER2_GPIO_Port,LD_USER2_Pin,GPIO_PIN_SET)
  12. #define LD_USER2_Torggle() HAL_GPIO_TogglePin(LD_USER2_GPIO_Port,LD_USER2_Pin)

  13. #define LD_USER3_ON() HAL_GPIO_WritePin(LD_USER3_GPIO_Port,LD_USER3_Pin,GPIO_PIN_SET)
  14. #define LD_USER3_ON() HAL_GPIO_WritePin(LD_USER3_GPIO_Port,LD_USER3_Pin,GPIO_PIN_SET)
  15. #define LD_USER3_Torggle() HAL_GPIO_TogglePin(LD_USER3_GPIO_Port,LD_USER3_Pin)
复制代码


建一个FREERTOS工程在这里原来是这么简单!
填充画圆是最慢的,在视频中可以看出,STM32F769I多任务处理多个填充画圆是很轻松的。
STM32F769I_FreeRTOS-HEX.rar (25.82 KB, 下载次数: 7)

评分

参与人数 1ST金币 +20 收起 理由
zero99 + 20

查看全部评分

<
回复

使用道具 举报

10

主题

693

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-6-15
发表于 2016-12-14 17:43:27 | 显示全部楼层
谢谢分享                  
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2016-12-14 17:46:04 | 显示全部楼层

..........
回复 支持 反对

使用道具 举报

6

主题

1026

回帖

7

蝴蝶豆

金牌会员

最后登录
2020-11-25
发表于 2016-12-14 17:47:55 | 显示全部楼层
谢谢分享,写的真详细,不错的教程
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2016-12-14 17:48:56 | 显示全部楼层
leo121_3006061 发表于 2016-12-14 17:47
谢谢分享,写的真详细,不错的教程

..........
回复 支持 反对

使用道具 举报

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2016-12-14 20:18:07 | 显示全部楼层
不错,点灯大法~~~
回复 支持 反对

使用道具 举报

1

主题

60

回帖

0

蝴蝶豆

中级会员

最后登录
2020-7-6
发表于 2018-2-10 22:31:43 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版