| 时钟配置 
 
 TIM配置
 
 
 3s一次中断
 
 中断配置
 
 
 开启
 
 复制代码HAL_TIM_Base_Start_IT(&htim1);
复制代码任务中的临界区
static void vTaskLED(void *pvParameters)
{
    while(1)
    {                        
                        uint8_t data[]="LED";
                        taskENTER_CRITICAL();   /* 进入临界区 */
                        HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
                        taskEXIT_CRITICAL();          /* 退出临界区 */        
                        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
                                        vTaskDelay(500);
    }
}
复制代码void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim->Instance==TIM1)
        {
                        uint8_t data[]="TIM1 Interrupt";
                        HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
        }
带有FreeRTOS
 中断的临界区
 
 
 复制代码void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        
        BaseType_t xYieldRequired;
        UBaseType_t uxSavedInterruptStatus;
        uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/
        {
                /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/
                if(htim->Instance==TIM1)
                {
                        uint8_t data[]="TIM1 Interrupt";
                
                        HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
        
                }
        
        }
        portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/
        /** 恢复挂起任务*/
        xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);
        /* 退出中断后是否需要执行任务切换*/
        if( xYieldRequired == pdTRUE )
        {
                portYIELD_FROM_ISR(xYieldRequired);
        }
}
 |