在1368年7月末,當朱元璋的大將徐達率軍剛剛抵至通州時,元順帝就怯懦地放棄了元大都,倉皇北逃到了上都開平。自此元朝在中國的統治結束。但元人並沒有就這麼簡單地退出曆史舞台,逃至蒙古草原的北元流亡政府又繼續維持了一段時間。
元廷最初北遷的時候,元人仍保存著完整的統治機構和相當的軍事力量。當時的蒙古政權所控製的疆域,東起貝加爾湖、興安嶺山麓,西到天山,北至額爾齊斯河及葉尼塞河上遊,南抵長城的大片領土,並且與各藩國仍保持著聯係,其中有東麵的高麗、西麵的蒙兀兒斯坦、中亞的帖木兒帝國等。就中原地區而言,在山西和甘肅,有中書左丞相王保保所統率的10萬大軍,陝西則是元漢將李思齊的勢力範圍,遼東方麵更盤踞著納哈出的20萬雄師,另外遼陽、雲南、今河北盧龍縣、甘肅、寧夏、新疆地區以及青海都依舊被元人所控製著。可見,如果不是元人內訌的話,朱元璋想要北伐,勢必困難重重,難以如願。
元廷北遷不久,就力圖恢複在全國的統治。首先元順帝命王保保率兵出雁門關,由保安州經居庸關進攻大都。明將徐達采用了機變的戰術,他趁王保保出兵大都之機,突襲元軍後方重鎮太原。王保保至保安州得到情報後,被迫還兵。雙方在太原地區陷入僵局。王保保缺少糧草,知道輕易與明軍交戰絕對討不到什麼便宜,於是在太原城西安營紮寨,準備等待時機,與明軍一決。不想王保保的部下暗投明軍作了內應,明軍夜襲王保保軍營,王保保大敗,僅率十八騎突圍出去逃到了大同。
1369年5月,順帝又命令丞相也速率萬餘騎兵出山西營於白河。通州明軍守備力量薄弱,但由於明將曹良臣采取了虛張聲勢的戰術,也速不明真情撤軍,從而解除了元大軍壓境的威脅。同年8月,順帝遷都達裏泊(達賚湖),命令脫列伯、孔興以重兵攻大同,以為進攻大都鋪平道路。明將李文忠率軍出雁門關,在今山西馬邑上方遭遇,進行了一場惡戰。不久明援軍到達大同,結果大敗元軍,俘虜了元將脫列伯。包圍大同的元將孔興得到這一情報後,立即撤兵逃往綏德,遭到明軍追擊,大敗而歸。這一年,明軍再次大舉北伐,元順帝迫於明大軍威勢,又放棄了上都,逃到了應昌(今內蒙古克什克騰旗境內)。
元順帝遷都應昌後又先後組織了三次攻擊大都的戰爭,但都以失敗而告終。在這之後明軍以物質基礎雄厚的中原及江南地區作為依托,掌握了戰爭的絕對控製權。1369年,明將徐達與常遇春進兵陝西,元軍或死或降或自殺,兩員大將所向披靡,最終迫使北元漢將李思齊陷入了孤軍無援的境地,投降了明朝。涇陽張思道得到這一情報後,遣部將張良臣守慶陽,自己則率軍走寧夏與擴廓帖木兒會合。明將湯和部在涇州會師,兵力集中到了一起。同時元軍也開始集中兵力,王保保重新組織起軍隊與元將張良臣合兵一處,先後攻克了原州、涇州。但很快也被明軍擊敗了。
1370年,元順帝在應昌病逝,皇太子愛猷識理達臘即位,為元昭宗,年號宣光。朱元璋把握戰機,趁北元新舊交替之機,集結優勢兵力重點進攻元昭宗駐地應昌及陝甘寧一帶王保保的軍隊。這次明軍兵分兩路:西路軍由大將徐達率領,自潼關出西安,進兵定西;東路軍由李文忠率領,由北平(明朝把元大都改為北平,意即“平定北方”)經萬全,過野狐嶺,直趨應昌。徐達大敗王保保軍於沈兒峪,北元軍將士8萬餘人被俘,王保保隻攜妻子兒女及少數軍士強渡黃河,逃到了和林。明東路軍也同樣大獲全勝,在戰鬥中俘虜了元昭宗子麥德裏巴勒及後妃、宮人、諸王家屬等,元昭宗隻帶著少數隨從逃到了和林與王保保會合,抱頭痛哭。
1372年,因北元殘餘勢力對明北邊不斷攻襲,構成了直接威脅。因此,在這一年的春天,朱元璋命大將徐達、李文忠、馮勝兵分三路,率大軍15萬,再次北征。在這次進攻中,作為主攻的徐達與李文忠並沒有取得什麼戰果,反倒是作為疑兵的馮勝軍歪打正著,收到了成效。李文忠的東路軍出居庸關,直取應昌,隨後經達口溫、克魯倫河、土拉河、斡難河直到稱海,和元軍激戰,明軍失利,損失了曹良臣等幾員驍將,兵敗回師。徐達的中路軍也遭到了同樣的命運。他率軍出雁門關,在嶺北與北元的王保保和賀宗哲的軍隊遭遇,被元軍伏擊,死傷數萬人,大敗撤軍。唯有馮勝的西路軍出金蘭到達蘭州、掃林山、亦集乃路,直到瓜州和沙州,連續擊敗元軍,獲勝返回。這也許和元軍的力量受到徐達和李文忠牽製有關。