0

我对 STM32 和 Keil 中的 C++ 编码相当陌生,我正在为我当前的项目提供一些帮助。我正在使用 Barth STG-850 PLC 样板,它是一个 STM32F091CC 芯片,具有大量 I/O、CAN 外设等。我用它来读取和传输 can 数据以设置某些变量,以及发送速度读数从通过 CAN 的定时器输入来操作巡航控制。到目前为止,我已经成功地设置了主要代码,配置了 I/O,配置了 CAN 外设,并且我已经开始编写定时器输入捕获代码。在 Keil 中使用调试,我看到定时器正在初始化,正在计数,并且在检测到定时器输入引脚上的上升沿时,该值存储在捕获比较寄存器中。从这一点来看,void 函数应该被触发,但它并没有被执行。在我的主要,我有以下几点:

> int main(void) {   /* MCU
> Configuration----------------------------------------------------------*/
> 
>   /* Reset of all peripherals, Initializes the Flash interface and the
> Systick. */   HAL_Init();
> 
>   /* Configure the system clock */   SystemClock_Config();
> 
>   /* Initialize all configured peripherals */   MX_GPIO_Init();  
> MX_ADC_Init();   MX_CAN_Init();   MX_IWDG_Init();   MX_RTC_Init();  
> MX_TIM16_Init();   MX_TIM17_Init();   MX_USART1_UART_Init();  
> MX_USART3_IRDA_Init();   MX_I2C2_Init();   MX_TIM1_Init();  
> MX_TIM2_Init();
>      HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
> 
>   MainInit();     //
> =======================================================================   // Set up baudrate   
hcan.Instance->BTR &= 0xFFFFFC00;
>   hcan.Instance->BTR |= CAN_500K;

被调用的函数是

>
 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{   
    if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        if(Is_First_Captured==0)
    {
        
        TimVal1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);  // capture the first value
        
            Is_First_Captured =1;  // set the first value captured as true
        
    }
        else if (Is_First_Captured)  // if the first is captured
        {
            TimVal2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);  // capture second value

            if (TimVal2 > TimVal1)  
            {
                TimDif = TimVal2-TimVal1;   // calculate the difference
            }

            else if (TimVal2 < TimVal1)
            {
                TimDif = ((0xffff-TimVal1)+TimVal2) +1;
            }

            else
            {
                Error_Handler();
            }

            Freq = HAL_RCC_GetPCLK1Freq()/TimDif;  // calculate frequency
            Speed = (Freq/2.2); // Calculate speed
            Is_First_Captured = 0;  // reset the first captured
            
        }
    }
}

由于某种原因,代码没有被调用,我不知道为什么!启用了全局中断,我尝试过使用不同的计时器等,但没有帮助。所有的中断处理都是在stm320fxx_hal_tim.c中配置的,所以不需要放在main.c文件中吗?

如果有人可以提供帮助,将不胜感激!!谢谢。

4

0 回答 0