STM32 CubeMX (第三步Freertos中断管理和软件定时)

STM32 CubeMX


STM32 CubeMX (第三步Freertos中断管理和软件定时)


学习使用Freertos第三步
在 FreeRTOS 中,中断管理和软件定时:

  1. ·taskENTER_CRITICAL()·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用
  2. · taskENTER_CRITICAL()·; 来禁用中断,然后在临界区结束时使用 taskEXIT_CRITICAL();
    来重新启用中断。这样可以防止多个任务同时访问共享资源而导致的竞态条件。

一、STM32 CubeMX设置

时钟配置

HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)

使用STM32 CubeMX 库,配置Freertos

选择CMISS_V1接口就可以满足Freertos接口;且代码量比CMISS_V2小(CMISS_V2支持更多的RTOS接口,所以代码量比CMISS_V1多)

使能定时器,计时1s中断

配置定时器中断优先级

优先级(0~4)不归freertos管理

二、实验一,中断管理

  1. taskENTER_CRITICAL(); 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用
  2. taskENTER_CRITICAL(); 来禁用中断,然后在临界区结束时使用 taskEXIT_CRITICAL();
    来重新启用中断。这样可以防止多个任务同时访问共享资源而导致的竞态条件。
c 复制代码
HAL_TIM_Base_Start_IT(&htim2);//使能
HAL_TIM_Base_Start_IT(&htim3);//使能
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM1) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  if (htim->Instance == TIM2) {
    printf("htim2\r\n");		// printf输出字符串
  }
	
   if (htim->Instance == TIM3) {
    printf("htim3\r\n");		// printf输出字符串
  }
  /* USER CODE END Callback 1 */
}

任务代码

c 复制代码
void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		
  		   HAL_Delay(5000);
		    printf("关闭中断\r\n");		// printf输出字符串
	 	    taskENTER_CRITICAL();//进入临界区,被管理的中断会被禁用
	    	  HAL_Delay(5000);
        printf("打开中断\r\n");		// printf输出字符串
		    taskEXIT_CRITICAL();//退出临界区
  }
  /* USER CODE END sendTask1 */
}

实验现象

三,实验二:软件定时器

初始化配置


初始化代码

c 复制代码
  /* definition and creation of myTimer01 */
  osTimerDef(myTimer01, Callback01);
  myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);

  /* definition and creation of myTimer02 */
  osTimerDef(myTimer02, Callback02);
  myTimer02Handle = osTimerCreate(osTimer(myTimer02), osTimerPeriodic, NULL);
  xTimerChangePeriod(myTimer01Handle,1000,100);
	xTimerChangePeriod(myTimer02Handle,1500,100);

任务代码

c 复制代码
void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		
 
				xTimerStart(myTimer01Handle,portMAX_DELAY);
				xTimerStart(myTimer02Handle,portMAX_DELAY);
				printf("打开中断\r\n");		// printf输出字符串
		    osDelay(10000);
				xTimerStop(myTimer01Handle,portMAX_DELAY);
				xTimerStop(myTimer02Handle,portMAX_DELAY);
				printf("关闭中断\r\n");		// printf输出字符串
				osDelay(5000);
 
  }
  /* USER CODE END sendTask1 */
}

实验现象

相关推荐
李永奉3 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug
执迷不悟8233 小时前
51单片机--中断/定时/PWM
单片机·嵌入式硬件·51单片机
A小调的码农5 小时前
OPENOCD+MSYS+VSCODE:从“灯不亮“到“终于亮了“
ide·vscode·stm32·单片机·编辑器
AI的探索之旅6 小时前
让 Claude Code 直接操刀画原理图和 PCB:VSCode 插件接外部 API 全流程
linux·ide·vscode·嵌入式硬件·编辑器
嵌入式-老费7 小时前
esp32开发与应用(用好ttl转485模块)
stm32·单片机·嵌入式硬件
謓泽8 小时前
【6.30】芯片 Bring-up 三步核心|从短路检查到 SPI 排障全拆解!
单片机·嵌入式硬件
2CM_Embed8 小时前
Quartus II 工程编译与 FPGA 下载流程记录
嵌入式硬件·fpga开发
OIDCAT8 小时前
国产USB转千兆网卡芯片CH398 VLAN应用
网络·嵌入式硬件·国产·usb转千兆网卡
KaifuZeng8 小时前
模电面试问题汇总四
单片机·嵌入式硬件·面试·模电
Industio_触觉智能8 小时前
RK3576开发板GPIO驱动入门教程,基于触觉智能开发板教学-上
嵌入式硬件·硬件工程·智能硬件·开发板·gpio·瑞芯微·rk3576