Dublin made a fine start with Con O’Callaghan slinging over a two-pointer in the second minute, but Donegal gradually settled and while it took until the ninth minute for Eoghan Ban Gallagher to get them off the mark, they began take control.
Conor O’Donnell levelled with Peadar Mogan then punishing a stray Evan Comerford kick-out and Michael Langan added another as the Ulster side led after 16 minutes.
Dublin were struggling to make much headway, but Colm Basquel ended a barren 14-minute spell and added another to level.
After Langan restored the Donegal lead, the goal chances began to present themselves with Morgan blazing wide from an inviting position, but from the subsequent kick-out, Max Campbell intercepted and put Shea Malone who made no mistake, finishing to the roof of the net.
Donegal could have had another goal immediately with Michael Murphy through but blasted too high.
Dublin were rocking, but managed to steady with a pair of scores through Brian Howard and O’Callaghan and after Langan hit back with his third of the half, Cormac Costello had a sight of goal but fired over, while O’Callaghan fisted over his fourth point of the first half to narrow the gap to two.
It was then Donegal goalkeeper Gavin Mulreaney’s turn to slip up as he was punished late in the first half when Paddy Small intercepted a short kick-out and put O’Callaghan in for a simple finish.
It appeared this would give the Dubs an advantage at the break, but in the final minute, Mulreaney went long with Murphy cleverly flicking on, setting Donegal away which resulted in Mogan taking a pass and finding the bottom corner of the net to make it 2-7 to 1-8 at the half.