Freeman started playing baseball at the age of four in the Carrollton Little League in Carrollton, Texas. When he was 12 years old his team won the Carrollton Pony League Championship. Freeman's pitching career started his freshman year of high school, one year before making the varsity team at Hebron High School. He also played football at Hebron his freshman year.
After his sophomore year of college, Freeman was selected by the St. Louis Cardinals in the 24th round of the 2007 Major League Baseball Draft. He didn't sign and went on to Kansas for his junior year. After his junior year, he was redrafted by the Cardinals in the 32nd round in the 2008 Major League Baseball Draft. With the Cardinals, he rose from the Rookie League to AA in three years. He was 0-2 with a 4.50 ERA in AAA with the Memphis Redbirds. and was later signed to the Cardinals 40-man roster. Freeman sustained an injury to his elbow requiring Tommy John surgery, which took him out of the 2010 season. Freeman made his major league debut during Johan Santana's no-hitter in New York on June 1, 2012. He appeared in 22 games for the St. Louis Cardinals in 2012, posting a record of 0-2 with a 5.40 ERA. Following the regular season he was sent by the Cardinals to play in the Arizona Fall League. After appearing in just 13 games in 2013, Freeman pitched in 44 games in 2014 with an ERA of 2.61 in 38 innings.
Texas Rangers
On March 28, 2015, the Texas Rangers acquired Freeman from the Cardinals for a player to be named later. He was designated for assignment on April 5, and outrighted on April 15. He was brought back up a few weeks later, finishing the season with 54 appearances for the Rangers.
Milwaukee Brewers
Freeman was acquired by the Milwaukee Brewers on April 5, 2016. He was designated for assignment on May 2, 2016, when the team recalled Junior Guerra. With the Brewers, he was 0-0 with a 12.91 ERA.
Atlanta Braves
On October 21, 2016, Freeman signed a minor league contract with an invitation to spring training with the Atlanta Braves. The Braves promoted him to the majors on May 4, 2017. For the season, he appeared in 58 games, going 2-0 with a 2.55 ERA. Freeman and the Braves agreed to a one-year contract worth $1.075 million on January 11, 2018. He struggled with inconsistency throughout the 2018 season due to a lack of command, a problem that had been noted by several coaches over the course of his career. In late July, Freeman was placed on the disabled list, and returned to the active roster on August 19. On March 22, 2019, Freeman was unconditionally released from the Atlanta Braves.
Los Angeles Angels
On March 27, 2019, Freeman signed a minor league deal with the Los Angeles Angels. Freeman had his contract selected on April 23, 2019. He was designated for assignment on April 24 following the promotion of Matt Ramsey. He was outrighted on April 29. Freeman was released on August 19, 2019.
Washington Nationals
On August 21, 2019, Freeman signed a minor league deal with the Washington Nationals. He became a free agent following the 2019 season. On February 12, 2020, Freeman re-signed with the Nationals on a minor league deal. On July 23, 2020, Freeman had his contract selected to the 40-man roster.