请问有没有FREERTOS+定时器中断的例子啊

目前两个单独运行,都没问题。 但是放在一起,定时器中断要么不进去,要么进去几次就跑飞了。

        我目前在FREERTOS的项目上加的定时器中断,后来把OS停了,包括H文件也注释的。 只保留了TIM3中断,依旧不进入,现在搞不清哪里的问题了。(TIME.H,TIME.C也是从定时器中断项目中复制过来的,一个字没改。 怀疑是RTOS的项目,是不是配置了啥引起定时器中断不工作了)。



特殊声明也做了

void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

CPU是CH32V103C8T6


RTOS里面两个任务,一个闪灯,一个ST7735屏幕显示。  定时器加进去以后,定时器一会就不进入了。  RTOS部分,闪灯有时候还在跑。 但是屏幕是从来没显示过的, 不加中断,屏幕、闪灯都正常。


全套代码在楼下,就简单几行代码,屏蔽了OS。 只开启中断,但是中断不工作,直接在FREERTOS的工程基础上修改的。 麻烦帮忙看下到底啥情况啊。


TIME.C

#include "Time.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟

    TIM_TimeBaseStructure.TIM_Period = 199;   //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。
    TIM_TimeBaseStructure.TIM_Prescaler=7199; //指定用于划分TIM时钟的预分频器值。
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频因子
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式,向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能TIM3中断,允许更新中断

    //初始化TIM NVIC,设置中断优先级分组
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;           //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //设置响应优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断
    NVIC_Init(&NVIC_InitStructure); //初始化NVIC

    TIM_Cmd(TIM3, ENABLE); //TIM3使能
}

void TIM3_IRQHandler(void)
{
    static u8 i=0;
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
    {
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    //清除TIM3的中断挂起位。
        printf("Enter interrupt\n");
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
     }
}


Time.h

#include "ch32v10x_conf.h"

void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));


Main.c

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2020/04/30
 * Description        : Main program body.
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * SPDX-License-Identifier: Apache-2.0
 *******************************************************************************/

/*
 *@Note
 task1 and task2 alternate printing
*/

#include "debug.h"
//#include "pwm.h"
//#include "calibration.h"
//#include "control.h"
//#include "adc.h"
#include "Time.h"
//#include "freeRTOS_task.h"

static void SetSystemCLK_Config(void)
{
    RCC_DeInit();
    //RCC->CR &= ~((uint32_t)RCC_CR_HSEON);   //新加,关闭外部时钟。释放PF0,PF1
    RCC_HSICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

    //RCC_HSEConfig(RCC_HSE_ON);
    //while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);

    //FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
    FLASH->ACTLR = FLASH_ACTLR_PRFTBE | FLASH_ACTLR_LATENCY;

    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);

    //RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_6);
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);       //PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2
    //RCC_PLLConfig(RCC_PLLSource_HSI, RCC_PLLMul_6);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /*if(SysTick_Config(48000000u / 1000))
    {
        while(1) {;}
    }
    */
     /* Wait till PLL is used as system clock source */
    //while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)RCC_SWS_PLL)
    {
    }

    //NVIC_SetPriority(SysTick_IRQn, 0);
    NVIC_SetPriority(SysTicK_IRQn, 0);
}


/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{
    //SetSystemCLK_Config();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n",SystemCoreClock);

    //PWM_Config();
    //Read_ConfigData();
    //PID_Config();

    //ADC_Config();

    GPIO_InitTypeDef GPIO_InitStructure = {0};
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    TIM3_Int_Init(49, 719);         //100us一次? 开了要挂
    //FreeRTOS_Task_Config();

    while(1)
    {
        Delay_Ms(100);
    }
}



你将你中断声明的方式按照下图方式修改一下试试呢

image.png


改了,还是一样的。 就这几行代码,奇了怪了,跟另外一个项目没区别啊。 但是中断就不触发,邪门了。


更新下:目前把项目的FREERTOS目录,加freertosconfig.h删除,再把项目中的这两个加上。 定时器工作正常了,原因未知。

      PARENT-2-PROJECT_LOC/SRC/Ld
    
    
      Startup
      2
      PARENT-2-PROJECT_LOC/SRC/Startup
    
  



不过还没玩,改成这样以后。 我再把FreeRTOS目录,FreeRTOSconfig.h文件拷回去。链接的时候不通过了,提示__freertos_irq_stack_top找不到。  但是Link.ld里面又有。


我后来又改了.cproject中的useByScannerDiscovery="true" (原来是False),现在又报

../FreeRTOS/portable/GCC/RISC-V/portASM.S: Assembler messages:
../FreeRTOS/portable/GCC/RISC-V/portASM.S:116: Error: illegal operands `addi sp,sp,-portCONTEXT_SIZE'
../FreeRTOS/portable/GCC/RISC-V/portASM.S:117: Error: unrecognized opcode `store_x x1,1*portWORD_SIZE(sp)'


我去,不让人活啊。。 目录弄出去,再弄进来,这么大阵仗?


您好,你可以将你的工程发送至我的邮箱(lzs@wch.cn)帮你看一下,或我这边到时候给你提供一个例程。


我的也是出现寄存器宏定义的地方有错,请问您是怎么解决的

image.png


您好,可按照下图配置,在工程属性页勾选汇编预处理选项试一下

image.png


我也有相同的问题:在中断中增加一个断点,仿真好像没有问题。没有断电就跑到硬件错误中去了。


进定时器之前,系统是正常的。


您好,若有用到定时器中断,可以注意一下中断函数是否加了中断声明,关于中断声明,可以参考一下4楼回复。此外需要注意仿真的时候不要有操作FLASH、开启看门狗或低功耗模式的操作


只有登录才能回复,可以选择微信账号登录