我对 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文件中吗?
如果有人可以提供帮助,将不胜感激!!谢谢。