STM32F4上的计时器和SPI之间的中断优先级问题

时间:2019-04-29 18:36:10

标签: timer interrupt spi stm32f4discovery

我的目标是要有一个计时器,以1kHz的频率触发中断,并为此而调用几行代码,以启动HAL_SPI_TransmitReceive_DMA调用(或在不同的SPI总线上调用多个)。进行SPI调用后,它将进入while循环,等待SPI通信完成,然后解释收到的数据。

我已经使用STM32CubeMX设置了计时器(TIM3)和SPI(SPI1)外设。 SPI总线及其DMA通道中断的NVIC优先级为0,而定时器中断优先级设置为10。我将此代码添加到CubeMX在STM32f4xx_it.c文件中创建的TIM3_IRQHandler函数中。

'''

void TIM3_IRQHandler(void) {
    /* USER CODE BEGIN TIM3_IRQn 0 */

    imu_Tx[0] = FirstData_Reg | SPIReadMask;
    while (completedSPI1 != 1);
    //imu0 start
    HAL_GPIO_WritePin(ICM0.CS_Port, ICM0.CS_Pin, GPIO_PIN_RESET);
    completedSPI1 = 0;

    HAL_SPI_TransmitReceive_DMA(&hspi1, imu_Tx, imu0_reading, 15);

    //imu0 end
    while (completedSPI1 != 1);
    imu_reading_to_data(IMU0_data, imu0_reading);
    imu_int_to_norm_float(IMU0_floats, IMU0_data, &ICM0);

    /* USER CODE END TIM3_IRQn 0 */
    HAL_TIM_IRQHandler(&htim3);
    /* USER CODE BEGIN TIM3_IRQn 1 */

    /* USER CODE END TIM3_IRQn 1 */
}

'''

我还在STM32f4xx_it.c的末尾添加了此功能:

'''

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) {
    if (hspi == &hspi1){
        HAL_GPIO_WritePin(ICM0.CS_Port, ICM0.CS_Pin, GPIO_PIN_SET);
        completedSPI1 = 1;
    }
}

'''

“ completedSPI1”在文件顶部声明为“ volatile int”。

我的问题是代码永远不会进入SPI回调函数,因为它被锁定在“ while(completedSPI1!= 1);”中。循环(第二个,在“ // imu0 end”下)。如果我注释掉那行,它确实会到达回调函数(但是,由于我要解释尚未读完的数据,因此当然会破坏代码的功能)。我觉得我必须配置某些错误的内容,以使计时器中断的优先级高于SPI中断,即使我确定在CubeMX中也不会这样做。

让我特别困惑的另一件事是,这段代码几乎是从我以前的一个项目中复制并粘贴的,该项目以相同的方式从同一传感器读取数据,并且工作得很好。尽管该项目基于STM32F7,而不是F4。

如果您有任何有关如何解决此问题的建议,或者我想通过其他方式构想代码,以免在保留预期功能的同时避免代码生成,请告诉我。当然,请告诉我是否有一些重要信息我未能分享。

非常感谢!

-本

0 个答案:

没有答案