Проблема приоритета прерывания между таймером и spi на STM32F4 - PullRequest
0 голосов
/ 29 апреля 2019

Моя цель - иметь таймер, который запускает прерывание с частотой 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

...