我的目标是要有一个计时器,以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。
如果您有任何有关如何解决此问题的建议,或者我想通过其他方式构想代码,以免在保留预期功能的同时避免代码生成,请告诉我。当然,请告诉我是否有一些重要信息我未能分享。
非常感谢!
-本