自建站需要注册公司吗,美食杰网站的建设目的,佛山网站推广排名,wordpress插件大全STM32 CubeMX STM32 CubeMX #xff08;第三步Freertos中断管理和软件定时#xff09; STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1#xff08;不要选择滴答定时器#xff1b;滴答定时器留给OS系统做时基#xff09;使用STM32 CubeMX 库#xff0c;配置Fre…STM32 CubeMX STM32 CubeMX 第三步Freertos中断管理和软件定时 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1不要选择滴答定时器滴答定时器留给OS系统做时基使用STM32 CubeMX 库配置Freertos使能定时器计时1s中断配置定时器中断优先级 二、实验一中断管理任务代码实验现象 三实验二软件定时器初始化配置初始化代码任务代码实验现象 学习使用Freertos第三步 在 FreeRTOS 中中断管理和软件定时
·taskENTER_CRITICAL()·; 是一个函数在 FreeRTOS 中使用的用于进入临界区critical section。在临界区内中断会被禁用这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用· 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管理
二、实验一中断管理
taskENTER_CRITICAL(); 是一个函数在 FreeRTOS 中使用的用于进入临界区critical section。在临界区内中断会被禁用这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 taskENTER_CRITICAL(); 来禁用中断然后在临界区结束时使用 taskEXIT_CRITICAL(); 来重新启用中断。这样可以防止多个任务同时访问共享资源而导致的竞态条件。
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 */
}任务代码
void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff9600;/* 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 */
}
实验现象 三实验二软件定时器
初始化配置 初始化代码 /* 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);任务代码
void sendTask1(void const * argument)
{/* USER CODE BEGIN sendTask1 */BaseType_t xsatus;uint32_t buff9600;/* 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 */
}
实验现象