Мне интересно, есть ли определяемая пользователем встроенная функция ISR в библиотеке HAL, которая срабатывает, как только байт получен в буфере SPIx Rx на MCM STM32L4xx? Например, в качестве теста запуска я хотел бы послать один байт (0xB C) от базовой платы ядра STM32L452 через SPI2 на подчиненную плату ядра STM32L452. Как только ведомая плата получает байт, она мигает светодиодом 2 и передает другой байт (0xCD) обратно ведущему. Как только мастер получает байт, он мигает LED2 в качестве подтверждения. Я инициализировал обе платы как Master / Slave, включил DMA и глобальные прерывания, 8 бит на передачу, используя MXcube. Я могу добиться того, что хочу, используя функции HAL_SPI_Transmit_DMA () и HAL_SPI_Receive_DMA () и задержки, записанные в часть while (1) моей основной подпрограммы (как показано ниже). Однако я хотел бы добиться того же, используя функцию ISR, которая автоматически выполняется при получении байта в буфер приема SPI.
Мастер-код:
uint8_t spiDataReceive = 0;
uint8_t spiDataTransmit = 0xBC;
while(1) {
if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {
//Transmit byte 0xBC to Slave and Receive Response
HAL_SPI_Transmit_DMA(&hspi2, &spiDataTransmit, 1);
HAL_Delay(20);
HAL_SPI_Receive_DMA(&hspi2, &spiDataReceive, 1);
if(spiDataReceive == 0xCD) {
flashLED2();
spiDataReceive = 0x00;
}
}
}
Код ведомого:
uint8_t spiDataReceive = 0;
uint8_t spiDataTransmit = 0xCD;
while(1) {
HAL_SPI_Receive_DMA(&hspi2, &spiDataReceive, 1);
HAL_Delay(10);
if(spiDataReceive == 0xBC) {
HAL_SPI_Transmit_DMA(&hspi2, &spiDataTransmit, 1);
flashLED2();
spiDataReceive = 0x00;
}
}