STM32CubeMX学习笔记(31)——FreeRTOS实时操作系统使用(互斥量)

发布者:BlissfulDreams最新更新时间:2025-02-12 来源: elecfans关键字:STM32CubeMX  FreeRTOS  实时操作系统  互斥量 手机看文章 扫描二维码
随时随地手机看文章

    printf('The default value of parking space is 5, Press key1 to apply for parking space, and press key2 to release parking space!nn');

  /* USER CODE END 2 */


  /* Create the mutex(es) */

  /* definition and creation of MuxSem */

  osMutexDef(MuxSem);

  MuxSemHandle = osMutexCreate(osMutex(MuxSem));


  /* USER CODE BEGIN RTOS_MUTEX */

  /* add mutexes, ... */

  /* USER CODE END RTOS_MUTEX */


  /* USER CODE BEGIN RTOS_SEMAPHORES */

  /* add semaphores, ... */

  /* USER CODE END RTOS_SEMAPHORES */


  /* USER CODE BEGIN RTOS_TIMERS */

  /* start timers, add new ones, ... */

  /* USER CODE END RTOS_TIMERS */


  /* USER CODE BEGIN RTOS_QUEUES */

  /* add queues, ... */

  /* USER CODE END RTOS_QUEUES */


  /* Create the thread(s) */

  /* definition and creation of defaultTask */

  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);

  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);


  /* definition and creation of LowPriority */

  osThreadDef(LowPriority, LowPriorityTask, osPriorityIdle, 0, 128);

  LowPriorityHandle = osThreadCreate(osThread(LowPriority), NULL);


  /* definition and creation of MidPriority */

  osThreadDef(MidPriority, MidPriorityTask, osPriorityIdle, 0, 128);

  MidPriorityHandle = osThreadCreate(osThread(MidPriority), NULL);


  /* definition and creation of HighPriority */

  osThreadDef(HighPriority, HighPriorityTask, osPriorityIdle, 0, 128);

  HighPriorityHandle = osThreadCreate(osThread(HighPriority), NULL);


  /* USER CODE BEGIN RTOS_THREADS */

  /* add threads, ... */

  /* USER CODE END RTOS_THREADS */


  /* Start scheduler */

  osKernelStart();


  /* We should never get here as control is now taken by the scheduler */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}


/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB buses clocks

  */

  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_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    Error_Handler();

  }

}


/**

  * @brief USART1 Initialization Function

  * @param None

  * @retval None

  */

static void MX_USART1_UART_Init(void)

{


  /* USER CODE BEGIN USART1_Init 0 */


  /* USER CODE END USART1_Init 0 */


  /* USER CODE BEGIN USART1_Init 1 */


  /* USER CODE END USART1_Init 1 */

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN USART1_Init 2 */


  /* USER CODE END USART1_Init 2 */


}


/**

  * Enable DMA controller clock

  */

static void MX_DMA_Init(void)

{


  /* DMA controller clock enable */

  __HAL_RCC_DMA1_CLK_ENABLE();


  /* DMA interrupt init */

  /* DMA1_Channel4_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 5, 0);

  HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);

  /* DMA1_Channel5_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 5, 0);

  HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);


}


/**

  * @brief GPIO Initialization Function

  * @param None

  * @retval None

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};


  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();


  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin|LED_R_Pin, GPIO_PIN_SET);


  /*Configure GPIO pin : KEY2_Pin */

  GPIO_InitStruct.Pin = KEY2_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct);


  /*Configure GPIO pin : KEY1_Pin */

  GPIO_InitStruct.Pin = KEY1_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);


  /*Configure GPIO pins : LED_G_Pin LED_B_Pin LED_R_Pin */

  GPIO_InitStruct.Pin = LED_G_Pin|LED_B_Pin|LED_R_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


}


/* USER CODE BEGIN 4 */

/**

  * @brief 重定向c库函数printf到USARTx

  * @retval None

  */

int fputc(int ch, FILE *f)

{

  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);

  return ch;

}

 

/**

  * @brief 重定向c库函数getchar,scanf到USARTx

  * @retval None

  */

int fgetc(FILE *f)

{

  uint8_t ch = 0;

  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);

  return ch;

}

/* USER CODE END 4 */


/* USER CODE BEGIN Header_StartDefaultTask */

/**

  * @brief  Function implementing the defaultTask thread.

  * @param  argument: Not used

  * @retval None

  */

/* USER CODE END Header_StartDefaultTask */

void StartDefaultTask(void const * argument)

{

  /* USER CODE BEGIN 5 */

  /* Infinite loop */

  for(;;)

  {

    osDelay(1);

  }

  /* USER CODE END 5 */

}


/* USER CODE BEGIN Header_LowPriorityTask */

/**

* @brief Function implementing the LowPriority thread.

* @param argument: Not used

* @retval None

*/

/* USER CODE END Header_LowPriorityTask */

void LowPriorityTask(void const * argument)

{

  /* USER CODE BEGIN LowPriorityTask */

  static uint32_t i; 

  osStatus xReturn;

  /* Infinite loop */

  for(;;)

  {

    printf('LowPriority_Task Get Mutexn');

    //获取互斥量 MuxSem,没获取到则一直等待 

    xReturn = osMutexWait(MuxSemHandle,     /* 互斥量句柄 */ 

                          osWaitForever);   /* 等待时间 */

    if(osOK == xReturn) 

    {

        printf('LowPriority_Task Runingnn'); 

    }

    

    for(i = 0; i < 2000000; i++) 

    { //模拟低优先级任务占用互斥量 

        taskYIELD();//发起任务调度 

    } 

    

    printf('LowPriority_Task Release Mutexrn'); 

    xReturn = osMutexRelease(MuxSemHandle);//给出互斥量 

    

    osDelay(1000);

  }

  /* USER CODE END LowPriorityTask */

}


/* USER CODE BEGIN Header_MidPriorityTask */

/**

* @brief Function implementing the MidPriority thread.

* @param argument: Not used

* @retval None

*/

/* USER CODE END Header_MidPriorityTask */

void MidPriorityTask(void const * argument)

{

  /* USER CODE BEGIN MidPriorityTask */

  /* Infinite loop */

  for(;;)

  {

    printf('MidPriority_Task Runingn'); 

    osDelay(1000);

  }

  /* USER CODE END MidPriorityTask */

}


/* USER CODE BEGIN Header_HighPriorityTask */

/**

* @brief Function implementing the HighPriority thread.

* @param argument: Not used

* @retval None

*/

/* USER CODE END Header_HighPriorityTask */

void HighPriorityTask(void const * argument)

{

  /* USER CODE BEGIN HighPriorityTask */

  osStatus xReturn;

  /* Infinite loop */

  for(;;)

  {

    printf('HighPriority_Task Get Mutexn'); 

    //获取互斥量 MuxSem,没获取到则一直等待 

    xReturn = osMutexWait(MuxSemHandle,     /* 互斥量句柄 */ 

                          osWaitForever);   /* 等待时间 */

    if(osOK == xReturn) 

    {

        printf('HighPriority_Task Runingn'); 

    }

  

    printf('HighPriority_Task Release Mutexrn'); 

    xReturn = osMutexRelease(MuxSemHandle);//给出互斥量


    osDelay(1000);

  }

  /* USER CODE END HighPriorityTask */

}


/**

  * @brief  Period elapsed callback in non blocking mode

  * @note   This function is called  when TIM1 interrupt took place, inside

  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment

  * a global variable 'uwTick' used as application time base.

  * @param  htim : TIM handle

  * @retval None

[1] [2] [3]
关键字:STM32CubeMX  FreeRTOS  实时操作系统  互斥量 引用地址:STM32CubeMX学习笔记(31)——FreeRTOS实时操作系统使用(互斥量)

上一篇:STM32CubeMX学习笔记(33)——FreeRTOS实时操作系统使用(软件定时器)
下一篇:STM32CubeMX学习笔记(30)——FreeRTOS实时操作系统使用(信号量)

推荐阅读最新更新时间:2026-03-06 09:24

FreeRTOS的demo程序如何用STM32CubeMx工具写?
CubeMX的基础使用方法,可以参看我之前发的一个视频STM32打印数据到串口助手。 环境 STM32CubeMX KEIL5 STM32F103 开始试验 新建工程 打开CubeMx软件,点击File-》NewProject。 选择使用的控制器型号。 选择系统时钟源 设置时钟 如下图,在右边红框处输入72,直接按回车键即可,CubeMX会帮你配置好。 选择调试环境 这里要选择Serial wire,否则程序只能下载一次。 设置管脚 使能FreeRTOS 添加任务 点击“Tasks and Queues”,添加Task1和Task2两个任务。 配置工程 生成并打开工程 在源码“Task”字样处添加任务功能代码 编译
[单片机]
<font color='red'>FreeRTOS</font>的demo程序如何用<font color='red'>STM32CubeMx</font>工具写?
ucos-ii示例3:互斥型信号测试
环境: 主机:WIN8 开发环境:MDK4.72 ucgui版本:3.90 ucos版本:ucos-ii mcu: stm32f103VE 说明: 本示例新建一个互斥型信号量,通过此信号量每次只能有1个任务使用资源函数resource 注意: 1.互斥型信号量的创建不能在内核初始化之前 2.互斥型信号量的请求和释放函数只能在同一个任务中执行,如果一个任务请求了信号量,另一个任务释放信号量的操作会失败 3.为了应对信号量导致的不同任务之间的优先级反转,互斥型信号量的创建需要设置一个优先级,且这个优先级必须是尚未使用的,否则会创建失败 效果图: 源码: #define TASK_STK_SIZE 512 /***
[单片机]
ucos-ii示例3:<font color='red'>互斥</font>型信号<font color='red'>量</font>测试
STM32CubeMX生成基于Eclipse的GCC工程(二)移植FreeRTOS操作系统
通过Freertos操作系统是小灯闪烁: 进入STM32Cube工程中,使能FREERTOS 接下来对FreeRTOS配置,首先是参数配置: 接下来配置任务:名字为Task_Sled1,优先级为正常就可以,进入函数为Func_LED0。 生成代码,并拷贝到eclipse工程中,添加库路径: 在Func_LED0函数中加上小灯闪烁的程序,编译一下,会出现如下问题: 只要在freertos.c加一个#include stm32f2xx_hal_def.h 的头文件就好了,这回再编译并调试,全速跑,小灯会闪烁
[单片机]
<font color='red'>STM32CubeMX</font>生成基于Eclipse的GCC工程(二)移植<font color='red'>FreeRTOS</font>操作系统
ucos-ii示例3:互斥型信号测试
环境: 主机:WIN8 开发环境:MDK4.72 ucgui版本:3.90 ucos版本:ucos-ii mcu: stm32f103VE 说明: 本示例新建一个互斥型信号量,通过此信号量每次只能有1个任务使用资源函数resource 注意: 1.互斥型信号量的创建不能在内核初始化之前 2.互斥型信号量的请求和释放函数只能在同一个任务中执行,如果一个任务请求了信号量,另一个任务释放信号量的操作会失败 3.为了应对信号量导致的不同任务之间的优先级反转,互斥型信号量的创建需要设置一个优先级,且这个优先级必须是尚未使用的,否则会创建失败 效果图: 源码: #define TASK_STK_SIZE 512
[单片机]
ucos-ii示例3:<font color='red'>互斥</font>型信号<font color='red'>量</font>测试
Keil5安装+STM32CubeMX安装+VSCode辅助开发教程
本文介绍STM32相关开发工具的安装,包括: Keil5安装 STM32CubeMX安装 VSCode辅助开发 所有需要使用到的安装包下载链接:通过百度网盘分享的文件:embedded-packge.rar 链接:https://pan.baidu.com/s/1XW72C96-WjeZ6hGhTgJ56A?pwd=4jfh 提取码:4jfh 注意:如果你想用VSCode来辅助Keil5开发,网上有很多教程叫你把原来的软件卸载掉,其实没有必要!!!我们只是把VSCode当作代码编辑器,调试和编译交仍然给keil来完成! 视频教程链接: Keil5安装教程_哔哩哔哩_bilibilihttps://www.bilibil
[单片机]
STM32CubeMx 串口通信(下)串口接收
工作环境: STM32CubeMXv6 Keil5 串口调试助手 串口接收相对串口发送而言比较复杂,HAL_UART_Receive是阻塞式的发送,但是我们不可能让一块单片机一直进行监听,通常而言我们都会采用终端的方法完成串口接收。 Cube的基本配置和串口发送是一致的,但最后要添加终端的勾选。 首先打开左侧的下拉框Connectivity,点击USART1选项; 在打开的选单中点击Mode的下拉框,选中Asynchronous; 在下方的配置框中选中Parameter Settings进行配置: Baud Rate:波特率 Word Length:字长 Parity: 奇偶校验 S
[单片机]
STM32 HAL开发环境搭建指南:Keil MDK-ARM、STM32F1xx DFP与ST-Link工具链配置详解,结合STM32CubeMX使
安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法: 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径,避免占用C盘空间。 Core就是Keil(MDK-ARM)的程序安装目录。 Pack是各系列芯片的开发板的开发包的安装目录。 还要填写下用户信息: 然后开始安装: 同意安装“KEIL-Tools By ARM 通用串行总线控制器” 启动之后Keil会自动进行包描述的更新: 我们最好耐心等待它检查完,右下角会有进度: 大概会花费10到20分钟左右的时间 2025-03-29
[单片机]
STM32 HAL开发环境搭建指南:Keil MDK-ARM、STM32F1xx DFP与ST-Link工具链配置详解,结合<font color='red'>STM32CubeMX</font>使
STM32cubeMX安装(2021)
STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。 STM32新手直接学习HAL库,因为STM32的新产品系列已经不支持标准库了,新出的STM32F7,H7,系列不再支持固件库,只能使用HAL库,此外STM32的图形化配置工具STM32CubeMX只支持HAL和LL库,所以没有必要在去学习标准库了。 参考转载:https://blog.csdn.net/as480133937/article/details/98885316 STM32
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved