0

私は STM32 と Keil での C++ のコーディングにはかなり慣れていませんが、現在のプロジェクトを少し手伝ってもらっています。私は Barth STG-850 PLC のようなボードを使用しています。これは STM32F091CC チップであり、多くの I/O、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