【STM32】第一個工程的創建

目錄

    • 1、獲取 KEIL5 安裝包
    • 2、開始安裝 KEIL5
      • 2.1、 激活
      • 2.2、安裝`DFP`庫
    • 3、工程創建
    • 4、搭建框架
    • 5、開始編寫代碼

1、獲取 KEIL5 安裝包

要想獲得 KEIL5 的安裝包,在百度里面搜索“KEIL5 下載”即可找到很多網友提供的下載文件,或者到 KEIL 的官網下載:下載官網,一大堆注冊非常麻煩。建議使用最新或者靠近最新版本都可以。
在這里插入圖片描述

2、開始安裝 KEIL5

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
選擇安裝路徑,路徑不能帶中文,next
提示: Pack 目錄下后續可能會安裝以后會用到的各種芯片的芯片包容易占空間,建議 C 盤剩余空間不多的用戶可以直接在框中編輯改路徑,把 C 改為 D(或其他盤,直接改第一個字符就行,注意不要刪錯后面符號)
在這里插入圖片描述
安裝ok即可
無需等待, 直接關閉整個軟件

2.1、 激活

  • 右鍵已經安裝好的Keil MDK圖標, 選擇以管理員方式打開

  • 點開File菜單欄, 選擇License Management, 在打開的窗口中復制右上角的Computer ID值, 比如CA2RX-GUTUC

  • 右鍵安裝軟件\Keil_MDK_ARM_5.35\keygen\keygen.exe, 選擇以管理員方式打開, 這是Keil MDK的盜版激活器

  • 將之前復制的CID值拷貝到激活器CID輸入框, Target選擇ARM, 點擊Generate按鈕, 會生成一長串激活碼

  • 復制激活碼, 填回到Keil MDK界面的New License ID Code(LIC)中, 隨后點擊Add Lic

  • 顯示如下LIC Added Sucessfully說明激活成功
    在這里插入圖片描述

2.2、安裝DFP

  • 安裝安裝軟件\Keil.STM32F1xx_DFP.2.4.1.pack
  • 官網鏈接

在這里插入圖片描述

3、工程創建

在這里插入圖片描述

  • D:\workspace-stm32某個硬盤路徑中創建第一個工程的文件結構, 只需要創建前四個文件夾, 其他工程相關文件和文件夾稍后由Keil創建

    └─prj1_demo├─app(我們的應用層代碼)├─driver(我們自行編寫或其他人編寫的第三方驅動)├─library(ARM和ST提供的官方庫)├─doc(文檔類)└─keil(存放keil工程文件)
    
  • 拷貝標準庫的文件到我們的工程文件中

    • 拷貝標準庫Libraries下的CMSISSTM32F10x_StdPeriph_Driver兩個文件夾到工程的library
    • 拷貝標準庫Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle下的main.c stm32f10x_conf.h stm32f10x_it.c stm32f10x_it.h四個文件到工程的app中(不要拷貝system_stm32f10x.c)

    對比c語言階段的學習:

    app相當于我們編寫的代碼, 通常統一以main.c的文件作為入口

    lib相當于標準庫或者qt庫, 早期嵌入式習慣將一個工程相關的庫都放在工程內, 之后的則使用共享庫(不要改), 其中cmsis是內核相關的操作庫, 其他則是廠家的庫

    prj相當于makefile, xxx.pro等項目相關文件, keil/iar等都有自己對應的工程文件, keil的名叫<項目名>.uvprjx

    drivers相當于libmsc.so等放置的位置

    doc一般放置自述文件readme.txt/readme.md和項目

    標準庫的開發方式更像是移植, 而不是創建

4、搭建框架

  • Keil 創建新工程, 工程文件保存在keil文件夾路徑下, 命名stm32prj

    通常情況下, 工程名應該與整個工程文件夾的名字一樣, 也就是prj1_demo

    考慮到之后的工程都是從這個工程直接復制, 因此使用一個更通用的工程名

  • 選擇設備型號f103ve

  • 不添加任何庫(不勾選任何選項, 并確定)

    我們使用keil僅僅為了幫我們管理工程, 以及使用keil的工具鏈來編譯/下載/調試

在這里插入圖片描述

  • project-manage-project items中, Groups按如下分組和添加文件(工程中的group不能有二級組, 所以lib部分需要拆分成三部分)

    Groups組名說明添加的文件
    app用戶代碼apps/main.c
    apps/stm32f10x_it.c
    driver第三方驅動[留空]
    cmsis內核庫libraries/CMSIS/CM3/DeviceSupport/STM32F10x/system_stm32f10x.c
    stdLib標準庫libraries/STM32F10x_StdPeriph_Driver/src/xxx.c
    startup啟動文件libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s
    • main()函數是C語言部分代碼的入庫, 在進入c代碼之前, 芯片需要先執行startup啟動文件才能啟動, 隨后才進入c語言部分, 并且這個啟動文件使用的是匯編語言

    • 選擇 startup_stm32f10x_hd.s 這個文件,因為hd 代表 High Density(高密度),用于區分 STM32F10x 系列不同的 Flash 和 RAM 規格。

    分類后綴Flash 容量典型芯片
    低密度(Low Density)ld16KB ~ 32KBSTM32F101C4, STM32F103C6
    中密度(Medium Density)md64KB ~ 128KBSTM32F103RB, STM32F101R8
    高密度(High Density)hd256KB ~ 512KBSTM32F103RE, STM32F103ZC
    超高密度(XL Density)xl512KB ~ 1MBSTM32F103ZG, STM32F103VH
    • 標準庫選擇了全部文件, 實際上如果使用了什么外設, 就只需要包含對應文件即可, 提高編譯速度
  • 打開Options for Target, 對這個項目進行一些額外配置

    • Target中設置ARM CompilerUse default compiler version 5

      此處為設置編譯器, 可選GCCARMCC, 新版keil默認為ARMCC v6, 標準庫是按照ARMCC v5編寫的
      在這里插入圖片描述

    • Output中勾選Create HEX File

      keil默認生成axf文件, 而大多數編程器都使用hex格式的文件進行燒錄

      這些文件其實就是最終生成的二進制文件

      在這里插入圖片描述

    • C/C++中設置Define

      • STM32F10X_HD USE_STDPERIPH_DRIVER

        注意這里是兩個詞, 中間用空格隔開, 相當于全局增加了兩句話:

        #define STM32F10X_HD 
        #define USE_STDPERIPH_DRIVER
        
    • C/C++中設置Include Paths(使用右邊的...按鈕, 選擇文件夾, keil會自動識別為相對路徑)

      • ..\app
      • ..\driver
      • ..\library\CMSIS\CM3\CoreSupport
      • ..\library\CMSIS\CM3\DeviceSupport\ST\STM32F10x
      • ..\library\STM32F10x_StdPeriph_Driver\inc
    • Debug中選擇右邊的UseCMSIS-DAP Debugger

      教程使用的開發板是野火F103, 配套仿真器為CMSIS-DAP標準的仿真器, 所以選擇此項

    • 再點開Settings

      • Debug標簽頁的Max Clock設置為5MHz

      • Flash Download標簽頁勾選Reset and Run

        1. 調低燒錄速度更穩定
        2. keil默認燒錄完畢后系統不會自動開始運行, 需要手動按一下開發板上的reset按鍵, 而勾選此Reset and Run選項, 燒錄完立刻運行, 不用手動重啟
  • edit-configuration-Editor中設置Encoding為第二個選項(utf-8)

    Keil默認使用ANSI編碼 不支持中文

    改為更通用的UTF-8編碼

5、開始編寫代碼

在這里插入圖片描述

注意代碼需要以空行結尾

  • 編譯, 使用到的編譯選項為:

    • Traslate(ctrl+F7), 相當于gcc -c xxx.c, 編譯當前打開的一個文件為xxx.o文件
    • Build(F7), 相當于make, 編譯整個工程, 只會編譯有變動的文件
    • Rebuild, 相當于make clean && make, 完全重新編譯整個工程

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74396.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態規劃~01背包問題

01背包問題 經典的0 - 1背包問題的解決方案。 二維數組的版本 代碼功能概述 0 - 1背包問題指的是有 n 個物品和一個容量為 m 的背包&#xff0c;每個物品有對應的體積 v[i] 和價值 w[i]&#xff0c;需要從這些物品里挑選若干個放入背包&#xff0c;讓背包內物品的總價值達到最…

深入理解Java享元模式及其線程安全實踐

引言 在軟件系統中&#xff0c;當需要處理海量細粒度對象時&#xff0c;直接創建大量實例可能會導致內存消耗激增和性能下降。享元模式&#xff08;Flyweight Pattern&#xff09;通過共享對象內部狀態&#xff0c;成為解決這類問題的經典方案。然而在多線程環境下&#xff0c…

1、mysql基礎篇--概述

關系型數據庫&#xff08;RDBMS&#xff09; 概念特點&#xff1a;數據模型&#xff1a; 概念 建立在關系模型基礎上&#xff0c;有多張表相互連接的二維表組成的數據庫 特點&#xff1a; 1、使用表存儲&#xff0c;格式統一&#xff0c;便于維護 2、使用sql語言操作&#…

如何提升庫存系統的高并發和穩定性:算法與設計模式

庫存系統是企業運營的核心模塊&#xff0c;尤其是在電商、零售和供應鏈管理中&#xff0c;系統的高并發和穩定性直接影響訂單處理的準確性和效率。面對海量訂單、復雜的庫存管理需求&#xff0c;如何在高并發環境下確保庫存數據的準確性和系統的穩定性&#xff1f;本文將從架構…

【多線程】synchronized底層實現的方式

前言 在java 開發中對于鎖的應用非常的常見&#xff0c;如果對于什么時候該用什么鎖&#xff0c;以及鎖實現的原理有所不知道的&#xff0c;或者面試過程中面試官問你不知道怎么回答的&#xff0c;歡迎來看下面的文章 1、synchronized和ReentrantLock的區別 2、synchronized的…

Pytorch中Tensorboard的學習

1、Tensorboard介紹 TensorBoard 是 TensorFlow 開發的一個可視化工具&#xff0c;用于幫助用戶理解和調試機器學習模型的訓練過程。盡管它最初是為 TensorFlow 設計的&#xff0c;但通過 PyTorch 的 torch.utils.tensorboard 模塊&#xff0c;PyTorch 用戶也可以方便地使用 Te…

ETL 自動化:提升數據處理效率與準確性的核心驅動力

在數字化轉型的浪潮中&#xff0c;數據已成為企業戰略資產&#xff0c;高效處理數據的能力直接關系到企業的競爭力。ETL&#xff08;Extract, Transform, Load&#xff09;自動化作為數據處理領域的關鍵技術&#xff0c;正逐漸成為企業在數據時代脫穎而出、實現高效運營與精準決…

std::endl為什么C++ 智能提示是函數?

在使用vscode 的C智能提示后&#xff0c;輸入endl 后&#xff0c;提示的卻是std::endl(basic_ostream<CharT, Traits> &os), 感覺比較奇怪&#xff0c;各種代碼里都是直接用的std::endl 啊&#xff0c; 這里怎么變成函數了呢&#xff1f; 在 C 中&#xff0c;std::en…

簡潔、實用、無插件和更安全為特點的WordPress主題

簡站WordPress主題是一款以簡潔、實用、無插件和更安全為特點的WordPress主題&#xff0c;自2013年創立以來&#xff0c;憑借其設計理念和功能優勢&#xff0c;深受用戶喜愛。以下是對簡站WordPress主題的詳細介紹&#xff1a; 1. 設計理念 簡站WordPress主題的核心理念是“崇…

數據結構篇:空間復雜度和時間復雜度

目錄 1.前言&#xff1a; 1.1 學習感悟 1.2 數據結構的學習之路(初階) 2.什么是數據結構和算法 2.1 數據結構和算法的關系 2.2 算法的重要性 2.3 如何衡量算法的好壞 3.時間復雜度 3.1 時間復雜度的概念 3.2 大O的漸進表示法 O() 4.空間復雜度 5. 常見的時間復雜度和…

node-ddk,electron,截屏封裝(js-web-screen-shot)

node-ddk 截屏封裝(js-web-screen-shot) https://blog.csdn.net/eli960/article/details/146207062 也可以下載demo直接演示 http://linuxmail.cn/go#node-ddk 感謝/第三方 本截屏工具, 使用的是: js-web-screen-shot https://www.npmjs.com/package/vue-web-screen-shot…

泰坦軍團攜手順網旗下電競連鎖品牌樹呆熊 共創電競新紀元

在電競行業的浪潮中&#xff0c;品牌之間的戰略合作愈發成為推動市場前行的重要動力。最近&#xff0c;電競顯示器領域領軍品牌泰坦軍團高層領導出席順網旗下電競連鎖品牌樹呆熊十周年盛典。會議現場&#xff0c;雙方高層領導宣布泰坦軍團與樹呆熊正式達成戰略合作伙伴關系。 在…

HandyJSON原理

HandyJSON 的優勢 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式, 應用廣泛. 在 App 的使用過程中, 服務端給移動端發送的大部分都是 JSON 數據, 移動端需要解析數據才能做進一步的處理. 在解析JSON數據這一塊, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …

信號的產生和保存

信號的產生 信號就是操作系統對用戶操作做出的反應&#xff0c;但它的本質就是往操作系統寫入信號&#xff0c;這是由操作系統的結構決定的。通過修改比特位來告訴操作系統接收信號和傳了幾號信號。 也正是因為我們身為用戶無法親自修改內核數據&#xff0c;所以我們需要通過操…

在C++ Qt中集成Halcon窗口并實現跨平臺兼容和大圖加載

目錄 1. Halcon窗口嵌入Qt Widget 2. 處理大圖加載 3. 多線程優化顯示 4. 跨平臺兼容性 1. Halcon窗口嵌入Qt Widget 將Halcon的HWindow控件嵌入到Qt的QWidget容器中,利用系統原生句柄實現跨平臺。 #include <HalconCpp.h> #include <QWidget>class HalconWi…

深度學習技術與應用的未來展望:從基礎理論到實際實現

深度學習作為人工智能領域的核心技術之一&#xff0c;近年來引起了極大的關注。它不僅在學術界帶來了革命性的進展&#xff0c;也在工業界展現出了廣泛的應用前景。從圖像識別到自然語言處理&#xff0c;再到強化學習和生成對抗網絡&#xff08;GAN&#xff09;&#xff0c;深度…

藍光三維掃描技術:汽車零部件檢測的精準高效之選

——汽車方向盤配件、保險杠塑料件、鈑金件檢測項目 汽車制造工業的蓬勃發展&#xff0c;離不開強大的零部件制造體系作支撐。汽車零部件作為汽車工業的基礎&#xff0c;其設計水平、制造工藝、質量控制手段逐漸與國際標準接軌&#xff0c;對于零部件面差、孔位、圓角、特征線…

數據庫聯表Sql語句建一個新表(MySQL,Postgresql,SQL server)

數據庫聯表Sql語句建一個新表(MySQL,Postgresql,SQL server) 如果你想基于 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount FROM USERS JOIN v_card on USERS.V_CARDv_card.v_card 這個查詢結果創建一個新表&am…

六十天前端強化訓練之第三十天之深入解析Vue3電商項目:TechStore全棧實踐(文結尾附有源代碼)

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎&#xff0c;謝謝大佬&#xff01; 目錄 深入解析Vue3電商項目&#xff1a;TechStore全棧實踐 一、項目架構設計 二、核心功能實現 三、組合式API深度實踐 四、性能優化實踐 五、項目擴展方向 六、開發經驗總結…

【人工智能】機器學習中的評價指標

機器學習中的評價指標 在機器學習中&#xff0c;評估指標&#xff08;Evaluation Metrics&#xff09;是衡量模型性能的工具。選擇合適的評估指標能夠幫助我們更好地理解模型的效果以及它在實際應用中的表現。 一般來說&#xff0c;評估指標主要分為三大類&#xff1a;分類、…