You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

241 lines
9.5 KiB

2 months ago
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
2 months ago
#include "rgb.h"
#include "usart.h"
2 months ago
/**************************** 任务句柄 ********************************/
/*
*
*
* NULL
*/
static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
static TaskHandle_t Test_Task_Handle = NULL;/* LED任务句柄 */
static TaskHandle_t KEY_Task_Handle = NULL;/* KEY任务句柄 */
/********************************** 内核对象句柄 *********************************/
/*
* 使
*
*
*
*
*
*
*
*/
/******************************* 全局变量声明 ************************************/
/*
*
*/
/*
*************************************************************************
*
*************************************************************************
*/
static void AppTaskCreate(void);/* 用于创建任务 */
static void Test_Task(void* pvParameters);/* Test_Task任务实现 */
static void KEY_Task(void* pvParameters);/* KEY_Task任务实现 */
static void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
//配置时钟源HSE/HSI/LSE/LSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
// RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_8MHz; //配置HSI输出时钟为8MHz
//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_4MHz; //配置HSI输出时钟为4MHz
//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz; //配置HSI输出时钟为16MHz
//RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_22p12MHz; //配置HSI输出时钟为22.12MHz
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_24MHz; //配置HSI输出时钟为24MHz
RCC_OscInitStruct.HSEState = RCC_HSE_ON; //开启HSE
RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; //HSE工作频率范围16M~32M
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.LSIState = RCC_LSI_ON; //开启LSI
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) //初始化RCC振荡器
{
// Error_Handler();
}
//初始化CPU,AHB,APB总线时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; //RCC系统时钟类型
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //SYSCLK的源选择为HSE
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //APH时钟不分频
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; //APB时钟2分频
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) //初始化RCC系统时钟(FLASH_LATENCY_0=24M以下;FLASH_LATENCY_1=48M)
{
// Error_Handler();
}
}
2 months ago
/**
* @brief
*/
static void BSP_Init(void)
{
/* LED 初始化 */
RGB_Init();
/* 串口初始化 */
USART_Config();
}
2 months ago
/*****************************************************************
* @brief
* @param
* @retval
* @note
APP
FreeRTOS
****************************************************************/
int main(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值默认为pdPASS */
SystemClock_Config();
2 months ago
HAL_Init();
2 months ago
/* 开发板硬件初始化 */
BSP_Init();
/* 创建AppTaskCreate任务 */
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */
(const char* )"AppTaskCreate",/* 任务名字 */
(uint16_t )configMINIMAL_STACK_SIZE, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */
/* 启动任务调度 */
if(pdPASS == xReturn)
vTaskStartScheduler(); /* 启动任务,开启调度 */
else
return -1;
while(1); /* 正常不会执行到这里 */
}
/***********************************************************************
* @ AppTaskCreate
* @ 便
* @
* @
**********************************************************************/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值默认为pdPASS */
taskENTER_CRITICAL(); //进入临界区
/* 创建Test_Task任务 */
xReturn = xTaskCreate((TaskFunction_t )Test_Task, /* 任务入口函数 */
(const char* )"Test_Task",/* 任务名字 */
(uint16_t )configMINIMAL_STACK_SIZE, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )2, /* 任务的优先级 */
(TaskHandle_t* )&Test_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn) {
printf("创建Test_Task任务成功!\r\n");
}
/* 创建KEY_Task任务 */
xReturn = xTaskCreate((TaskFunction_t )KEY_Task, /* 任务入口函数 */
(const char* )"KEY_Task",/* 任务名字 */
(uint16_t )configMINIMAL_STACK_SIZE, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )3, /* 任务的优先级 */
(TaskHandle_t* )&KEY_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn) {
printf("创建KEY_Task任务成功!\r\n");
}
vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
taskEXIT_CRITICAL(); //退出临界区
}
int test = 0;
/**********************************************************************
* @ Test_Task
* @ Test_Task
* @
* @
********************************************************************/
static void Test_Task(void* parameter)
{
(void)parameter;
while (1) {
test = configCPU_CLOCK_HZ;
2 months ago
HAL_GPIO_WritePin(LED4_GPIO_PORT, LED4_PIN, GPIO_PIN_RESET);
printf("Test_Task Running,LED1_ON\r\n");
2 months ago
vTaskDelay(pdMS_TO_TICKS(500)); /* 延时500个tick */
2 months ago
HAL_GPIO_WritePin(LED4_GPIO_PORT, LED4_PIN, GPIO_PIN_SET);
printf("Test_Task Running,LED1_OFF\r\n");
2 months ago
vTaskDelay(500); /* 延时500个tick */
}
}
/**********************************************************************
* @ Test_Task
* @ Test_Task
* @
* @
********************************************************************/
static void KEY_Task(void* parameter)
{
(void)parameter;
static uint8_t key_flag = 0;
while (1) {
/* 等待按键按下 */
2 months ago
// if(BSP_PB_GetState(BUTTON_USER))
// {
// vTaskDelay(20);/* 延时20个tick */
// continue;
// }
2 months ago
key_flag = key_flag ? 0 : 1;
// if(key_flag) {
// printf("挂起Test任务\n");
// vTaskSuspend(Test_Task_Handle);/* 挂起LED任务 */
// printf("挂起Test任务成功\n");
// }
//
// if(!key_flag) {/* K2 被按下 */
// printf("恢复Test任务\n");
// vTaskResume(Test_Task_Handle);/* 恢复LED任务 */
// printf("恢复Test任务成功\n");
// }
vTaskDelay(20);/* 延时20个tick */
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
(void)file;
(void)line;
/* User can add their own implementation here */
while (1) {
/* Infinite loop - you could also log the error or trigger a system reset */
}
}
#endif
/********************************END OF FILE****************************/