freertos只能使用 portDISABLE_INTERRUPTS(); portENABLE_INTERRUPTS();打开或者关闭优先级5以上的中断
void starttask(void *pvParameters);
void starttask1(void *pvParameters);
TaskHandle_t starttask_Handle;
TaskHandle_t starttask1_Handle;
int main()
{
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
LED_Init();
USART1_Init(115200);
tim3_init();
tim4_init();
xTaskCreate((TaskFunction_t) starttask,
(char *)"starttask",
(uint16_t)128,
(void *)NULL,
(UBaseType_t)1,
(TaskHandle_t *)&starttask_Handle);
vTaskStartScheduler();
}
void starttask(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t)starttask1,
(char *)"starttask1",
(uint16_t)52,
(void *)NULL,
(UBaseType_t)2,
(TaskHandle_t *)&starttask1_Handle);
vTaskDelete(starttask1_Handle);
taskEXIT_CRITICAL();
}
void starttask1(void *pvParameters){
uint8_t i;
while (1)
{
i++;
LED1 = ~LED1;
vTaskDelay(1000);
if(i == 5){
portDISABLE_INTERRUPTS();
delay_ms(500);
portENABLE_INTERRUPTS();
}
}
}
中断函数
void tim3_init(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructInit;
NVIC_InitTypeDef NVIC_StructInit;
TIM_TimeBaseStructInit.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructInit.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructInit.TIM_Period = 10000-1;
TIM_TimeBaseStructInit.TIM_Prescaler = 3600-1;
TIM_TimeBaseStructInit.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructInit);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn;
NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
NVIC_StructInit.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_StructInit.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_StructInit);
TIM_Cmd(TIM3,ENABLE);
}
void tim4_init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructInit;
NVIC_InitTypeDef NVIC_StructInit;
TIM_TimeBaseStructInit.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructInit.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructInit.TIM_Period = 10000 - 1;
TIM_TimeBaseStructInit.TIM_Prescaler = 3600 - 1;
TIM_TimeBaseStructInit.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructInit);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
NVIC_StructInit.NVIC_IRQChannel = TIM4_IRQn;
NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
NVIC_StructInit.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_StructInit.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_StructInit);
TIM_Cmd(TIM4, ENABLE);
}
void TIM3_IRQHandler(void){
if (TIM_GetITStatus(TIM3, TIM_IT_Update) !=RESET){
printf("tim3 run");
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
printf("tim4 run");
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}