|
楼主 |
发表于 2017-7-19 15:37:26
|
显示全部楼层
回 eric2013 的帖子
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_SetTIMforInt
- * 功能说明: 配置 TIM 和 NVIC,用于简单的定时中断. 开启定时中断。 中断服务程序由应用程序实现。
- * 形 参: TIMx : 定时器
- * _ulFreq : 定时频率 (Hz)。 0 表示关闭。
- * _PreemptionPriority : 中断优先级分组
- * _SubPriority : 子优先级
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_SetTIMforInt(TIM_TypeDef* TIMx, uint32_t _ulFreq, uint8_t _PreemptionPriority, uint8_t _SubPriority)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- uint16_t usPeriod;
- uint16_t usPrescaler;
- uint32_t uiTIMxCLK;
- NVIC_InitTypeDef NVIC_InitStructure;
- uint8_t irq = 0;
- /* 使能TIM时钟 */
- if ((TIMx == TIM1))
- {
- RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
- }
- else
- {
- RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
- }
- if (_ulFreq == 0)
- {
- TIM_Cmd(TIMx, DISABLE); /* 关闭定时输出 */
- if (TIMx == TIM1)
- irq = TIM1_UP_IRQn;
- else if (TIMx == TIM2)
- irq = TIM2_IRQn;
- else if (TIMx == TIM3)
- irq = TIM3_IRQn;
- else if (TIMx == TIM4)
- irq = TIM4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannel = irq;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = _PreemptionPriority;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = _SubPriority;
- NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
- NVIC_Init(&NVIC_InitStructure);
- return;
- }
- if ((TIMx == TIM1))
- {
- /* APB2 定时器 */
- uiTIMxCLK = 72000000;
- }
- else /* APB1 定时器 . */
- {
- uiTIMxCLK = 72000000/2; // SystemCoreClock / 2;
- }
- if (_ulFreq < 100)
- {
- usPrescaler = 10000 - 1; /* 分频比 = 1000 */
- usPeriod = (uiTIMxCLK / 10000) / _ulFreq - 1; /* 自动重装的值 */
- }
- else if (_ulFreq < 3000)
- {
- usPrescaler = 100 - 1; /* 分频比 = 100 */
- usPeriod = (uiTIMxCLK / 100) / _ulFreq - 1; /* 自动重装的值 */
- }
- else /* 大于4K的频率,无需分频 */
- {
- usPrescaler = 0; /* 分频比 = 1 */
- usPeriod = uiTIMxCLK / _ulFreq - 1; /* 自动重装的值 */
- }
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period = usPeriod;
- TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
- TIM_ARRPreloadConfig(TIMx, ENABLE);
- /* TIM Interrupts enable */
- TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);
- /* TIMx enable counter */
- TIM_Cmd(TIMx, ENABLE);
- if (TIMx == TIM1)
- irq = TIM1_UP_IRQn;
- else if (TIMx == TIM2)
- irq = TIM2_IRQn;
- else if (TIMx == TIM3)
- irq = TIM3_IRQn;
- else if (TIMx == TIM4)
- irq = TIM4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannel = irq;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = _PreemptionPriority;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = _SubPriority;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- }
复制代码 上面是我的系统定时器,设置的频率也为 2k使用的是 TIM3
eric2013:
看下我们教程的这个章节,有讲解。你贴的程序里面没有看到比滴答定时器分辨率高的定时器初始化
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17658
HI
参考手册移植后发现 vTaskGetRunTimeStats 这个接口打印不出来内容或者只打印一次,我的代码如下,请帮忙看下,谢谢 !- #include "stm32f103_main.h"
- static void vTaskLED1(void *pvParameters);
- static void vTaskLED2(void *pvParameters);
- static void vTaskLED3(void *pvParameters);
- static void vPrintTaskInfo(void *pvParameters);
- static void AppTaskCreate (void);
- static TaskHandle_t xHandleTaskLED1 = NULL;
- static TaskHandle_t xHandleTaskLED2 = NULL;
- static TaskHandle_t xHandleTaskLED3 = NULL;
- static TaskHandle_t xHandleTaskPrint = NULL;
- /*******************************************************************************
- * 函 数 名: vTaskLED1
- * 功能说明: 任务1
- * 形 参: 无
- * 返 回 值: 无
- *******************************************************************************/
- static void vTaskLED1(void *pvParameters)
- {
- while(1)
- {
- Bsp_LEDToggle(LED1);
- vTaskDelay(300);
- }
- }
- /*******************************************************************************
- * 函 数 名: vTaskLED2
- * 功能说明: 任务2
- * 形 参: 无
- * 返 回 值: 无
- *******************************************************************************/
- static void vTaskLED2(void *pvParameters)
- {
- while(1)
- {
- Bsp_LEDToggle(LED2);
- vTaskDelay(400);
- }
- }
- /*******************************************************************************
- * 函 数 名: vTaskLED3
- * 功能说明: 任务3
- * 形 参: 无
- * 返 回 值: 无
- *******************************************************************************/
- static void vTaskLED3(void *pvParameters)
- {
- while(1)
- {
- Bsp_LEDToggle(LED3);
- vTaskDelay(500);
- }
- }
- /*******************************************************************************
- * 函 数 名: vPrintTaskInfo
- * 功能说明: 打印系统运行情况
- * 形 参: 无
- * 返 回 值: 无
- *******************************************************************************/
- static void vPrintTaskInfo(void *pvParameters)
- {
- uint8_t pcWriteBuffer[500];
- while(1)
- {
- printf("--------------------------------------\\r\\n");
- printf("taskname taskstatus taskpronum havestask tasknum\\r\\n");
- vTaskList((char *)&pcWriteBuffer);
- printf("%s\\r\\n", pcWriteBuffer);
- printf(" taskname taskcount usestatus\\r\\n");
- vTaskGetRunTimeStats((char *)&pcWriteBuffer);
- printf(" %s\\r\\n", pcWriteBuffer);
- vTaskDelay(800);
- }
- }
- /*******************************************************************************
- * 函 数 名: AppTaskCreate
- * 功能说明: 创建任务
- * 形 参: 无
- * 返 回 值: 无
- *******************************************************************************/
- static void AppTaskCreate (void)
- {
- //任务函数 任务名称 栈大小 任务参数 优先级 任务句柄
- xTaskCreate( vTaskLED1,"vTaskLED1",512, NULL, 4,&xHandleTaskLED1);
- xTaskCreate( vTaskLED2,"vTaskLED3",512, NULL, 3,&xHandleTaskLED2);
- xTaskCreate( vTaskLED3,"vTaskLED3",512, NULL, 2,&xHandleTaskLED3);
- xTaskCreate( vPrintTaskInfo,"vPrintTask",512, NULL, 1,&xHandleTaskPrint);
-
- }
- int main(void)
- {
- //为了防止初始化 STM32 外设时有中断服务程序执行,这里禁止全局中断(除了 NMI 和 HardFault)
- __set_PRIMASK(1);
- Bsp_Init();
- AppTaskCreate();
- //开始调度
- vTaskStartScheduler();
- while(1);
- }
复制代码 |
|