Freddie Freeman started the two-run rally with a leadoff single in the ninth. Cardinals closer Trevor Rosenthal, pitching for the fourth time in as many days, retired the next two before Ryan Doumit came up with a pinch-hit double that sent Freeman to third. Rosenthal intentionally walked Evan Gattis and Jordan Schafer worked a game-tying bases-loaded walk.
Schafer's at-bat was sweet redemption for the Braves center fielder, who almost cost the team the game after losing a fly ball in the sun in the seventh. Schafer worked the count full before taking ball four on the at-bat's eighth pitch on a close call.
"When he throws 97, you don't have a lot of time to decide," Schafer said. "I'm just trying to go up there and compete and luckily it worked out for us."
Rosenthal said ball four could have gone either way.
"I've gotten that pitch for a strike before and it's been called a ball before," Rosenthal said. "It was right there."
The at-bat was set up by Doumit's double down the right-field line. Playing in his first game since Wednesday, Doumit jumped on the first pitch he saw.
"Look for the hard straight one with him," Doumit said. "I guessed right with him today. A guy like that who throws that hard, you don't want to see his split, you don't want to see his curveball. I was going up there looking for something hard that I could drive. I got the pitch I was looking for and kept it fair."
Rosenthal was then lifted for Carlos Martinez, who promptly issued a wild pitch that scored Doumit for the game-winning run in front of 44,278 at Busch Stadium.
The loss left Cardinals manager Mike Matheny answering questions about using Rosenthal for a fourth consecutive day.
"One pitch right there [to Schafer] maybe could have been called," Matheny said. "We were just one pitch away. A soon as [Rosenthal] got to two outs, it's his game. He's a tough kid. He wanted the ball today. Today it didn't work out."
The win salvaged what had been to this point a disappointing road trip. But instead of going 1-5 and getting swept, Atlanta heads home with the momentum it has been searching for all week.
"We've got a happy flight," Freeman said. "We grinded all day."
Freeman gave Atlanta's slumbering offense a jolt in the first inning with his eighth home run. The 412-foot shot over the left-field wall gave the Braves a 1-0 lead.
The first-inning tally was just the second time in the last 19 games that the Braves scored in the opening frame.
As they had in the two previous games this season, the Cardinals wasted little time coming back.
Braves starter Gavin Floyd appeared to get the third out in the second, but Peter Bourjos used his speed to reach on a passed ball on a strikeout. Cardinals starter Jamie Garcia followed with a hit and Matt Carpenter walked to load the bases for Kolten Wong, who cleared them with a double to left to give the Cardinals a 3-1 lead.
Justin Upton got the Braves back within one with a no-doubt homer to lead off the fourth. Upton's 10th of the season went an estimated 428 feet into the left-field bleachers. Home-plate umpire Eric Cooper issued a warning to both teams in the bottom of the fourth after Floyd hit Garcia with a pitch. Floyd had missed inside with his first two deliveries before hitting the Cardinals' starter. Garcia had hit Freeman immediately after Upton's home run in the top half of the fourth.
The Cardinals added another in the fifth following an unsuccessful challenge from Gonzalez. Allen Craig appeared to hit a double-play ball, but Dan Uggla's throw pulled Freeman off the bag, allowing Craig to reach safely. Gonzalez challenged umpire Chris Guccione's call, but the call stood. Craig eventually scored on a Matt Adams sacrifice fly that made it 4-2.
Freeman pulled the Braves even in the sixth with a two-run single, scoring Jason Heyward and Upton. Freeman is now hitting .378 with runners in scoring position and reached base all four times Sunday, going 3-for-3 and scoring twice.
Floyd, after surrendering the three runs in the second, settled in and pitched 5 1/3 innings. Of the four runs he surrendered, only one was earned.
"I've got to make pitches, especially after that," Floyd said. "No matter what the scenario is, you've just got to continue to grind it out. I felt like I got stronger as the game went on. I felt like I started getting into a good rhythm and kept competing and felt good."
Schafer, who started in center for a slumping B.J. Upton, lost a fly ball off of Jhonny Peralta's bat in the seventh. The ball fell, allowing Yadier Molina to score, putting the Cardinals ahead 5-4.
"It's the most helpless feeling in the world," Schafer said. The ball goes up, it's fine. It comes down and halfway down it's right in the middle of the sun. Like I said, it's just a helpless feeling and thank God we were able to pull out a victory, because if we lost it wouldn't have been a good flight home."
David Carpenter got the win for Atlanta and improved to 3-0. Craig Kimbrel picked up his 11th save.