St. Louis won the final two outings in the three-game series and is 3-3 on its current nine-game homestand.
Freese doubled in the first run of the game in the second and hit a two-run homer in the third.
The Cardinals picked up two crucial runs on a single by Matt Adams in the fifth, which were needed after Adam Dunn hit a three-run homer for the White Sox in the sixth. Dunn has 22 home runs for the season.
Jake Westbrook (5-6) gave up the three-run homer and allowed four other hits over six innings to get the win. Four relievers combined to throw three hitless innings with Jason Motte working the ninth for his 13th save.
The loss went to Gavin Floyd (4-7), who surrendered all of the St. Louis runs on eight hits and four walks over 4 2/3 innings.