Моя цель - иметь таймер, который запускает прерывание с частотой 1 кГц, и для этого вызвать несколько строк кода, который запускает вызов HAL_SPI_TransmitReceive_DMA (или, возможно, более одного на разных шинах SPI).Как только вызовы SPI сделаны, он входит в цикл while, ожидающий завершения связи SPI, затем интерпретирует полученные данные.
Я настроил периферийные устройства таймера (TIM3) и SPI (SPI1), используяSTM32CubeMX.Шина SPI и ее прерывания канала DMA имеют приоритеты NVIC, равные 0, а приоритет прерывания таймера установлен на 10. Я добавил этот код в функцию TIM3_IRQHandler, созданную в файле STM32f4xx_it.c CubeMX.
'' '
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;
}
}
'''
"completeSPI1" объявлен как "volatile int" в верхней части файла.
Моя проблема заключается в том, что код никогда не попадает в функцию обратного вызова SPI, потому что он блокируетсяв "пока (завершено SPI1! = 1);"цикл (второй, под "// imu0 end").Если я закомментирую эту строку, она попадет в функцию обратного вызова (но, конечно, это разрушит функцию кода, поскольку я интерпретирую данные, которые еще не закончила читать).Я чувствую, что у меня должно быть что-то настроено неправильно, так что прерывание таймера имеет более высокий приоритет, чем прерывание SPI, хотя я был уверен, что не буду делать этого в CubeMX.
Другая вещь, которая меня еще больше смутила, этоэтот код в значительной степени скопирован и вставлен из одного из моих предыдущих проектов, который считывает данные с одного и того же датчика таким же образом, и он работал просто отлично.Хотя этот проект был основан на STM32F7, а не на F4.
Пожалуйста, дайте мне знать, если у вас есть какие-либо советы о том, как решить эту проблему, или идеи других способов, которыми я мог бы структурировать свой код, чтобы избежать егопервое место при сохранении предполагаемой функциональности.И, конечно, дайте мне знать, если есть какая-то важная информация, которой я не смог поделиться.
Большое спасибо!
-Ben