Billy Paynter missed the game through injury, and was replaced by Alan O'Brien.
Neither side created many chances in the first half, with the score level at 0-0 at half time.
Swindon started the second half really well and took the lead after 52 minutes with a headed goal from Charlie Austin with his 20th of the season.
Charlton hit the psot, before Swindon made it 2-0 with a goal from Danny Ward who scored after a long run from Simon Ferry before he passed for Ward to score.
On 65 minutes Charlton pulled a goal back after a mix up with David Lucas allowed Burton to score to make it 2-1.
Swindon should ahve extended their lead late on, but Pericard could only hit the post from close range.
Swindon will go into Monday nights second leg only needing a draw to reach Wembley.