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 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 */
}
实验现象
三,实验二:软件定时器
初始化配置
初始化代码
/* 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 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 */
}