FreeRTOS 中斷測試實驗
設定:FreeRTOS 中優先級低于 configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷會被屏蔽掉,高于的就不會,那么我們就寫個簡單的例程測試一下。
使用兩個定時器,一個優先級為 4,一個優先級為 5,兩個定時器每隔 1s 通過串口輸出一串字符串。然后在某個任務中關閉中斷一段時間,查看兩個定時器的輸出情況。
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "FreeRTOS.h"
#include "task.h"
#define START_TASK_PRIO 1
#define START_STK_SIZE 256
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define INTERRUPT_TASK_PRIO 2
#define INTERRUPT_STK_SIZE 256
TaskHandle_t INTERRUPTTask_Handler;
void interrupt_task(void *p_arg);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init();
uart_init(115200);
LED_Init();
//起了兩個定時器,不停的打印,除非中斷被關閉
TIM3_Int_Init(10000-1,7200-1);
TIM5_Int_Init(10000-1,7200-1);
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
vTaskStartScheduler();
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )interrupt_task,
(const char* )"interrupt_task",
(uint16_t )INTERRUPT_STK_SIZE,
(void* )NULL,
(UBaseType_t )INTERRUPT_TASK_PRIO,
(TaskHandle_t* )&INTERRUPTTask_Handler);
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
void interrupt_task(void *pvParameters)
{
static u32 total_num=0;
while(1)
{
printf("秒數",total_num);
total_num+=1;
if(total_num==5)
{
printf("關閉中斷.............rn");
portDISABLE_INTERRUPTS();
delay_xms(5000);
printf("打開中斷.............rn");
portENABLE_INTERRUPTS();
}
LED0=~LED0;
vTaskDelay(1000);
}
}
timer.c
#include "timer.h"
#include "led.h"
#include "led.h"
#include "usart.h"
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE);
}
void TIM5_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM5, ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
printf("TIM3輸出.......rn");
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)
{
printf("TIM5輸出.......rn");
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}
另外還有一些延時函數和串口初始化,這個都是基礎的文件,可以直接copy的,就不放出來了。
編譯并下載代碼到開發板中,打開串口調試助手查看數據輸出:

一開始沒有關閉中斷,所以 TIM3 和 TIM5 都正常運行,紅框所示部分。當任務 interrupt_task()運行了 5 次以后就關閉了中斷,此時由于 TIM5 的中斷優先級為 5,等于configMAX_SYSCALL_INTERRUPT_PRIORITY,因此 TIM5 被關閉。但是,TIM3 的中斷優先級高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,不會被關閉,所以 TIM3 正常運行,綠框所示部分。中斷關閉 5S 以后就會調用函數 portENABLE_INTERRUPTS()重新打開中斷,重新打開中斷以后 TIM5 恢復運行,藍框所示部分。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
測試
+關注
關注
9文章
6201瀏覽量
131347 -
嵌入式
+關注
關注
5198文章
20442瀏覽量
333986 -
中斷
+關注
關注
5文章
917瀏覽量
43754 -
定時器
+關注
關注
23文章
3368瀏覽量
123593 -
FreeRTOS
+關注
關注
14文章
499瀏覽量
66932
發布評論請先 登錄
相關推薦
熱點推薦
在FreeRTOS中斷實驗中,在任務中關閉中斷,即使沒有開啟中斷,中斷仍在執行的原因?
=~LED0;vTaskDelay(1000); }}//我把最后打開中斷的函數屏蔽掉了,但中斷仍在繼續。此實驗完整代碼就是發燒友FreeRTOS中
發表于 06-18 05:16
FreeRTOS中斷實驗沒有反應的原因?
按照 《STM32F103 FreeRTOS開發手冊V1.1》 一步一步做的實驗,在初始化的時候把time3_init()和time5_init()放在uart_init()前面,下載到板子里就沒
發表于 07-08 05:02
基于STM32應用的FreeRTOS中斷設置
一、FreeRTOS中斷設置介紹 FreeRTOSConfig.h中定義了兩個宏,分別是: configKERNEL_INTERRUPT_PRIORITY
發表于 11-29 19:46
?2717次閱讀
FreeRTOS學習筆記--臨界段代碼處關閉中斷
FreeRTOS學習筆記--臨界段代碼處關閉中斷一、臨界段代碼二、Cortex-M4中斷管理三、中斷屏蔽實驗四、結語一、臨界段代碼大家在學習
發表于 12-04 14:51
?10次下載
stm32cubemx 配置FreeRTOS相關基礎基礎知識及串口接收中斷實驗
本實驗首先大家自身要有stm32cubemx基礎配置,比如GPIO、中斷、串口、SPI等,FreeRTOS有相關的調用函數基礎及調度任務的概念都需要提前理解。單獨stm32cubemx或
發表于 12-14 18:44
?21次下載
FREERTOS中斷組屏蔽實驗
FREERTOS中斷組屏蔽實驗Cortex M中斷管理(該段取自正點原子FREETRTOS開發手冊,我覺得比較詳細了)當多個中斷來臨的時候處
發表于 12-31 19:16
?6次下載
STM32之FreeRTOS:(一) 中斷配置和臨界段的使用
STM32之FreeRTOS:(一) 中斷配置和臨界段的使用文章目錄STM32之FreeRTOS:(一) 中斷配置和臨界段的使用前言 一、stm32的NVIC 分組配置二、
發表于 01-14 15:43
?3次下載
FreeRTOS開關中斷定義
FreeRTOS 開關中斷 FreeRTOS 開關中斷函數為 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS(),這兩個函數其實是宏定
freertos中斷優先級在哪設置
FreeRTOS是一個流行的實時操作系統,它廣泛應用于嵌入式系統開發。在FreeRTOS中,中斷優先級是一個重要的概念,因為它決定了中斷處理的順序和響應時間。 1. 理解
FreeRTOS中斷測試實驗
評論