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

查看: 2483|回复: 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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版