Я пишу код, который запускает DMA. Как только DMA завершит свою работу, он вызовет ISR_Routine
. Проблема в том, что я хочу убедиться, что refreshComplete
установлен на 0
до запуска DMA. Если DMA запускается первым до того, как refreshComplete
будет установлено на 0
, то возможно, что ISR_Routine
будет вызван первым, в результате чего refreshComplete
будет 0
даже после успешного выполнения DMA. Это означает, что функция ready()
всегда будет возвращать 0, блокируя дальнейшее использование DMA.
Код, который я сейчас написал, состоит в том, что переменная refreshComplete
равна volatile
, и я занят, пока переменная чтения не будет 0
, прежде чем DMA будет работать следующим образом:
volatile uint8 refreshComplete = 0u;
void trigger(void)
{
/* Write 0 and then busy wait */
refreshComplete = 0;
while (refreshComplete != 0);
/* Code to start the DMA */
...
}
/* ISR called once the DMA has completed its operation */
void ISR_Routine(void)
{
refreshComplete = 1u;
}
/* Function to check the status of the DMA */
uint8 ready(void)
{
return refreshComplete;
}
Есть ли способ, которым я всегда могу гарантировать, что код для установки refreshComplete
всегда выполняется перед кодом для настройки и запуска DMA?