|       STM32CubeMX(STM32官网)中已经集成了FREERTOS,这给我们使用RTOS带来不少方便。本评测在STM32CubeMX下建立一个新工程,启用FREERTOS,运行3个任务。项目中添加了STM32Cube_FW_V1.50中的STM32F769I Discovery LCD_DSI驱动,在开发板上的3个任务以不同频率各自点亮/熄灭LED,同时在LCD屏幕上将工作状态实时显示出来。 
 
 
               启用FREERTOS 
 
                                配置系统时钟216MHZ 
 
 
                 配置LED的GPIO为输出 
 
 
           FREERTOS配置,添加3个任务 
 
           把STM32Cube_FW_F7_V1.5.0\Drivers\BSP\STM32F769I-Discovery 文件夹复制到项目的文件夹内, 把STM32Cube_FW_F7_V1.5.0\Drivers\BSP\Components\otm8009a 文件夹复制到项目的文件夹内,    添加LCD驱动
             添加驱动的路径 
 添加相关的STM32F7XX_HAL_Driver 
 LCD初始化在main()函数中 修改freertos.c中的任务复制代码#include "main.h"
#include "stm32f7xx_hal.h"
#include "cmsis_os.h"
#include "usart.h"
#include "gpio.h"
static void LCD_Config(void);
void SystemClock_Config(void);
void Error_Handler(void);
void MX_FREERTOS_Init(void);
int main(void)
{
  SCB_EnableICache();
  SCB_EnableDCache();
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
LCD_Config();
  MX_FREERTOS_Init();
  osKernelStart();
    while (1)
  {
  }
}
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 432;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
   
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
}
static void LCD_Config(void)
{
  uint32_t  lcd_status = LCD_OK;
  lcd_status = BSP_LCD_Init();
  while(lcd_status != LCD_OK);
  BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
  BSP_LCD_Clear(LCD_COLOR_WHITE);
  BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
  BSP_LCD_SetFont(&Font12);
  BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 20, (uint8_t *)"Copyright (c) STMicroelectronics 2016", CENTER_MODE);
  BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
  BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 120);
  BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
  BSP_LCD_SetFont(&Font24);
  BSP_LCD_DisplayStringAt(0, 20, (uint8_t *)"STM32F769I Discovery FreeRTOS Demo", CENTER_MODE);
  BSP_LCD_DisplayStringAt(0, 50, (uint8_t *)"This example shows how to run ", CENTER_MODE);
        BSP_LCD_DisplayStringAt(0, 80, (uint8_t *)"FREERTOS STM32F769I-DISCOVERY applications ", CENTER_MODE);
  BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
  BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
        
        BSP_LCD_DisplayStringAt(150, 200, (uint8_t *)"Task1",LEFT_MODE);
        BSP_LCD_DisplayStringAt(350, 200, (uint8_t *)"Task2",LEFT_MODE);
        BSP_LCD_DisplayStringAt(550, 200, (uint8_t *)"Task2",LEFT_MODE);
  BSP_LCD_SetFont(&Font24);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM7) {
    HAL_IncTick();
  }
}
 复制代码<div>include "stm32f7xx_hal.h"
#include "gpio.h"</div><div>
</div><div>void  Task1(void const * argument)
{static uint8_t i=0;
  for(;;)
  {i++;
                LD_USER1_Torggle();
                if(i&0x01)
                {
                BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
                }
                else
                {
                BSP_LCD_SetTextColor(LCD_COLOR_RED);
                }        
                BSP_LCD_FillCircle(200,300,50);
    osDelay(100);
  }
}
void  Task2(void const * argument)
{static uint8_t j=0;
  for(;;)
  {j++;
                LD_USER2_Torggle();
                if(j&0x01)
                {
                BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
                }
                else
                {
                BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
                }        
                BSP_LCD_FillCircle(400,300,50);
                 osDelay(200);
  }
}
void Task3(void const * argument)
{static uint8_t k=0;
  for(;;)
  {k++;
                LD_USER3_Torggle();
                if(k&0x01)
                {
                BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
                }
                else
                {
                BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
                }        
                BSP_LCD_FillCircle(600,300,50);
    osDelay(1000);
  }
}
</div></div>
 GPIO.h添加DEF 复制代码
#define LD_USER1_Pin GPIO_PIN_13
#define LD_USER1_GPIO_Port GPIOJ
#define LD_USER2_Pin GPIO_PIN_5
#define LD_USER2_GPIO_Port GPIOJ
#define LD_USER3_Pin GPIO_PIN_12
#define LD_USER3_GPIO_Port GPIOA 
#define LD_USER1_ON() HAL_GPIO_WritePin(LD_USER1_GPIO_Port,LD_USER1_Pin,GPIO_PIN_SET)
#define LD_USER1_OFF() HAL_GPIO_WritePin(LD_USER1_GPIO_Port,LD_USER1_Pin,GPIO_PIN_RESET)
#define LD_USER1_Torggle() HAL_GPIO_TogglePin(LD_USER1_GPIO_Port,LD_USER1_Pin)
#define LD_USER2_ON() HAL_GPIO_WritePin(LD_USER2_GPIO_Port,LD_USER2_Pin,GPIO_PIN_SET)
#define LD_USER2_ON() HAL_GPIO_WritePin(LD_USER2_GPIO_Port,LD_USER2_Pin,GPIO_PIN_SET)
#define LD_USER2_Torggle() HAL_GPIO_TogglePin(LD_USER2_GPIO_Port,LD_USER2_Pin)
#define LD_USER3_ON() HAL_GPIO_WritePin(LD_USER3_GPIO_Port,LD_USER3_Pin,GPIO_PIN_SET)
#define LD_USER3_ON() HAL_GPIO_WritePin(LD_USER3_GPIO_Port,LD_USER3_Pin,GPIO_PIN_SET)
#define LD_USER3_Torggle() HAL_GPIO_TogglePin(LD_USER3_GPIO_Port,LD_USER3_Pin)
 
 建一个FREERTOS工程在这里原来是这么简单! 填充画圆是最慢的,在视频中可以看出,STM32F769I多任务处理多个填充画圆是很轻松的。 |