[{"data":1,"prerenderedAt":3551},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian\u002F0200-linux":3,"wiki-doc-items-2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian":3519,"wiki:author-members":3539},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":3506,"chapterOrder":3507,"date":3508,"description":49,"docKey":3509,"docRoot":3510,"docTitle":3511,"extension":3512,"isWikiDoc":60,"isWikiIndex":3513,"meta":3514,"navigation":60,"path":3515,"seo":3516,"stem":3517,"wikiDepth":57,"__hash__":3518},"wiki\u002Fwiki\u002F2025-07-18-Linux-STM32-CMake-VScode环境搭建\u002F0200-Linux.md","Linux",[7],"董佳辉",{"type":9,"value":10,"toc":3501},"minimark",[11,15,19,32,35,38,43,129,135,138,146,151,156,161,166,169,174,177,190,193,290,293,316,321,324,333,338,341,345,350,353,361,367,372,377,380,385,391,414,419,422,427,433,448,453,456,461,468,473,476,481,484,489,492,497,500,508,511,622,625,630,635,639,645,650,653,656,661,672,680,683,699,704,707,716,721,724,729,732,740,748,752,755,906,909,913,924,929,935,940,943,948,951,960,963,979,982,994,999,1009,1012,1028,1033,1036,1044,1063,1066,1075,1080,1086,1089,1101,1116,1134,1139,1142,1154,1158,1163,1208,1213,1216,1219,1232,1237,1241,1244,1247,1290,1295,1298,1304,1309,1312,1315,1318,1323,1326,1331,1338,1343,1359,1364,1367,1376,1381,1384,1387,1392,1396,1402,1407,1412,1414,1416,1418,1423,1428,1433,1449,1454,1457,1460,1469,1474,1478,1484,1487,1492,1495,1500,1503,1508,1511,1516,1519,1524,1527,1534,1539,1563,1568,1573,1576,1580,1583,1588,1591,1596,1599,1604,1609,1612,1617,1622,1625,1630,1635,1638,1641,1646,1651,1654,1657,1662,1665,1677,1682,1685,1690,1693,1699,1704,1709,1734,1737,1742,1745,1764,1769,1772,1785,1788,1793,1813,1825,1828,1833,1836,1839,1844,1847,1852,1855,1860,1863,1868,1871,1876,1881,1884,1889,1892,1897,1902,1907,1922,1925,1930,1933,1938,1968,1973,1978,1984,1987,1992,1996,2003,2019,2026,2031,2034,2039,2042,2199,2202,2286,2297,2326,2331,2334,2339,2362,2365,2381,2386,2389,2394,2399,2402,2407,2412,2420,2423,2437,2442,2445,2449,2452,2455,2460,2463,2468,2562,2565,2570,2575,2578,2592,2597,2600,2605,2609,2612,2627,2630,2635,2638,2643,2648,2651,2656,2659,2664,2667,2670,2674,2677,2695,2698,2709,2714,2720,3225,3230,3244,3249,3252,3257,3262,3269,3274,3287,3293,3299,3304,3309,3314,3317,3322,3327,3335,3339,3342,3345,3350,3355,3358,3363,3368,3371,3376,3379,3384,3387,3392,3395,3400,3403,3408,3411,3416,3419,3432,3435,3440,3443,3448,3451,3456,3461,3464,3470,3476,3481,3484,3489,3492,3497],[12,13,14],"h3",{"id":14},"环境介绍",[16,17,18],"p",{},"本教程环境介绍：",[20,21,22,26,29],"ol",{},[23,24,25],"li",{},"系统：Fedora 42 KDE Edition Linux",[23,27,28],{},"系统内核：Linux 6.15.6-200.fc42.x86_64",[23,30,31],{},"架构：X86_64",[16,33,34],{},"其他Linux环境也可以。",[12,36,37],{"id":37},"安装各种环境",[39,40,42],"h4",{"id":41},"安装cc环境","安装C\u002FC++环境",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-bash shiki shiki-themes github-light github-dark","\n# debian系\nsudo apt-get install gcc g++ gdb cmake-gui make\n\n# rhel系\nsudo dnf install gcc g++ gdb cmake-gui make\n","bash","",[51,52,53,62,69,98,103,109],"code",{"__ignoreMap":49},[54,55,58],"span",{"class":56,"line":57},"line",1,[54,59,61],{"emptyLinePlaceholder":60},true,"\n",[54,63,65],{"class":56,"line":64},2,[54,66,68],{"class":67},"sJ8bj","# debian系\n",[54,70,72,76,80,83,86,89,92,95],{"class":56,"line":71},3,[54,73,75],{"class":74},"sScJk","sudo",[54,77,79],{"class":78},"sZZnC"," apt-get",[54,81,82],{"class":78}," install",[54,84,85],{"class":78}," gcc",[54,87,88],{"class":78}," g++",[54,90,91],{"class":78}," gdb",[54,93,94],{"class":78}," cmake-gui",[54,96,97],{"class":78}," make\n",[54,99,101],{"class":56,"line":100},4,[54,102,61],{"emptyLinePlaceholder":60},[54,104,106],{"class":56,"line":105},5,[54,107,108],{"class":67},"# rhel系\n",[54,110,112,114,117,119,121,123,125,127],{"class":56,"line":111},6,[54,113,75],{"class":74},[54,115,116],{"class":78}," dnf",[54,118,82],{"class":78},[54,120,85],{"class":78},[54,122,88],{"class":78},[54,124,91],{"class":78},[54,126,94],{"class":78},[54,128,97],{"class":78},[16,130,131],{},[132,133],"img",{"alt":49,"src":134},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage1.webp",[16,136,137],{},"查看是否环境安装成功",[44,139,144],{"className":140,"code":142,"language":143},[141],"language-text","gcc -v\ng++ -v\ngdb -v\ncmake --version\n","text",[51,145,142],{"__ignoreMap":49},[16,147,148],{},[132,149],{"alt":49,"src":150},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage2.webp",[16,152,153],{},[132,154],{"alt":49,"src":155},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage3.webp",[16,157,158],{},[132,159],{"alt":49,"src":160},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage4.webp",[16,162,163],{},[132,164],{"alt":49,"src":165},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage5.webp",[16,167,168],{},"接下来测试是否能够对C\u002FC++正常编译，请找一个存放C++代码的文件夹，然后在终端中cd进去。",[16,170,171],{},[132,172],{"alt":49,"src":173},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage6.webp",[16,175,176],{},"然后创建一个.cpp文件并用vim编辑",[44,178,180],{"className":46,"code":179,"language":48,"meta":49,"style":49},"vim hello.cpp\n",[51,181,182],{"__ignoreMap":49},[54,183,184,187],{"class":56,"line":57},[54,185,186],{"class":74},"vim",[54,188,189],{"class":78}," hello.cpp\n",[16,191,192],{},"复制以下代码到该文件里",[44,194,198],{"className":195,"code":196,"language":197,"meta":49,"style":49},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Ciostream> \nint main(int argc,char **argv) \n{ \n    std::cout \u003C\u003C \"你好，机电创新学会！\" \u003C\u003C std::endl; \n    return 0; \n}\n","cpp",[51,199,200,213,245,250,273,285],{"__ignoreMap":49},[54,201,202,206,209],{"class":56,"line":57},[54,203,205],{"class":204},"szBVR","#include",[54,207,208],{"class":78}," \u003Ciostream>",[54,210,212],{"class":211},"sVt8B"," \n",[54,214,215,218,221,224,226,230,233,236,239,242],{"class":56,"line":64},[54,216,217],{"class":204},"int",[54,219,220],{"class":74}," main",[54,222,223],{"class":211},"(",[54,225,217],{"class":204},[54,227,229],{"class":228},"s4XuR"," argc",[54,231,232],{"class":211},",",[54,234,235],{"class":204},"char",[54,237,238],{"class":204}," **",[54,240,241],{"class":228},"argv",[54,243,244],{"class":211},") \n",[54,246,247],{"class":56,"line":71},[54,248,249],{"class":211},"{ \n",[54,251,252,255,258,261,264,267,270],{"class":56,"line":100},[54,253,254],{"class":74},"    std",[54,256,257],{"class":211},"::cout ",[54,259,260],{"class":204},"\u003C\u003C",[54,262,263],{"class":78}," \"你好，机电创新学会！\"",[54,265,266],{"class":204}," \u003C\u003C",[54,268,269],{"class":74}," std",[54,271,272],{"class":211},"::endl; \n",[54,274,275,278,282],{"class":56,"line":105},[54,276,277],{"class":204},"    return",[54,279,281],{"class":280},"sj4cs"," 0",[54,283,284],{"class":211},"; \n",[54,286,287],{"class":56,"line":111},[54,288,289],{"class":211},"}\n",[16,291,292],{},"然后编译",[44,294,296],{"className":46,"code":295,"language":48,"meta":49,"style":49},"g++ -o hello hello.cpp\nls\n",[51,297,298,311],{"__ignoreMap":49},[54,299,300,303,306,309],{"class":56,"line":57},[54,301,302],{"class":74},"g++",[54,304,305],{"class":280}," -o",[54,307,308],{"class":78}," hello",[54,310,189],{"class":78},[54,312,313],{"class":56,"line":64},[54,314,315],{"class":74},"ls\n",[16,317,318],{},[132,319],{"alt":49,"src":320},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage7.webp",[16,322,323],{},"运行",[44,325,327],{"className":46,"code":326,"language":48,"meta":49,"style":49},".\u002Fhello\n",[51,328,329],{"__ignoreMap":49},[54,330,331],{"class":56,"line":57},[54,332,326],{"class":74},[16,334,335],{},[132,336],{"alt":49,"src":337},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage8.webp",[16,339,340],{},"说明环境已经配置好了",[39,342,344],{"id":343},"安装cubemx","安装CubeMX",[16,346,347],{},[132,348],{"alt":49,"src":349},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage9.webp",[16,351,352],{},"下载地址：",[16,354,355],{},[356,357,358],"a",{"href":358,"rel":359},"https:\u002F\u002Fwww.st.com.cn\u002Fzh\u002Fdevelopment-tools\u002Fstm32cubemx.html",[360],"nofollow",[16,362,363],{},[364,365,366],"strong",{},"推荐下载6.14.1版本（不要下载6.15.0,这个版本有bug，不知道后续何时会修复）",[16,368,369],{},[132,370],{"alt":49,"src":371},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage10.webp",[16,373,374],{},[132,375],{"alt":49,"src":376},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage11.webp",[16,378,379],{},"解压出来",[16,381,382],{},[132,383],{"alt":49,"src":384},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage12.webp",[16,386,387,388],{},"用root权限打开这个软件",[51,389,390],{},"SetupSTM32CubeMX-6.15.0",[44,392,394],{"className":195,"code":393,"language":197,"meta":49,"style":49},"sudo .\u002FSetupSTM32CubeMX-6.15.0\n",[51,395,396],{"__ignoreMap":49},[54,397,398,401,404,407,410],{"class":56,"line":57},[54,399,400],{"class":211},"sudo .",[54,402,403],{"class":204},"\u002F",[54,405,406],{"class":211},"SetupSTM32CubeMX",[54,408,409],{"class":204},"-",[54,411,413],{"class":412},"s7hpK","6.15.0\n",[16,415,416],{},[132,417],{"alt":49,"src":418},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage13.webp",[16,420,421],{},"在新弹出的界面一直点下一步就行，安装结束后出现如下图就成功了。",[16,423,424],{},[132,425],{"alt":49,"src":426},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage14.webp",[16,428,429,432],{},[51,430,431],{},"\u002Fusr\u002Flocal\u002FSTMicroelectronics\u002FSTM32Cube\u002FSTM32CubeMX","进入这个文件夹，然后打开终端输入",[44,434,436],{"className":195,"code":435,"language":197,"meta":49,"style":49},".\u002FSTM32CubeMX\n",[51,437,438],{"__ignoreMap":49},[54,439,440,443,445],{"class":56,"line":57},[54,441,442],{"class":211},".",[54,444,403],{"class":204},[54,446,447],{"class":211},"STM32CubeMX\n",[16,449,450],{},[132,451],{"alt":49,"src":452},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage15.webp",[16,454,455],{},"点击Help",[16,457,458],{},[132,459],{"alt":49,"src":460},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage16.webp",[16,462,463,464,467],{},"选",[51,465,466],{},"Manage embedded software packages","，把STM32F1，F4，H7的第一个最新的固件勾上。",[16,469,470],{},[132,471],{"alt":49,"src":472},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage17.webp",[16,474,475],{},"点install",[16,477,478],{},[132,479],{"alt":49,"src":480},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage18.webp",[16,482,483],{},"登陆上账号",[16,485,486],{},[132,487],{"alt":49,"src":488},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage19.webp",[16,490,491],{},"然后等下载和安装完",[16,493,494],{},[132,495],{"alt":49,"src":496},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage20.webp",[16,498,499],{},"下载好就行了。",[16,501,502,503,507],{},"接下来可以把CubeMX应用配置一个桌面快捷方式等可以快速打开，教程详见",[356,504,506],{"href":505},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0600-qi-ta-ke-xuan-pei-zhi#appimage","Vinci机器人队Linux入门教程","的Appimage章节，可以用ctrl+F快速定位该章节。",[16,509,510],{},"桌面快捷方式如下：",[44,512,514],{"className":46,"code":513,"language":48,"meta":49,"style":49},"[Desktop Entry]\nName=STM32CubeMX\nExec=\u002Fusr\u002Flocal\u002FSTMicroelectronics\u002FSTM32Cube\u002FSTM32CubeMX\u002FSTM32CubeMX\nIcon=\u002Fusr\u002Flocal\u002FSTMicroelectronics\u002FSTM32Cube\u002FSTM32CubeMX\u002Fhelp\u002FSTM32CubeMX.png\nType=Application\nCategories=Development;Electronics;Embedded;\nComment=STM32CubeMX configuration and code generation tool\nTerminal=false\n",[51,515,516,521,531,541,551,561,585,611],{"__ignoreMap":49},[54,517,518],{"class":56,"line":57},[54,519,520],{"class":211},"[Desktop Entry]\n",[54,522,523,526,529],{"class":56,"line":64},[54,524,525],{"class":211},"Name",[54,527,528],{"class":204},"=",[54,530,447],{"class":78},[54,532,533,536,538],{"class":56,"line":71},[54,534,535],{"class":211},"Exec",[54,537,528],{"class":204},[54,539,540],{"class":78},"\u002Fusr\u002Flocal\u002FSTMicroelectronics\u002FSTM32Cube\u002FSTM32CubeMX\u002FSTM32CubeMX\n",[54,542,543,546,548],{"class":56,"line":100},[54,544,545],{"class":211},"Icon",[54,547,528],{"class":204},[54,549,550],{"class":78},"\u002Fusr\u002Flocal\u002FSTMicroelectronics\u002FSTM32Cube\u002FSTM32CubeMX\u002Fhelp\u002FSTM32CubeMX.png\n",[54,552,553,556,558],{"class":56,"line":105},[54,554,555],{"class":211},"Type",[54,557,528],{"class":204},[54,559,560],{"class":78},"Application\n",[54,562,563,566,568,571,574,577,579,582],{"class":56,"line":111},[54,564,565],{"class":211},"Categories",[54,567,528],{"class":204},[54,569,570],{"class":78},"Development",[54,572,573],{"class":211},";",[54,575,576],{"class":74},"Electronics",[54,578,573],{"class":211},[54,580,581],{"class":74},"Embedded",[54,583,584],{"class":211},";\n",[54,586,588,591,593,596,599,602,605,608],{"class":56,"line":587},7,[54,589,590],{"class":211},"Comment",[54,592,528],{"class":204},[54,594,595],{"class":78},"STM32CubeMX",[54,597,598],{"class":74}," configuration",[54,600,601],{"class":78}," and",[54,603,604],{"class":78}," code",[54,606,607],{"class":78}," generation",[54,609,610],{"class":78}," tool\n",[54,612,614,617,619],{"class":56,"line":613},8,[54,615,616],{"class":211},"Terminal",[54,618,528],{"class":204},[54,620,621],{"class":78},"false\n",[16,623,624],{},"根据教程做，就可以实现这种效果啦。",[16,626,627],{},[132,628],{"alt":49,"src":629},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage21.webp",[16,631,632],{},[132,633],{"alt":49,"src":634},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage22.webp",[39,636,638],{"id":637},"安装vscode","安装VScode",[16,640,641],{},[356,642,643],{"href":643,"rel":644},"https:\u002F\u002Fcode.visualstudio.com\u002FDownload",[360],[16,646,647],{},[132,648],{"alt":49,"src":649},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage23.webp",[16,651,652],{},"如果是debian系下载deb,如果是rhel系下载rpm.",[16,654,655],{},"下载完之后，点击浏览器，找到这个安装包的文件夹，并在该路径打开终端。",[16,657,658],{},[132,659],{"alt":49,"src":660},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage24.webp",[16,662,663,664,667,668,671],{},"Debian系：输入",[51,665,666],{},"sudo apt install .\u002Fcode","然后按",[51,669,670],{},"tab","按键补齐文件名，回车。",[16,673,674,675,667,678,671],{},"RHEL系：输入",[51,676,677],{},"sudo dnf install .\u002Fcode",[51,679,670],{},[16,681,682],{},"例如补齐后的：",[44,684,686],{"className":46,"code":685,"language":48,"meta":49,"style":49},"sudo dnf install .\u002Fcode-1.102.1-1752598767.el8.x86_64.rpm\n",[51,687,688],{"__ignoreMap":49},[54,689,690,692,694,696],{"class":56,"line":57},[54,691,75],{"class":74},[54,693,116],{"class":78},[54,695,82],{"class":78},[54,697,698],{"class":78}," .\u002Fcode-1.102.1-1752598767.el8.x86_64.rpm\n",[16,700,701],{},[132,702],{"alt":49,"src":703},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage25.webp",[16,705,706],{},"然后打开VScode，在终端输入下面的命令",[44,708,710],{"className":46,"code":709,"language":48,"meta":49,"style":49},"code\n",[51,711,712],{"__ignoreMap":49},[54,713,714],{"class":56,"line":57},[54,715,709],{"class":74},[16,717,718],{},[132,719],{"alt":49,"src":720},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage26.webp",[16,722,723],{},"然后安装一些插件",[16,725,726],{},[132,727],{"alt":49,"src":728},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage27.webp",[16,730,731],{},"下面这些都要装",[16,733,734,737],{},[132,735],{"alt":49,"src":736},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage28.webp",[132,738],{"alt":49,"src":739},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage29.webp",[16,741,742,745],{},[132,743],{"alt":49,"src":744},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage30.webp",[132,746],{"alt":49,"src":747},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage31.webp",[39,749,751],{"id":750},"安装arm-gnu工具链","安装ARM GNU工具链",[16,753,754],{},"编译工具比较：",[756,757,758,778],"table",{},[759,760,761],"thead",{},[762,763,764,769,772,775],"tr",{},[765,766,768],"th",{"align":767},"left","特性",[765,770,771],{"align":767},"ARM GCC (GNU 工具链)",[765,773,774],{"align":767},"Keil AC5 (ARM Compiler 5)",[765,776,777],{"align":767},"Keil AC6 (ARM Compiler 6)",[779,780,781,796,809,823,837,851,865,878,892],"tbody",{},[762,782,783,787,790,793],{},[784,785,786],"td",{"align":767},"核心身份",[784,788,789],{"align":767},"基于GNU GPL的开源编译器",[784,791,792],{"align":767},"ARM自家的传统编译器",[784,794,795],{"align":767},"基于LLVM\u002FClang的现代编译器",[762,797,798,801,804,807],{},[784,799,800],{"align":767},"许可模式",[784,802,803],{"align":767},"免费、开源",[784,805,806],{"align":767},"商业收费（包含在MDK中）",[784,808,806],{"align":767},[762,810,811,814,817,820],{},[784,812,813],{"align":767},"代码生成\u002F优化",[784,815,816],{"align":767},"良好，持续改进",[784,818,819],{"align":767},"优秀（尤其在小代码尺寸上）",[784,821,822],{"align":767},"极佳，在性能与尺寸间有最佳平衡",[762,824,825,828,831,834],{},[784,826,827],{"align":767},"标准兼容性",[784,829,830],{"align":767},"紧跟最新C\u002FC++标准（如C17，C++17\u002F20）",[784,832,833],{"align":767},"主要支持C++98，较陈旧",[784,835,836],{"align":767},"支持现代C++（C++11\u002F14\u002F17），兼容性更好",[762,838,839,842,845,848],{},[784,840,841],{"align":767},"错误\u002F警告信息",[784,843,844],{"align":767},"比较清晰易懂",[784,846,847],{"align":767},"相对晦涩",[784,849,850],{"align":767},"非常清晰和友好，类似GCC\u002FClang",[762,852,853,856,859,862],{},[784,854,855],{"align":767},"与Keil MDK集成",[784,857,858],{"align":767},"需要手动配置或通过CubeIDE",[784,860,861],{"align":767},"原生、无缝集成",[784,863,864],{"align":767},"原生、无缝集成，是ARM推荐选择",[762,866,867,870,873,876],{},[784,868,869],{"align":767},"链接脚本",[784,871,872],{"align":767},"使用自有的链接脚本语法（.ld文件）",[784,874,875],{"align":767},"使用ARM自家的分散加载文件语法（.sct）",[784,877,875],{"align":767},[762,879,880,883,886,889],{},[784,881,882],{"align":767},"汇编语法",[784,884,885],{"align":767},"使用GNU汇编语法（.S文件）",[784,887,888],{"align":767},"使用ARM汇编语法（.s）",[784,890,891],{"align":767},"使用ARM汇编语法（.s），但AC6更严格",[762,893,894,897,900,903],{},[784,895,896],{"align":767},"生态与未来",[784,898,899],{"align":767},"生态强大，是很多开源项目（如Zephyr，ESP-IDF）和IDE（CubeIDE，VS Code）的首选",[784,901,902],{"align":767},"处于维护模式，ARM不再增加新功能，不推荐新项目使用",[784,904,905],{"align":767},"是ARM的未来和主力，持续更新和优化",[907,908],"hr",{},[910,911,912],"h5",{"id":912},"安装",[16,914,915],{},[364,916,917,918,923],{},"建议都用",[364,919,920],{},[364,921,922],{},"官方法","进行安装。",[925,926,928],"h6",{"id":927},"方法一官网法","方法一（官网法）",[16,930,931],{},[356,932,933],{"href":933,"rel":934},"https:\u002F\u002Fdeveloper.arm.com\u002Fdownloads\u002F-\u002Farm-gnu-toolchain-downloads",[360],[16,936,937],{},[132,938],{"alt":49,"src":939},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage32.webp",[16,941,942],{},"进入下载目录并打开终端",[16,944,945],{},[132,946],{"alt":49,"src":947},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage33.webp",[16,949,950],{},"在终端里输入下列命令，将编译器文件tar压缩包复制到你存放程序的文件夹（这个文件夹你自己定，建议在home分区，别以后删了就行）。",[16,952,953,954,667,957,959],{},"具体命令为",[51,955,956],{},"cp .\u002Farm-gnu",[51,958,670],{},"补齐，然后空格，再跟上你要复制到的文件夹的路径。",[16,961,962],{},"比如下面的命令：",[44,964,966],{"className":46,"code":965,"language":48,"meta":49,"style":49},"cp .\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz ~\u002FUserFolder\u002FApplications\u002F\n",[51,967,968],{"__ignoreMap":49},[54,969,970,973,976],{"class":56,"line":57},[54,971,972],{"class":74},"cp",[54,974,975],{"class":78}," .\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz",[54,977,978],{"class":78}," ~\u002FUserFolder\u002FApplications\u002F\n",[16,980,981],{},"然后进入复制到的文件夹：",[44,983,985],{"className":46,"code":984,"language":48,"meta":49,"style":49},"cd ~\u002FUserFolder\u002FApplications\u002F\n",[51,986,987],{"__ignoreMap":49},[54,988,989,992],{"class":56,"line":57},[54,990,991],{"class":280},"cd",[54,993,978],{"class":78},[16,995,996],{},[132,997],{"alt":49,"src":998},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage34.webp",[16,1000,1001,1002,1005,1006,1008],{},"在终端里输入",[51,1003,1004],{},"tar -xvf .\u002Farm-gnu","并按",[51,1007,670],{},"补齐。",[16,1010,1011],{},"例如我补齐后的：",[44,1013,1015],{"className":46,"code":1014,"language":48,"meta":49,"style":49}," tar -xvf .\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz\n",[51,1016,1017],{"__ignoreMap":49},[54,1018,1019,1022,1025],{"class":56,"line":57},[54,1020,1021],{"class":74}," tar",[54,1023,1024],{"class":280}," -xvf",[54,1026,1027],{"class":78}," .\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi.tar.xz\n",[16,1029,1030],{},[132,1031],{"alt":49,"src":1032},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage35.webp",[16,1034,1035],{},"再进入这个解压后的文件夹",[16,1037,1038,1041,1042,1008],{},[51,1039,1040],{},"cd .\u002Farm-gnu","按",[51,1043,670],{},[44,1045,1047],{"className":46,"code":1046,"language":48,"meta":49,"style":49},"cd .\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002F\ncd .\u002Fbin\n",[51,1048,1049,1056],{"__ignoreMap":49},[54,1050,1051,1053],{"class":56,"line":57},[54,1052,991],{"class":280},[54,1054,1055],{"class":78}," .\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002F\n",[54,1057,1058,1060],{"class":56,"line":64},[54,1059,991],{"class":280},[54,1061,1062],{"class":78}," .\u002Fbin\n",[16,1064,1065],{},"查看文件夹路径",[44,1067,1069],{"className":46,"code":1068,"language":48,"meta":49,"style":49},"pwd\n",[51,1070,1071],{"__ignoreMap":49},[54,1072,1073],{"class":56,"line":57},[54,1074,1068],{"class":280},[16,1076,1077],{},[132,1078],{"alt":49,"src":1079},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage36.webp",[16,1081,1082,1083],{},"复制一下",[51,1084,1085],{},"\u002Fhome\u002Ftungchiahui\u002FUserFolder\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Fbin",[16,1087,1088],{},"然后需要配置环境",[44,1090,1092],{"className":46,"code":1091,"language":48,"meta":49,"style":49},"vim ~\u002F.bashrc\n",[51,1093,1094],{"__ignoreMap":49},[54,1095,1096,1098],{"class":56,"line":57},[54,1097,186],{"class":74},[54,1099,1100],{"class":78}," ~\u002F.bashrc\n",[16,1102,1103,1104,1107,1108,1111,1112,1115],{},"在末尾输入下面的命令，把下面",[51,1105,1106],{},"~\u002FUserFolder\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Fbin","替换成你刚才复制的路径，",[51,1109,1110],{},"\u002Fhome\u002F用户名","可以用",[51,1113,1114],{},"~","来代替。",[44,1117,1119],{"className":46,"code":1118,"language":48,"meta":49,"style":49},"export PATH=\u002Fhome\u002Ftungchiahui\u002FUserFolder\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Fbin:$PATH\n",[51,1120,1121],{"__ignoreMap":49},[54,1122,1123,1126,1129,1131],{"class":56,"line":57},[54,1124,1125],{"class":204},"export",[54,1127,1128],{"class":211}," PATH",[54,1130,528],{"class":204},[54,1132,1133],{"class":211},"\u002Fhome\u002Ftungchiahui\u002FUserFolder\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Fbin:$PATH\n",[16,1135,1136],{},[132,1137],{"alt":49,"src":1138},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage37.webp",[16,1140,1141],{},"加载环境",[44,1143,1145],{"className":46,"code":1144,"language":48,"meta":49,"style":49},"source ~\u002F.bashrc\n",[51,1146,1147],{"__ignoreMap":49},[54,1148,1149,1152],{"class":56,"line":57},[54,1150,1151],{"class":280},"source",[54,1153,1100],{"class":78},[925,1155,1157],{"id":1156},"方法二系统仓库法","方法二（系统仓库法）",[16,1159,1160],{},[364,1161,1162],{},"不建议本法",[44,1164,1166],{"className":46,"code":1165,"language":48,"meta":49,"style":49},"\n# Debian系\nsudo apt install arm-none-eabi-gcc\n\n# Rhel系\nsudo dnf install arm-none-eabi-gcc\n",[51,1167,1168,1172,1177,1189,1193,1198],{"__ignoreMap":49},[54,1169,1170],{"class":56,"line":57},[54,1171,61],{"emptyLinePlaceholder":60},[54,1173,1174],{"class":56,"line":64},[54,1175,1176],{"class":67},"# Debian系\n",[54,1178,1179,1181,1184,1186],{"class":56,"line":71},[54,1180,75],{"class":74},[54,1182,1183],{"class":78}," apt",[54,1185,82],{"class":78},[54,1187,1188],{"class":78}," arm-none-eabi-gcc\n",[54,1190,1191],{"class":56,"line":100},[54,1192,61],{"emptyLinePlaceholder":60},[54,1194,1195],{"class":56,"line":105},[54,1196,1197],{"class":67},"# Rhel系\n",[54,1199,1200,1202,1204,1206],{"class":56,"line":111},[54,1201,75],{"class":74},[54,1203,116],{"class":78},[54,1205,82],{"class":78},[54,1207,1188],{"class":78},[16,1209,1210],{},[132,1211],{"alt":49,"src":1212},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage38.webp",[910,1214,1215],{"id":1215},"测试",[16,1217,1218],{},"检查版本",[44,1220,1222],{"className":46,"code":1221,"language":48,"meta":49,"style":49},"arm-none-eabi-gcc -v\n",[51,1223,1224],{"__ignoreMap":49},[54,1225,1226,1229],{"class":56,"line":57},[54,1227,1228],{"class":74},"arm-none-eabi-gcc",[54,1230,1231],{"class":280}," -v\n",[16,1233,1234],{},[132,1235],{"alt":49,"src":1236},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage39.webp",[39,1238,1240],{"id":1239},"安装jlink驱动","安装JLink驱动",[910,1242,1243],{"id":1243},"安装libreadline库",[16,1245,1246],{},"我们烧录会用到JLinkExe的命令，而JLinkExe会用到libreadline库，所以要安装libreadline库，执行如下命令安装：",[44,1248,1250],{"className":46,"code":1249,"language":48,"meta":49,"style":49},"\n# debian系\nsudo apt-get install libreadline-dev\n\n# rhel系\nsudo dnf install readline-devel\n",[51,1251,1252,1256,1260,1271,1275,1279],{"__ignoreMap":49},[54,1253,1254],{"class":56,"line":57},[54,1255,61],{"emptyLinePlaceholder":60},[54,1257,1258],{"class":56,"line":64},[54,1259,68],{"class":67},[54,1261,1262,1264,1266,1268],{"class":56,"line":71},[54,1263,75],{"class":74},[54,1265,79],{"class":78},[54,1267,82],{"class":78},[54,1269,1270],{"class":78}," libreadline-dev\n",[54,1272,1273],{"class":56,"line":100},[54,1274,61],{"emptyLinePlaceholder":60},[54,1276,1277],{"class":56,"line":105},[54,1278,108],{"class":67},[54,1280,1281,1283,1285,1287],{"class":56,"line":111},[54,1282,75],{"class":74},[54,1284,116],{"class":78},[54,1286,82],{"class":78},[54,1288,1289],{"class":78}," readline-devel\n",[16,1291,1292],{},[132,1293],{"alt":49,"src":1294},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage40.webp",[910,1296,1240],{"id":1297},"安装jlink驱动-1",[16,1299,1300],{},[356,1301,1302],{"href":1302,"rel":1303},"https:\u002F\u002Fwww.segger.com\u002Fdownloads\u002Fjlink\u002F",[360],[16,1305,1306],{},[132,1307],{"alt":49,"src":1308},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage41.webp",[16,1310,1311],{},"是Debian系下载64位DEB",[16,1313,1314],{},"是RHEL系下载64位RPM",[16,1316,1317],{},"（这里的64位指的是amd64和X86_64,如果你是ARM64请下载下方那个Linux ARM里的64位）",[16,1319,1320],{},[132,1321],{"alt":49,"src":1322},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage42.webp",[16,1324,1325],{},"打开下载到的文件夹，并打开终端",[16,1327,1328],{},[132,1329],{"alt":49,"src":1330},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage43.webp",[16,1332,1333,1334,1337],{},"然后",[51,1335,1336],{},"sudo apt install .\u002FJLink","然后tab补齐。",[16,1339,1333,1340,1337],{},[51,1341,1342],{},"sudo dnf install .\u002FJLink",[44,1344,1346],{"className":46,"code":1345,"language":48,"meta":49,"style":49},"sudo dnf install .\u002FJLink_Linux_V852_x86_64.rpm\n",[51,1347,1348],{"__ignoreMap":49},[54,1349,1350,1352,1354,1356],{"class":56,"line":57},[54,1351,75],{"class":74},[54,1353,116],{"class":78},[54,1355,82],{"class":78},[54,1357,1358],{"class":78}," .\u002FJLink_Linux_V852_x86_64.rpm\n",[16,1360,1361],{},[132,1362],{"alt":49,"src":1363},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage44.webp",[16,1365,1366],{},"检查是否安装成功",[44,1368,1370],{"className":46,"code":1369,"language":48,"meta":49,"style":49},"JLinkExe\n",[51,1371,1372],{"__ignoreMap":49},[54,1373,1374],{"class":56,"line":57},[54,1375,1369],{"class":74},[16,1377,1378],{},[132,1379],{"alt":49,"src":1380},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage45.webp",[16,1382,1383],{},"我们点击No，然后会进入Commander交互模式，在这种模式下，我们可以执行各种 J-Link Commander 提供的命令来连接、配置调试器，下载程序或文件到目标设备等操作，感兴趣的同学可自行学习。",[16,1385,1386],{},"执行“q”指令退出该模式。",[16,1388,1389],{},[132,1390],{"alt":49,"src":1391},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage46.webp",[910,1393,1395],{"id":1394},"下载并安装ozone","下载并安装Ozone",[16,1397,1398],{},[356,1399,1400],{"href":1400,"rel":1401},"https:\u002F\u002Fwww.segger.com\u002Fproducts\u002Fdevelopment-tools\u002Fozone-j-link-debugger\u002F",[360],[16,1403,1404],{},[132,1405],{"alt":49,"src":1406},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage47.webp",[16,1408,1409],{},[132,1410],{"alt":49,"src":1411},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage48.webp",[16,1413,1311],{},[16,1415,1314],{},[16,1417,1317],{},[16,1419,1420],{},[132,1421],{"alt":49,"src":1422},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage49.webp",[16,1424,1333,1425,1337],{},[51,1426,1427],{},"sudo apt install .\u002FOzone",[16,1429,1333,1430,1337],{},[51,1431,1432],{},"sudo dnf install .\u002FOzone",[44,1434,1436],{"className":46,"code":1435,"language":48,"meta":49,"style":49},"sudo dnf install .\u002FOzone_Linux_V338g_x86_64.rpm\n",[51,1437,1438],{"__ignoreMap":49},[54,1439,1440,1442,1444,1446],{"class":56,"line":57},[54,1441,75],{"class":74},[54,1443,116],{"class":78},[54,1445,82],{"class":78},[54,1447,1448],{"class":78}," .\u002FOzone_Linux_V338g_x86_64.rpm\n",[16,1450,1451],{},[132,1452],{"alt":49,"src":1453},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage50.webp",[910,1455,1215],{"id":1456},"测试-1",[16,1458,1459],{},"打开终端输入",[44,1461,1463],{"className":46,"code":1462,"language":48,"meta":49,"style":49},"ozone\n",[51,1464,1465],{"__ignoreMap":49},[54,1466,1467],{"class":56,"line":57},[54,1468,1462],{"class":74},[16,1470,1471],{},[132,1472],{"alt":49,"src":1473},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage51.webp",[39,1475,1477],{"id":1476},"下载svd","下载SVD",[16,1479,1480],{},[356,1481,1482],{"href":1482,"rel":1483},"https:\u002F\u002Fwww.st.com.cn\u002Fcontent\u002Fst_com\u002Fzh.html",[360],[16,1485,1486],{},"在搜索里搜索芯片型号，如stm32f103c8t6",[16,1488,1489],{},[132,1490],{"alt":49,"src":1491},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage52.webp",[16,1493,1494],{},"点CAD资源",[16,1496,1497],{},[132,1498],{"alt":49,"src":1499},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage53.webp",[16,1501,1502],{},"下载SVD，鼠标点红色框的区域就可以下载了",[16,1504,1505],{},[132,1506],{"alt":49,"src":1507},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage54.webp",[16,1509,1510],{},"解压后就可以获得F1系列的SVD文件了",[16,1512,1513],{},[132,1514],{"alt":49,"src":1515},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage55.webp",[16,1517,1518],{},"依次把F4和H7的也下载解压了就可以了。（可以解压到一个文件夹里）",[16,1520,1521],{},[132,1522],{"alt":49,"src":1523},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage56.webp",[16,1525,1526],{},"然后在上面的文件夹打开终端",[16,1528,1529,1530,1533],{},"将这些文件夹全部复制到Ozone的",[51,1531,1532],{},"Config\u002FPeripherals\u002F","目录下。（你需要提前确定一下ozone的配置是否是这个路径再复制）",[16,1535,1536],{},[132,1537],{"alt":49,"src":1538},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage57.webp",[44,1540,1542],{"className":46,"code":1541,"language":48,"meta":49,"style":49},"sudo cp .\u002F*.svd \u002Fopt\u002FSEGGER\u002FOzone_V338g\u002FConfig\u002FPeripherals\u002F\n",[51,1543,1544],{"__ignoreMap":49},[54,1545,1546,1548,1551,1554,1557,1560],{"class":56,"line":57},[54,1547,75],{"class":74},[54,1549,1550],{"class":78}," cp",[54,1552,1553],{"class":78}," .\u002F",[54,1555,1556],{"class":280},"*",[54,1558,1559],{"class":78},".svd",[54,1561,1562],{"class":78}," \u002Fopt\u002FSEGGER\u002FOzone_V338g\u002FConfig\u002FPeripherals\u002F\n",[16,1564,1565],{},[132,1566],{"alt":49,"src":1567},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage58.webp",[16,1569,1570],{},[132,1571],{"alt":49,"src":1572},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage59.webp",[12,1574,1575],{"id":1575},"工程创建与测试",[39,1577,1579],{"id":1578},"使用cubemx创建工程","使用CubeMX创建工程",[16,1581,1582],{},"点击进入单片机挑选的按钮",[16,1584,1585],{},[132,1586],{"alt":49,"src":1587},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage60.webp",[16,1589,1590],{},"搜索对应芯片，并双击对应芯片选项。",[16,1592,1593],{},[132,1594],{"alt":49,"src":1595},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage61.webp",[16,1597,1598],{},"进行一些配置，以下都是很基础的东西，你在看这个视频前肯定都会了",[16,1600,1601],{},[132,1602],{"alt":49,"src":1603},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage62.webp",[16,1605,1606],{},[132,1607],{"alt":49,"src":1608},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage63.webp",[16,1610,1611],{},"随便开一个IO用来测试，比如LED的GPIO",[16,1613,1614],{},[132,1615],{"alt":49,"src":1616},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage64.webp",[16,1618,1619],{},[132,1620],{"alt":49,"src":1621},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage65.webp",[16,1623,1624],{},"FreeRTOS也要配置一下。",[16,1626,1627],{},[132,1628],{"alt":49,"src":1629},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage66.webp",[16,1631,1632],{},[132,1633],{"alt":49,"src":1634},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage67.webp",[16,1636,1637],{},"这些文件夹也要配置好，最后Toolchain选择CMake,编译器选择GCC(6.14.1及之前没有选择编译器这个选项很正常)",[16,1639,1640],{},"（但是CubeMX6.15.0有bug,这个选择GCC编译器并没有用，还需要后续自己手动选择编译器，以后可能会修复这个bug.）",[16,1642,1643],{},[132,1644],{"alt":49,"src":1645},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage68.webp",[16,1647,1648],{},[132,1649],{"alt":49,"src":1650},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage69.webp",[39,1652,1653],{"id":1653},"对工程进行配置与编译",[16,1655,1656],{},"在工程文件夹打开终端",[16,1658,1659],{},[132,1660],{"alt":49,"src":1661},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage70.webp",[16,1663,1664],{},"然后打开vscode",[44,1666,1668],{"className":46,"code":1667,"language":48,"meta":49,"style":49},"code .\n",[51,1669,1670],{"__ignoreMap":49},[54,1671,1672,1674],{"class":56,"line":57},[54,1673,51],{"class":74},[54,1675,1676],{"class":78}," .\n",[16,1678,1679],{},[132,1680],{"alt":49,"src":1681},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage71.webp",[16,1683,1684],{},"进入vscode后，点击目录下的CMakeLists.txt",[16,1686,1687],{},[132,1688],{"alt":49,"src":1689},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage72.webp",[16,1691,1692],{},"检查第25行左右是否有下面这行，如果没有，你需要手动给他加上这两行。(6.14.1版本没有这个bug)",[16,1694,1695],{},[1696,1697,1698],"em",{},"tips1：这就是上面说的CubeMX6.15.0版本的bug,因为这个版本增加了对clang编译器的支持，在CubeMX里也支持了选择编译器的操作，但是这个选项估计是工程师没写好，选择编译器不管选哪个，他都不会选择咱们选择的编译器，所以咱们需要手动选择。",[16,1700,1701],{},[1696,1702,1703],{},"tips2:这CubeMX6.15.0有第二个bug,这个工作区根CMakeLists.txt他说了只会生成一次，后续不会再重新覆盖生成，但是发现每次在CubeMX修改配置后，然后重新生成代码，其他命令都被保留了，就这个命令不会被保留。不知道后续会不会被修复，或者直接修复上面tips1的bug.所以每次重新配置CubeMX后，需要再把这句加上。",[16,1705,1706],{},[132,1707],{"alt":49,"src":1708},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage73.webp",[44,1710,1712],{"className":46,"code":1711,"language":48,"meta":49,"style":49},"\n# Include toolchain file\ninclude(\"cmake\u002Fgcc-arm-none-eabi.cmake\")\n",[51,1713,1714,1718,1723],{"__ignoreMap":49},[54,1715,1716],{"class":56,"line":57},[54,1717,61],{"emptyLinePlaceholder":60},[54,1719,1720],{"class":56,"line":64},[54,1721,1722],{"class":67},"# Include toolchain file\n",[54,1724,1725,1728,1731],{"class":56,"line":71},[54,1726,1727],{"class":74},"include(",[54,1729,1730],{"class":74},"\"cmake\u002Fgcc-arm-none-eabi.cmake\"",[54,1732,1733],{"class":211},")\n",[16,1735,1736],{},"按ctrl+～打开内置终端。",[16,1738,1739],{},[132,1740],{"alt":49,"src":1741},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage74.webp",[16,1743,1744],{},"使用下方命令创建并进入build文件夹",[44,1746,1748],{"className":46,"code":1747,"language":48,"meta":49,"style":49},"mkdir build\ncd build\n",[51,1749,1750,1758],{"__ignoreMap":49},[54,1751,1752,1755],{"class":56,"line":57},[54,1753,1754],{"class":74},"mkdir",[54,1756,1757],{"class":78}," build\n",[54,1759,1760,1762],{"class":56,"line":64},[54,1761,991],{"class":280},[54,1763,1757],{"class":78},[16,1765,1766],{},[132,1767],{"alt":49,"src":1768},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage75.webp",[16,1770,1771],{},"接下来使用cmake命令生成makefile文件",[44,1773,1775],{"className":46,"code":1774,"language":48,"meta":49,"style":49},"cmake ..\n",[51,1776,1777],{"__ignoreMap":49},[54,1778,1779,1782],{"class":56,"line":57},[54,1780,1781],{"class":74},"cmake",[54,1783,1784],{"class":78}," ..\n",[16,1786,1787],{},"检查一下是否ARM的C\u002FC++以及汇编编译器都被找到了（如果没有，请检查上面的教程是否有做错的地方）",[16,1789,1790],{},[132,1791],{"alt":49,"src":1792},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage76.webp",[16,1794,1795,1796,1799,1800,1803,1804,1806,1807,1809,1810,1812],{},"然后使用make命令进行编译，命令为",[51,1797,1798],{},"make","或者",[51,1801,1802],{},"make -jxx",",这里的xx是你想使用CPU的几个线程来进行编译，比如我电脑是8核16线程，我就可以让xx是比16低的数字。而",[51,1805,1798],{},"是默认用一个线程。如果你并不知道你CPU有几个线程，那你就老老实实用",[51,1808,1798],{},"命令，别用",[51,1811,1802],{},"命令了。",[44,1814,1816],{"className":46,"code":1815,"language":48,"meta":49,"style":49},"make -j16\n",[51,1817,1818],{"__ignoreMap":49},[54,1819,1820,1822],{"class":56,"line":57},[54,1821,1798],{"class":74},[54,1823,1824],{"class":280}," -j16\n",[16,1826,1827],{},"这样就是编译成功了。",[16,1829,1830],{},[132,1831],{"alt":49,"src":1832},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage77.webp",[39,1834,1835],{"id":1835},"对代码提示进行配置",[16,1837,1838],{},"在VScode中按Ctrl+Shift+P,搜索clangd,并选择下载语言服务",[16,1840,1841],{},[132,1842],{"alt":49,"src":1843},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage78.webp",[16,1845,1846],{},"在右下角选择安装即可，安装完就会出现下图提示。",[16,1848,1849],{},[132,1850],{"alt":49,"src":1851},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage79.webp",[16,1853,1854],{},"接着禁用C\u002FC++插件的代码提示功能(如果没这个界面，请往下看)",[16,1856,1857],{},[132,1858],{"alt":49,"src":1859},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage80.webp",[16,1861,1862],{},"如果没有上图的弹窗，可以进行手动关闭，依然是ctrl shift P,输入settings然后找到如下图的选项",[16,1864,1865],{},[132,1866],{"alt":49,"src":1867},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage81.webp",[16,1869,1870],{},"找到下图这个选项，改成disabled即可。",[16,1872,1873],{},[51,1874,1875],{},"\"C_Cpp.intelliSenseEngine\": \"disabled\"",[16,1877,1878],{},[132,1879],{"alt":49,"src":1880},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage82.webp",[16,1882,1883],{},"在VScode中再按Ctrl+Shift+P,搜索clangd,并选择重启clangd语言服务(重启clangd语言服务之前必须编译过一遍代码了)",[16,1885,1886],{},[132,1887],{"alt":49,"src":1888},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage83.webp",[16,1890,1891],{},"此时，可以看代码里头文件都正常识别了,代码提示也正常了。",[16,1893,1894],{},[132,1895],{"alt":49,"src":1896},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage84.webp",[16,1898,1899],{},[132,1900],{"alt":49,"src":1901},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage85.webp",[16,1903,1904],{},[132,1905],{"alt":49,"src":1906},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage86.webp",[16,1908,1909,1910,1917,1918,1921],{},"⚠️注意：Clangd 默认找的是 ",[364,1911,1912,1913,1916],{},"本机系统的 libc\u002Finclude 路径（比如 x86_64 的 ",[51,1914,1915],{},"\u002Fusr\u002Finclude","）"," ，而我们工程里面实际使用的是 ",[364,1919,1920],{},"ARM 工具链的头文件路径"," ，这就有概率导致包含C\u002FC++库函数的头文件报错",[16,1923,1924],{},"例如：",[16,1926,1927],{},[132,1928],{"alt":49,"src":1929},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage87.webp",[16,1931,1932],{},"这里的 #include \u003Cmath.h>显示找不到头文件，但是我们进行编译的时候却没有报错，说明是clangd的配置有问题 。以下介绍一种解决方法：",[20,1934,1935],{},[23,1936,1937],{},"运行以下命令，获取 ARM GCC 使用的标准 include 路径：",[44,1939,1941],{"className":46,"code":1940,"language":48,"meta":49,"style":49},"arm-none-eabi-gcc -x c -E -v - \u003C\u002Fdev\u002Fnull\n",[51,1942,1943],{"__ignoreMap":49},[54,1944,1945,1947,1950,1953,1956,1959,1962,1965],{"class":56,"line":57},[54,1946,1228],{"class":74},[54,1948,1949],{"class":280}," -x",[54,1951,1952],{"class":78}," c",[54,1954,1955],{"class":280}," -E",[54,1957,1958],{"class":280}," -v",[54,1960,1961],{"class":78}," -",[54,1963,1964],{"class":204}," \u003C",[54,1966,1967],{"class":78},"\u002Fdev\u002Fnull\n",[16,1969,1970],{},[132,1971],{"alt":49,"src":1972},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage88.webp",[20,1974,1975],{"start":64},[23,1976,1977],{},"在工程根目录下面创建 .clangd 文件 将自己的头文件路径包含进去（引号里面替换成你自己的arm gcc头文件路径）",[44,1979,1982],{"className":1980,"code":1981,"language":143},[141],"CompileFlags:\n  Add: [\n    \"-isystem\", \"\u002Fhome\u002Fxiaofang\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Flib\u002Fgcc\u002Farm-none-eabi\u002F14.3.1\u002Finclude\",\n    \"-isystem\", \"\u002Fhome\u002Fxiaofang\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Flib\u002Fgcc\u002Farm-none-eabi\u002F14.3.1\u002Finclude-fixed\",\n    \"-isystem\", \"\u002Fhome\u002Fxiaofang\u002FApplications\u002Farm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi\u002Farm-none-eabi\u002Finclude\"\n  ]\n",[51,1983,1981],{"__ignoreMap":49},[16,1985,1986],{},"保存，此时刷新一下clangd,头文件提示正常",[16,1988,1989],{},[132,1990],{"alt":49,"src":1991},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage89.webp",[39,1993,1995],{"id":1994},"移植vinci机器人队标准cc工程模板","移植Vinci机器人队标准C\u002FC++工程模板",[16,1997,1998,1999],{},"用git clone命令克隆仓库:",[356,2000,2001],{"href":2001,"rel":2002},"https:\u002F\u002Fgithub.com\u002Ftungchiahui\u002FCubeMX_MDK5to6_Template",[360],[44,2004,2006],{"className":46,"code":2005,"language":48,"meta":49,"style":49},"git clone https:\u002F\u002Fgithub.com\u002Ftungchiahui\u002FCubeMX_MDK5to6_Template.git\n",[51,2007,2008],{"__ignoreMap":49},[54,2009,2010,2013,2016],{"class":56,"line":57},[54,2011,2012],{"class":74},"git",[54,2014,2015],{"class":78}," clone",[54,2017,2018],{"class":78}," https:\u002F\u002Fgithub.com\u002Ftungchiahui\u002FCubeMX_MDK5to6_Template.git\n",[16,2020,2021,2022,2025],{},"把仓库里的“工程文件移植”文件夹里的 ",[364,2023,2024],{},"所有内容"," 复制到我们CMake工程的目录里。",[16,2027,2028],{},[132,2029],{"alt":49,"src":2030},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage90.webp",[16,2032,2033],{},"然后打开applications文件夹，在Src和Inc文件夹分别创建led_task.cpp和led_task.h，内容分别如下:",[16,2035,2036],{},[132,2037],{"alt":49,"src":2038},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage91.webp",[16,2040,2041],{},"led_task.cpp:",[44,2043,2045],{"className":195,"code":2044,"language":197,"meta":49,"style":49},"#include \"led_task.h\"\n#include \"cmsis_os.h\"\n#include \"stm32f1xx_hal.h\" \n\nGPIO_PinState pinstate = GPIO_PIN_RESET;\n\nextern \"C\"\nvoid StartDefaultTask(void *argument)\n{\n  for(;;)\n  {\n    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,pinstate);\n    pinstate = (pinstate == GPIO_PIN_RESET) ? GPIO_PIN_SET : GPIO_PIN_RESET;\n    osDelay(500);\n  }\n}\n",[51,2046,2047,2054,2061,2070,2074,2084,2088,2096,2116,2122,2131,2137,2146,2174,2188,2194],{"__ignoreMap":49},[54,2048,2049,2051],{"class":56,"line":57},[54,2050,205],{"class":204},[54,2052,2053],{"class":78}," \"led_task.h\"\n",[54,2055,2056,2058],{"class":56,"line":64},[54,2057,205],{"class":204},[54,2059,2060],{"class":78}," \"cmsis_os.h\"\n",[54,2062,2063,2065,2068],{"class":56,"line":71},[54,2064,205],{"class":204},[54,2066,2067],{"class":78}," \"stm32f1xx_hal.h\"",[54,2069,212],{"class":211},[54,2071,2072],{"class":56,"line":100},[54,2073,61],{"emptyLinePlaceholder":60},[54,2075,2076,2079,2081],{"class":56,"line":105},[54,2077,2078],{"class":211},"GPIO_PinState pinstate ",[54,2080,528],{"class":204},[54,2082,2083],{"class":211}," GPIO_PIN_RESET;\n",[54,2085,2086],{"class":56,"line":111},[54,2087,61],{"emptyLinePlaceholder":60},[54,2089,2090,2093],{"class":56,"line":587},[54,2091,2092],{"class":204},"extern",[54,2094,2095],{"class":78}," \"C\"\n",[54,2097,2098,2101,2104,2106,2108,2111,2114],{"class":56,"line":613},[54,2099,2100],{"class":204},"void",[54,2102,2103],{"class":74}," StartDefaultTask",[54,2105,223],{"class":211},[54,2107,2100],{"class":204},[54,2109,2110],{"class":204}," *",[54,2112,2113],{"class":228},"argument",[54,2115,1733],{"class":211},[54,2117,2119],{"class":56,"line":2118},9,[54,2120,2121],{"class":211},"{\n",[54,2123,2125,2128],{"class":56,"line":2124},10,[54,2126,2127],{"class":204},"  for",[54,2129,2130],{"class":211},"(;;)\n",[54,2132,2134],{"class":56,"line":2133},11,[54,2135,2136],{"class":211},"  {\n",[54,2138,2140,2143],{"class":56,"line":2139},12,[54,2141,2142],{"class":74},"    HAL_GPIO_WritePin",[54,2144,2145],{"class":211},"(GPIOC,GPIO_PIN_13,pinstate);\n",[54,2147,2149,2152,2154,2157,2160,2163,2166,2169,2172],{"class":56,"line":2148},13,[54,2150,2151],{"class":211},"    pinstate ",[54,2153,528],{"class":204},[54,2155,2156],{"class":211}," (pinstate ",[54,2158,2159],{"class":204},"==",[54,2161,2162],{"class":211}," GPIO_PIN_RESET) ",[54,2164,2165],{"class":204},"?",[54,2167,2168],{"class":211}," GPIO_PIN_SET ",[54,2170,2171],{"class":204},":",[54,2173,2083],{"class":211},[54,2175,2177,2180,2182,2185],{"class":56,"line":2176},14,[54,2178,2179],{"class":74},"    osDelay",[54,2181,223],{"class":211},[54,2183,2184],{"class":280},"500",[54,2186,2187],{"class":211},");\n",[54,2189,2191],{"class":56,"line":2190},15,[54,2192,2193],{"class":211},"  }\n",[54,2195,2197],{"class":56,"line":2196},16,[54,2198,289],{"class":211},[16,2200,2201],{},"led_task.h:",[44,2203,2205],{"className":195,"code":2204,"language":197,"meta":49,"style":49},"#ifndef __LED_TASK_H_\n#define __LED_TASK_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include \"cpp_interface.h\"\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n",[51,2206,2207,2215,2222,2226,2234,2240,2244,2249,2253,2260,2264,2270,2274,2278,2282],{"__ignoreMap":49},[54,2208,2209,2212],{"class":56,"line":57},[54,2210,2211],{"class":204},"#ifndef",[54,2213,2214],{"class":74}," __LED_TASK_H_\n",[54,2216,2217,2220],{"class":56,"line":64},[54,2218,2219],{"class":204},"#define",[54,2221,2214],{"class":74},[54,2223,2224],{"class":56,"line":71},[54,2225,61],{"emptyLinePlaceholder":60},[54,2227,2228,2231],{"class":56,"line":100},[54,2229,2230],{"class":204},"#ifdef",[54,2232,2233],{"class":74}," __cplusplus\n",[54,2235,2236,2238],{"class":56,"line":105},[54,2237,2092],{"class":204},[54,2239,2095],{"class":78},[54,2241,2242],{"class":56,"line":111},[54,2243,2121],{"class":211},[54,2245,2246],{"class":56,"line":587},[54,2247,2248],{"class":204},"#endif\n",[54,2250,2251],{"class":56,"line":613},[54,2252,61],{"emptyLinePlaceholder":60},[54,2254,2255,2257],{"class":56,"line":2118},[54,2256,205],{"class":204},[54,2258,2259],{"class":78}," \"cpp_interface.h\"\n",[54,2261,2262],{"class":56,"line":2124},[54,2263,61],{"emptyLinePlaceholder":60},[54,2265,2266,2268],{"class":56,"line":2133},[54,2267,2230],{"class":204},[54,2269,2233],{"class":74},[54,2271,2272],{"class":56,"line":2139},[54,2273,289],{"class":211},[54,2275,2276],{"class":56,"line":2148},[54,2277,2248],{"class":204},[54,2279,2280],{"class":56,"line":2176},[54,2281,61],{"emptyLinePlaceholder":60},[54,2283,2284],{"class":56,"line":2190},[54,2285,2248],{"class":204},[16,2287,2288,2289,2292,2293,2296],{},"然后打开",[51,2290,2291],{},"cmake\u002Fuser","文件夹下的",[51,2294,2295],{},"CMakeLists.txt","，把刚才新建的led_task.cpp添加上去。",[16,2298,2299,2300,2303,2304,2306,2307,2309,2310,2312,2313,2315,2316,2318,2319,2321,2322,2325],{},"详细介绍（可以不看）：这里的",[51,2301,2302],{},"cmake\u002Fstm32cubemx","下的",[51,2305,2295],{},"是被CubeMX管理的，你重新用CubeMX生成新代码后，这个文件里的东西会被覆盖。而工作区根目录下的",[51,2308,2295],{},"是不会被重新覆盖的，而且给我们留了一些区域加源文件和头文件，但是这样会让这个文件太过于嘈杂。所以我们选择新建一个user文件夹，然后在这里面弄一个",[51,2311,2295],{},"，再用顶层",[51,2314,2295],{},"去加载这个子",[51,2317,2295],{},"，这个子",[51,2320,2295],{},"方便咱们修改，文件结构也更加明显。（这些都不需要咱们自己创建，我已经给创建到 ",[364,2323,2324],{},"工程文件移植"," 里了，你在上面复制的时候已经复制过来了）",[16,2327,2328],{},[132,2329],{"alt":49,"src":2330},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage92.webp",[16,2332,2333],{},"然后要去最顶层的CMakeLists.txt里加上这句话来引用我们自己的CMakeLists.txt。",[16,2335,2336],{},[132,2337],{"alt":49,"src":2338},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage93.webp",[44,2340,2343],{"className":2341,"code":2342,"language":1781,"meta":49,"style":49},"language-cmake shiki shiki-themes github-light github-dark","\n# Add USER generated sources\nadd_subdirectory(cmake\u002Fuser)\n",[51,2344,2345,2349,2354],{"__ignoreMap":49},[54,2346,2347],{"class":56,"line":57},[54,2348,61],{"emptyLinePlaceholder":60},[54,2350,2351],{"class":56,"line":64},[54,2352,2353],{"class":67},"# Add USER generated sources\n",[54,2355,2356,2359],{"class":56,"line":71},[54,2357,2358],{"class":204},"add_subdirectory",[54,2360,2361],{"class":211},"(cmake\u002Fuser)\n",[16,2363,2364],{},"大功告成，编译一次试试。可以看到下图，那些新加的文件都编译上了。",[44,2366,2368],{"className":46,"code":2367,"language":48,"meta":49,"style":49},"cmake ..\nmake\n",[51,2369,2370,2376],{"__ignoreMap":49},[54,2371,2372,2374],{"class":56,"line":57},[54,2373,1781],{"class":74},[54,2375,1784],{"class":78},[54,2377,2378],{"class":56,"line":64},[54,2379,2380],{"class":74},"make\n",[16,2382,2383],{},[132,2384],{"alt":49,"src":2385},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage94.webp",[16,2387,2388],{},"然后去main.c中引用cpp_interface.h头文件，并将cpp_main()函数在main函数的这个地方调用。(我这里是开RTOS了，所以需要在启动RTOS之前调用cpp_main函数，如果你是没有用RTOS的裸机程序，则在while (1)的上方调用cpp_main即可)",[16,2390,2391],{},[132,2392],{"alt":49,"src":2393},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage95.webp",[16,2395,2396],{},[132,2397],{"alt":49,"src":2398},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage96.webp",[16,2400,2401],{},"然后在cpp_interface.h里修改isRTOS这个宏来让程序知道你是否开启了RTOS，如果开启了，宏就为1，裸机就填0。",[16,2403,2404],{},[132,2405],{"alt":49,"src":2406},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage97.webp",[16,2408,2409],{},[132,2410],{"alt":49,"src":2411},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage98.webp",[16,2413,2414,2415,2419],{},"其他更加详细的关于STM32的C\u002FC++工程介绍请看",[356,2416,2418],{"href":2417},"\u002Fwiki\u002F2023-10-09-stm32-freertos-jiao-cheng","Vinci机器人队单片机教程","。",[16,2421,2422],{},"此时在build文件夹下进行编译程序，发现成功!",[44,2424,2425],{"className":46,"code":2367,"language":48,"meta":49,"style":49},[51,2426,2427,2433],{"__ignoreMap":49},[54,2428,2429,2431],{"class":56,"line":57},[54,2430,1781],{"class":74},[54,2432,1784],{"class":78},[54,2434,2435],{"class":56,"line":64},[54,2436,2380],{"class":74},[16,2438,2439],{},[132,2440],{"alt":49,"src":2441},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage99.webp",[39,2443,2444],{"id":2444},"下载程序到板子",[910,2446,2448],{"id":2447},"配置cmake生成bin和hex文件","配置CMake生成.bin和.hex文件",[16,2450,2451],{},"在下载程序到板子之前，我们需要去看看咱们之前编译的到底生成了啥文件。",[16,2453,2454],{},"通过下图可知，他只生成了.elf文件，并没有咱们常见的.bin和.hex文件。",[16,2456,2457],{},[132,2458],{"alt":49,"src":2459},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage100.webp",[16,2461,2462],{},"咱们需要再更改一下工作区下的CMakeLists.txt从而来让编译的时候生成.hex和.bin（没办法，就得这么麻烦，我也不知道为啥CubeMX不给全干好）",[16,2464,2465],{},[132,2466],{"alt":49,"src":2467},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage101.webp",[44,2469,2471],{"className":2341,"code":2470,"language":1781,"meta":49,"style":49},"\n# 生成 .bin 和 .hex 文件\nfind_program(OBJCOPY arm-none-eabi-objcopy REQUIRED)\n\nadd_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD\n    COMMAND ${OBJCOPY} -O binary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin\n    COMMAND ${OBJCOPY} -O ihex   ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex\n    COMMENT \"Generating ${CMAKE_PROJECT_NAME}.bin and ${CMAKE_PROJECT_NAME}.hex from ${CMAKE_PROJECT_NAME}.elf\"\n)\n",[51,2472,2473,2477,2482,2490,2494,2510,2532,2550,2558],{"__ignoreMap":49},[54,2474,2475],{"class":56,"line":57},[54,2476,61],{"emptyLinePlaceholder":60},[54,2478,2479],{"class":56,"line":64},[54,2480,2481],{"class":67},"# 生成 .bin 和 .hex 文件\n",[54,2483,2484,2487],{"class":56,"line":71},[54,2485,2486],{"class":204},"find_program",[54,2488,2489],{"class":211},"(OBJCOPY arm-none-eabi-objcopy REQUIRED)\n",[54,2491,2492],{"class":56,"line":100},[54,2493,61],{"emptyLinePlaceholder":60},[54,2495,2496,2499,2501,2504,2507],{"class":56,"line":105},[54,2497,2498],{"class":204},"add_custom_command",[54,2500,223],{"class":211},[54,2502,2503],{"class":204},"TARGET",[54,2505,2506],{"class":204}," ${CMAKE_PROJECT_NAME}",[54,2508,2509],{"class":211}," POST_BUILD\n",[54,2511,2512,2515,2518,2521,2524,2527,2529],{"class":56,"line":111},[54,2513,2514],{"class":204},"    COMMAND",[54,2516,2517],{"class":204}," ${OBJCOPY}",[54,2519,2520],{"class":211}," -O binary ",[54,2522,2523],{"class":204},"${CMAKE_PROJECT_NAME}",[54,2525,2526],{"class":211},".elf ",[54,2528,2523],{"class":204},[54,2530,2531],{"class":211},".bin\n",[54,2533,2534,2536,2538,2541,2543,2545,2547],{"class":56,"line":587},[54,2535,2514],{"class":204},[54,2537,2517],{"class":204},[54,2539,2540],{"class":211}," -O ihex   ",[54,2542,2523],{"class":204},[54,2544,2526],{"class":211},[54,2546,2523],{"class":204},[54,2548,2549],{"class":211},".hex\n",[54,2551,2552,2555],{"class":56,"line":613},[54,2553,2554],{"class":204},"    COMMENT",[54,2556,2557],{"class":78}," \"Generating ${CMAKE_PROJECT_NAME}.bin and ${CMAKE_PROJECT_NAME}.hex from ${CMAKE_PROJECT_NAME}.elf\"\n",[54,2559,2560],{"class":56,"line":2118},[54,2561,1733],{"class":211},[16,2563,2564],{},"这些需要在工作区主CMakeLists.txt里添加的命令我全都写在这个记事本里了，每次生成新工程直接复制即可。",[16,2566,2567],{},[132,2568],{"alt":49,"src":2569},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage102.webp",[16,2571,2572],{},[132,2573],{"alt":49,"src":2574},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage103.webp",[16,2576,2577],{},"然后再次编译",[44,2579,2580],{"className":46,"code":2367,"language":48,"meta":49,"style":49},[51,2581,2582,2588],{"__ignoreMap":49},[54,2583,2584,2586],{"class":56,"line":57},[54,2585,1781],{"class":74},[54,2587,1784],{"class":78},[54,2589,2590],{"class":56,"line":64},[54,2591,2380],{"class":74},[16,2593,2594],{},[132,2595],{"alt":49,"src":2596},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage104.webp",[16,2598,2599],{},"此时再看build目录：咱们需要的.hex或者.bin就出来了",[16,2601,2602],{},[132,2603],{"alt":49,"src":2604},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage105.webp",[910,2606,2608],{"id":2607},"将设备连接到jlink并烧录程序","将设备连接到JLink并烧录程序",[925,2610,2611],{"id":2611},"图形界面烧录",[44,2613,2615],{"className":46,"code":2614,"language":48,"meta":49,"style":49},"#打开终端输入\nJFlashLite\n",[51,2616,2617,2622],{"__ignoreMap":49},[54,2618,2619],{"class":56,"line":57},[54,2620,2621],{"class":67},"#打开终端输入\n",[54,2623,2624],{"class":56,"line":64},[54,2625,2626],{"class":74},"JFlashLite\n",[16,2628,2629],{},"选择对应的芯片型号和速度",[16,2631,2632],{},[132,2633],{"alt":49,"src":2634},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage106.webp",[16,2636,2637],{},"添加hex文件",[16,2639,2640],{},[132,2641],{"alt":49,"src":2642},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage107.webp",[16,2644,2645],{},[132,2646],{"alt":49,"src":2647},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage108.webp",[16,2649,2650],{},"点击烧录并完成：",[16,2652,2653],{},[132,2654],{"alt":49,"src":2655},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage109.webp",[16,2657,2658],{},"成功点亮led：",[16,2660,2661],{},[132,2662],{"alt":49,"src":2663},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage110.webp",[925,2665,2666],{"id":2666},"终端烧录",[16,2668,2669],{},"算鸟算鸟，太麻烦了。",[39,2671,2673],{"id":2672},"配置vscode任务","配置VScode任务",[16,2675,2676],{},"咱们在上面编译，一直需要输入以下命令",[44,2678,2680],{"className":2341,"code":2679,"language":1781,"meta":49,"style":49},"cd build\ncmake ..\nmake\n",[51,2681,2682,2687,2691],{"__ignoreMap":49},[54,2683,2684],{"class":56,"line":57},[54,2685,2686],{"class":211},"cd build\n",[54,2688,2689],{"class":56,"line":64},[54,2690,1774],{"class":211},[54,2692,2693],{"class":56,"line":71},[54,2694,2380],{"class":211},[16,2696,2697],{},"这样每次编译过于麻烦了，所以我们使用强大的VScode来一键编译。",[16,2699,2700,2701,2704,2705,2708],{},"首先创建",[51,2702,2703],{},".vscode","文件夹和",[51,2706,2707],{},"tasks.json","文件",[16,2710,2711],{},[132,2712],{"alt":49,"src":2713},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage111.webp",[16,2715,2716,2717,2719],{},"以下是",[51,2718,2707],{},"的内容：",[44,2721,2725],{"className":2722,"code":2723,"language":2724,"meta":49,"style":49},"language-json shiki shiki-themes github-light github-dark","{\n    \"version\": \"2.0.0\",\n    \"options\": {\n        \"cwd\": \"${workspaceFolder}\u002Fbuild\"    \u002F\u002F需要进入到我们执行tasks任务的文件夹中\n    },\n    \"tasks\": [    \u002F\u002Ftasks包含4个任务\n        {\n            \"type\": \"shell\",\n            \"label\": \"stm32-cmake\",    \u002F\u002F第一个任务的名字叫cmake\n            \"command\": \"bash\",\n            \"args\": [\n                \"-c\",\n                \"mkdir -p ..\u002Flog && echo \\\"===== CMake started at: $(date) =====\\\" | tee -a ..\u002Flog\u002Fcmake.log && cmake .. 2>&1 | tee -a ..\u002Flog\u002Fcmake.log\"\n            ],\n            \"problemMatcher\": []    \u002F\u002F这里需要添加一个空的问题匹配器，否则会报错\n        },\n        {\n            \"label\": \"stm32-make\",    \u002F\u002F第二个任务的名字叫make\n            \"command\": \"bash\",\n            \"args\": [\n                \"-c\",\n                \"mkdir -p ..\u002Flog && echo \\\"===== Make started at: $(date) =====\\\" | tee -a ..\u002Flog\u002Fmake.log && make -j$(grep -c ^processor \u002Fproc\u002Fcpuinfo) 2>&1 | tee -a ..\u002Flog\u002Fmake.log\"\n            ],\n            \"problemMatcher\": []    \u002F\u002F这里也需要添加一个空的问题匹配器，否则会报错\n        },\n        {\n            \"label\": \"stm32-Build\",    \u002F\u002F第3个任务的名字叫Build\n            \"group\": {               \u002F\u002F默认是build任务\n                \"kind\": \"build\",\n                \"isDefault\": true\n            },\n            \"dependsOrder\": \"sequence\",    \u002F\u002F顺序执行依赖项\n            \"dependsOn\":[    \u002F\u002F依赖的2个项为cmake、make\n                \"stm32-cmake\",    \u002F\u002F即第一个任务的label\n                \"stm32-make\"      \u002F\u002F即第二个任务的label\n            ]\n        },\n        {\n            \"type\": \"shell\",\n            \"label\": \"stm32-clean\",    \u002F\u002F第四个任务：清理 build 文件夹\n            \"command\": \"bash\",\n            \"args\": [\n                \"-c\",\n                \"echo \\\"===== Clean started at: $(date) =====\\\" && rm -rf * && echo \\\"Build folder cleaned.\\\"\"\n            ],\n            \"options\": {\n                \"cwd\": \"${workspaceFolder}\u002Fbuild\"    \u002F\u002F只清理build目录下的文件\n            },\n            \"problemMatcher\": []    \u002F\u002F不需要问题匹配器\n        }\n\n    ]\n}\n","json",[51,2726,2727,2731,2745,2753,2766,2771,2782,2787,2799,2815,2827,2835,2842,2858,2863,2874,2879,2884,2899,2910,2917,2924,2939,2944,2954,2959,2964,2979,2991,3004,3015,3021,3037,3049,3060,3069,3075,3080,3085,3096,3111,3122,3129,3136,3162,3167,3175,3188,3193,3203,3209,3214,3220],{"__ignoreMap":49},[54,2728,2729],{"class":56,"line":57},[54,2730,2121],{"class":211},[54,2732,2733,2736,2739,2742],{"class":56,"line":64},[54,2734,2735],{"class":280},"    \"version\"",[54,2737,2738],{"class":211},": ",[54,2740,2741],{"class":78},"\"2.0.0\"",[54,2743,2744],{"class":211},",\n",[54,2746,2747,2750],{"class":56,"line":71},[54,2748,2749],{"class":280},"    \"options\"",[54,2751,2752],{"class":211},": {\n",[54,2754,2755,2758,2760,2763],{"class":56,"line":100},[54,2756,2757],{"class":280},"        \"cwd\"",[54,2759,2738],{"class":211},[54,2761,2762],{"class":78},"\"${workspaceFolder}\u002Fbuild\"",[54,2764,2765],{"class":67},"    \u002F\u002F需要进入到我们执行tasks任务的文件夹中\n",[54,2767,2768],{"class":56,"line":105},[54,2769,2770],{"class":211},"    },\n",[54,2772,2773,2776,2779],{"class":56,"line":111},[54,2774,2775],{"class":280},"    \"tasks\"",[54,2777,2778],{"class":211},": [    ",[54,2780,2781],{"class":67},"\u002F\u002Ftasks包含4个任务\n",[54,2783,2784],{"class":56,"line":587},[54,2785,2786],{"class":211},"        {\n",[54,2788,2789,2792,2794,2797],{"class":56,"line":613},[54,2790,2791],{"class":280},"            \"type\"",[54,2793,2738],{"class":211},[54,2795,2796],{"class":78},"\"shell\"",[54,2798,2744],{"class":211},[54,2800,2801,2804,2806,2809,2812],{"class":56,"line":2118},[54,2802,2803],{"class":280},"            \"label\"",[54,2805,2738],{"class":211},[54,2807,2808],{"class":78},"\"stm32-cmake\"",[54,2810,2811],{"class":211},",    ",[54,2813,2814],{"class":67},"\u002F\u002F第一个任务的名字叫cmake\n",[54,2816,2817,2820,2822,2825],{"class":56,"line":2124},[54,2818,2819],{"class":280},"            \"command\"",[54,2821,2738],{"class":211},[54,2823,2824],{"class":78},"\"bash\"",[54,2826,2744],{"class":211},[54,2828,2829,2832],{"class":56,"line":2133},[54,2830,2831],{"class":280},"            \"args\"",[54,2833,2834],{"class":211},": [\n",[54,2836,2837,2840],{"class":56,"line":2139},[54,2838,2839],{"class":78},"                \"-c\"",[54,2841,2744],{"class":211},[54,2843,2844,2847,2850,2853,2855],{"class":56,"line":2148},[54,2845,2846],{"class":78},"                \"mkdir -p ..\u002Flog && echo ",[54,2848,2849],{"class":280},"\\\"",[54,2851,2852],{"class":78},"===== CMake started at: $(date) =====",[54,2854,2849],{"class":280},[54,2856,2857],{"class":78}," | tee -a ..\u002Flog\u002Fcmake.log && cmake .. 2>&1 | tee -a ..\u002Flog\u002Fcmake.log\"\n",[54,2859,2860],{"class":56,"line":2176},[54,2861,2862],{"class":211},"            ],\n",[54,2864,2865,2868,2871],{"class":56,"line":2190},[54,2866,2867],{"class":280},"            \"problemMatcher\"",[54,2869,2870],{"class":211},": []    ",[54,2872,2873],{"class":67},"\u002F\u002F这里需要添加一个空的问题匹配器，否则会报错\n",[54,2875,2876],{"class":56,"line":2196},[54,2877,2878],{"class":211},"        },\n",[54,2880,2882],{"class":56,"line":2881},17,[54,2883,2786],{"class":211},[54,2885,2887,2889,2891,2894,2896],{"class":56,"line":2886},18,[54,2888,2803],{"class":280},[54,2890,2738],{"class":211},[54,2892,2893],{"class":78},"\"stm32-make\"",[54,2895,2811],{"class":211},[54,2897,2898],{"class":67},"\u002F\u002F第二个任务的名字叫make\n",[54,2900,2902,2904,2906,2908],{"class":56,"line":2901},19,[54,2903,2819],{"class":280},[54,2905,2738],{"class":211},[54,2907,2824],{"class":78},[54,2909,2744],{"class":211},[54,2911,2913,2915],{"class":56,"line":2912},20,[54,2914,2831],{"class":280},[54,2916,2834],{"class":211},[54,2918,2920,2922],{"class":56,"line":2919},21,[54,2921,2839],{"class":78},[54,2923,2744],{"class":211},[54,2925,2927,2929,2931,2934,2936],{"class":56,"line":2926},22,[54,2928,2846],{"class":78},[54,2930,2849],{"class":280},[54,2932,2933],{"class":78},"===== Make started at: $(date) =====",[54,2935,2849],{"class":280},[54,2937,2938],{"class":78}," | tee -a ..\u002Flog\u002Fmake.log && make -j$(grep -c ^processor \u002Fproc\u002Fcpuinfo) 2>&1 | tee -a ..\u002Flog\u002Fmake.log\"\n",[54,2940,2942],{"class":56,"line":2941},23,[54,2943,2862],{"class":211},[54,2945,2947,2949,2951],{"class":56,"line":2946},24,[54,2948,2867],{"class":280},[54,2950,2870],{"class":211},[54,2952,2953],{"class":67},"\u002F\u002F这里也需要添加一个空的问题匹配器，否则会报错\n",[54,2955,2957],{"class":56,"line":2956},25,[54,2958,2878],{"class":211},[54,2960,2962],{"class":56,"line":2961},26,[54,2963,2786],{"class":211},[54,2965,2967,2969,2971,2974,2976],{"class":56,"line":2966},27,[54,2968,2803],{"class":280},[54,2970,2738],{"class":211},[54,2972,2973],{"class":78},"\"stm32-Build\"",[54,2975,2811],{"class":211},[54,2977,2978],{"class":67},"\u002F\u002F第3个任务的名字叫Build\n",[54,2980,2982,2985,2988],{"class":56,"line":2981},28,[54,2983,2984],{"class":280},"            \"group\"",[54,2986,2987],{"class":211},": {               ",[54,2989,2990],{"class":67},"\u002F\u002F默认是build任务\n",[54,2992,2994,2997,2999,3002],{"class":56,"line":2993},29,[54,2995,2996],{"class":280},"                \"kind\"",[54,2998,2738],{"class":211},[54,3000,3001],{"class":78},"\"build\"",[54,3003,2744],{"class":211},[54,3005,3007,3010,3012],{"class":56,"line":3006},30,[54,3008,3009],{"class":280},"                \"isDefault\"",[54,3011,2738],{"class":211},[54,3013,3014],{"class":280},"true\n",[54,3016,3018],{"class":56,"line":3017},31,[54,3019,3020],{"class":211},"            },\n",[54,3022,3024,3027,3029,3032,3034],{"class":56,"line":3023},32,[54,3025,3026],{"class":280},"            \"dependsOrder\"",[54,3028,2738],{"class":211},[54,3030,3031],{"class":78},"\"sequence\"",[54,3033,2811],{"class":211},[54,3035,3036],{"class":67},"\u002F\u002F顺序执行依赖项\n",[54,3038,3040,3043,3046],{"class":56,"line":3039},33,[54,3041,3042],{"class":280},"            \"dependsOn\"",[54,3044,3045],{"class":211},":[    ",[54,3047,3048],{"class":67},"\u002F\u002F依赖的2个项为cmake、make\n",[54,3050,3052,3055,3057],{"class":56,"line":3051},34,[54,3053,3054],{"class":78},"                \"stm32-cmake\"",[54,3056,2811],{"class":211},[54,3058,3059],{"class":67},"\u002F\u002F即第一个任务的label\n",[54,3061,3063,3066],{"class":56,"line":3062},35,[54,3064,3065],{"class":78},"                \"stm32-make\"",[54,3067,3068],{"class":67},"      \u002F\u002F即第二个任务的label\n",[54,3070,3072],{"class":56,"line":3071},36,[54,3073,3074],{"class":211},"            ]\n",[54,3076,3078],{"class":56,"line":3077},37,[54,3079,2878],{"class":211},[54,3081,3083],{"class":56,"line":3082},38,[54,3084,2786],{"class":211},[54,3086,3088,3090,3092,3094],{"class":56,"line":3087},39,[54,3089,2791],{"class":280},[54,3091,2738],{"class":211},[54,3093,2796],{"class":78},[54,3095,2744],{"class":211},[54,3097,3099,3101,3103,3106,3108],{"class":56,"line":3098},40,[54,3100,2803],{"class":280},[54,3102,2738],{"class":211},[54,3104,3105],{"class":78},"\"stm32-clean\"",[54,3107,2811],{"class":211},[54,3109,3110],{"class":67},"\u002F\u002F第四个任务：清理 build 文件夹\n",[54,3112,3114,3116,3118,3120],{"class":56,"line":3113},41,[54,3115,2819],{"class":280},[54,3117,2738],{"class":211},[54,3119,2824],{"class":78},[54,3121,2744],{"class":211},[54,3123,3125,3127],{"class":56,"line":3124},42,[54,3126,2831],{"class":280},[54,3128,2834],{"class":211},[54,3130,3132,3134],{"class":56,"line":3131},43,[54,3133,2839],{"class":78},[54,3135,2744],{"class":211},[54,3137,3139,3142,3144,3147,3149,3152,3154,3157,3159],{"class":56,"line":3138},44,[54,3140,3141],{"class":78},"                \"echo ",[54,3143,2849],{"class":280},[54,3145,3146],{"class":78},"===== Clean started at: $(date) =====",[54,3148,2849],{"class":280},[54,3150,3151],{"class":78}," && rm -rf * && echo ",[54,3153,2849],{"class":280},[54,3155,3156],{"class":78},"Build folder cleaned.",[54,3158,2849],{"class":280},[54,3160,3161],{"class":78},"\"\n",[54,3163,3165],{"class":56,"line":3164},45,[54,3166,2862],{"class":211},[54,3168,3170,3173],{"class":56,"line":3169},46,[54,3171,3172],{"class":280},"            \"options\"",[54,3174,2752],{"class":211},[54,3176,3178,3181,3183,3185],{"class":56,"line":3177},47,[54,3179,3180],{"class":280},"                \"cwd\"",[54,3182,2738],{"class":211},[54,3184,2762],{"class":78},[54,3186,3187],{"class":67},"    \u002F\u002F只清理build目录下的文件\n",[54,3189,3191],{"class":56,"line":3190},48,[54,3192,3020],{"class":211},[54,3194,3196,3198,3200],{"class":56,"line":3195},49,[54,3197,2867],{"class":280},[54,3199,2870],{"class":211},[54,3201,3202],{"class":67},"\u002F\u002F不需要问题匹配器\n",[54,3204,3206],{"class":56,"line":3205},50,[54,3207,3208],{"class":211},"        }\n",[54,3210,3212],{"class":56,"line":3211},51,[54,3213,61],{"emptyLinePlaceholder":60},[54,3215,3217],{"class":56,"line":3216},52,[54,3218,3219],{"class":211},"    ]\n",[54,3221,3223],{"class":56,"line":3222},53,[54,3224,289],{"class":211},[16,3226,3227],{},[364,3228,3229],{},"方法一：",[16,3231,3232,3233,3236,3237,3240,3241,2419],{},"在VScode标题栏上，找到",[51,3234,3235],{},"终端","，然后再选择",[51,3238,3239],{},"运行构建任务","，快捷键是",[51,3242,3243],{},"Ctrl+Shift+B",[16,3245,3246],{},[132,3247],{"alt":49,"src":3248},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage112.webp",[16,3250,3251],{},"可见任务已经被运行了。",[16,3253,3254],{},[132,3255],{"alt":49,"src":3256},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage113.webp",[16,3258,3259],{},[364,3260,3261],{},"方法二：",[16,3263,3232,3264,3236,3266,2419],{},[51,3265,3235],{},[51,3267,3268],{},"运行任务",[16,3270,3271],{},[132,3272],{"alt":49,"src":3273},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage114.webp",[16,3275,3276,3277,3280,3281,3283,3284,3286],{},"下面有4个stm32的任务，第一个是",[51,3278,3279],{},"stm32-Build","任务，运行后的效果和刚才方法一是一样的，方法一的那个",[51,3282,3239],{},"的按钮，就是运行的这个",[51,3285,3279],{},"任务。",[16,3288,3289,3290,3292],{},"这个",[51,3291,3279],{},"任务包含stm32-cmake和stm32-make任务。",[16,3294,1333,3295,3298],{},[51,3296,3297],{},"stm32-clean","任务就是清除build文件夹下的所有文件。",[16,3300,3301],{},[132,3302],{"alt":49,"src":3303},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage115.webp",[16,3305,3306,3307,3286],{},"可以试一下",[51,3308,3297],{},[16,3310,3311],{},[132,3312],{"alt":49,"src":3313},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage116.webp",[16,3315,3316],{},"可以发现都删完了。",[16,3318,3319],{},[132,3320],{"alt":49,"src":3321},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage117.webp",[16,3323,3324],{},[364,3325,3326],{},"你不用担心每次新建工程都需要配置那么多东西。",[16,3328,3329,3330],{},"以上大多数配置文件全部都已经包含在",[356,3331,3334],{"href":3332,"rel":3333},"https:\u002F\u002Fgithub.com\u002Ftungchiahui\u002FCubeMX_MDK5to6_Template%E4%BB%93%E5%BA%93%E4%B8%8B%E7%9A%84***%60%E5%B7%A5%E7%A8%8B%E6%96%87%E4%BB%B6%E7%A7%BB%E6%A4%8D(%E5%88%9B%E5%BB%BA%E6%96%B0%E6%A8%A1%E6%9D%BF%E8%AF%B7%E7%9C%8B%E8%BF%99%E9%87%8C)%60***%E6%96%87%E4%BB%B6%E5%A4%B9%E4%BA%86%EF%BC%8C%E5%88%B0%E6%97%B6%E5%80%99%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%B7%A5%E7%A8%8B%E5%90%8E%EF%BC%8C%E7%9B%B4%E6%8E%A5%E6%8A%8A%E8%BF%99%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%85%A8%E9%83%A8%E5%A4%8D%E5%88%B6%E8%BF%87%E6%9D%A5%E5%8D%B3%E5%8F%AF%E3%80%82",[360],"https:\u002F\u002Fgithub.com\u002Ftungchiahui\u002FCubeMX_MDK5to6_Template仓库下的***`工程文件移植(创建新模板请看这里)`***文件夹了，到时候新建一个工程后，直接把这个文件夹下的所有文件全部复制过来即可。",[39,3336,3338],{"id":3337},"使用ozone进行flash烧录和debug调试","使用ozone进行Flash烧录和Debug调试",[910,3340,3341],{"id":3341},"基础配置",[16,3343,3344],{},"打开终端输入ozone打开软件或者直接找到应用图标打开ozone",[16,3346,3347],{},[132,3348],{"alt":49,"src":3349},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage118.webp",[16,3351,3352],{},[132,3353],{"alt":49,"src":3354},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage119.webp",[16,3356,3357],{},"先选择device，比如我是STM32F407VET6",[16,3359,3360],{},[132,3361],{"alt":49,"src":3362},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage120.webp",[16,3364,3365],{},[132,3366],{"alt":49,"src":3367},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage121.webp",[16,3369,3370],{},"选择Peripherals:",[16,3372,3373],{},[132,3374],{"alt":49,"src":3375},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage122.webp",[16,3377,3378],{},"点击下一步",[16,3380,3381],{},[132,3382],{"alt":49,"src":3383},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage123.webp",[16,3385,3386],{},"你用的SWD就填SWD，是JTAG就填JTAG",[16,3388,3389],{},[132,3390],{"alt":49,"src":3391},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage124.webp",[16,3393,3394],{},"选择ELF",[16,3396,3397],{},[132,3398],{"alt":49,"src":3399},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage125.webp",[16,3401,3402],{},"elf,hex,bin都可以选，一般选elf就行。",[16,3404,3405],{},[132,3406],{"alt":49,"src":3407},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage126.webp",[16,3409,3410],{},"这一步保持默认即可。",[16,3412,3413],{},[132,3414],{"alt":49,"src":3415},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage127.webp",[16,3417,3418],{},"如果你开启了RTOS可能会遇到这个问题。",[44,3420,3422],{"className":46,"code":3421,"language":48,"meta":49,"style":49},"warning (138): The target application seems to be using FreeRTOS, but FreeRTOS-awareness is not enabled.\n",[51,3423,3424],{"__ignoreMap":49},[54,3425,3426,3429],{"class":56,"line":57},[54,3427,3428],{"class":74},"warning",[54,3430,3431],{"class":211}," (138): The target application seems to be using FreeRTOS, but FreeRTOS-awareness is not enabled.\n",[16,3433,3434],{},"意思是你的目标应用似乎使用了 FreeRTOS，但当前没有启用对 FreeRTOS 的调试支持（RTOS-awareness）。",[16,3436,3437],{},[132,3438],{"alt":49,"src":3439},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage128.webp",[16,3441,3442],{},"直接按照他底下的提示应用修复即可。",[16,3444,3445],{},[132,3446],{"alt":49,"src":3447},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage129.webp",[16,3449,3450],{},"点继续就行。",[16,3452,3453],{},[132,3454],{"alt":49,"src":3455},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage130.webp",[16,3457,3458],{},[132,3459],{"alt":49,"src":3460},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage131.webp",[910,3462,3463],{"id":3463},"烧录与调试",[16,3465,3466,3467],{},"可以看下面这个视频，讲的挺好的。",[364,3468,3469],{},"(从30:10开始看）",[16,3471,3472],{},[356,3473,3474],{"href":3474,"rel":3475},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1yrLHzZEoE",[360],[16,3477,3478],{},[132,3479],{"alt":49,"src":3480},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage132.webp",[16,3482,3483],{},"点击File让他按文件名排序。",[16,3485,3486],{},[132,3487],{"alt":49,"src":3488},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage133.webp",[16,3490,3491],{},"找到led_task.cpp点击就可以打开这个源文件啦。",[16,3493,3494],{},[132,3495],{"alt":49,"src":3496},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2025\u002F07\u002F18\u002Fimage134.webp",[3498,3499,3500],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":49,"searchDepth":64,"depth":64,"links":3502},[3503,3504,3505],{"id":14,"depth":71,"text":14},{"id":37,"depth":71,"text":37},{"id":1575,"depth":71,"text":1575},0,"0200","2025-07-18","2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian","\u002Fwiki\u002F2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian","Linux STM32 CMake VScode环境搭建","md",false,{},"\u002Fwiki\u002F2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian\u002F0200-linux",{"title":5,"description":49},"wiki\u002F2025-07-18-Linux-STM32-CMake-VScode环境搭建\u002F0200-Linux","lvdhJPTYLVmJzsRidgu2JPnYdeoCT1nAzpYQ9VlCtWo",[3520,3526,3528,3534],{"path":3521,"stem":3522,"title":3523,"authors":3524,"date":3508,"chapterOrder":3525,"chapterDepth":3506,"docKey":3509,"docRoot":3510,"docTitle":3511,"isWikiDoc":60,"isWikiIndex":3513},"\u002Fwiki\u002F2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian\u002F0100-jian-jie","wiki\u002F2025-07-18-Linux-STM32-CMake-VScode环境搭建\u002F0100-简介","简介",[7],"0100",{"path":3515,"stem":3517,"title":5,"authors":3527,"date":3508,"chapterOrder":3507,"chapterDepth":3506,"docKey":3509,"docRoot":3510,"docTitle":3511,"isWikiDoc":60,"isWikiIndex":3513},[7],{"path":3529,"stem":3530,"title":3531,"authors":3532,"date":3508,"chapterOrder":3533,"chapterDepth":3506,"docKey":3509,"docRoot":3510,"docTitle":3511,"isWikiDoc":60,"isWikiIndex":3513},"\u002Fwiki\u002F2025-07-18-linux-stm32-cmake-vscode-huan-jing-da-jian\u002F0300-windows","wiki\u002F2025-07-18-Linux-STM32-CMake-VScode环境搭建\u002F0300-Windows","Windows",[7],"0300",{"path":3510,"stem":3535,"title":3536,"authors":3537,"date":3508,"chapterOrder":3538,"chapterDepth":3506,"docKey":3509,"docRoot":3510,"docTitle":3511,"isWikiDoc":60,"isWikiIndex":60},"wiki\u002F2025-07-18-Linux-STM32-CMake-VScode环境搭建\u002Findex","Linux-STM32-CMake-VScode环境搭建（已经废弃）",[7],null,[3540,3542,3545,3548],{"name":7,"image":3541},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":3543,"image":3544},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":3546,"image":3547},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":3549,"image":3550},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431905341]