1 問題描述
新建STM32的keil工程,在編譯時出現警告「..FWLIBsrcstm32f10x_rcc.c(273): warning: #223-D: function 「assert_param」 declared implicitly」,接下來一堆警告和錯誤。
出錯的原因:函數「assert_param」未聲明。assert_param
2 問題分析
函數assert_param是STM32官方庫文件中用到的。
對於我採用的《STM32F10x_StdPeriph_Lib_V3.5.0》庫文件來說,assert_param函數在文件「stm32f10x_conf.h」的第59-73行。
查看函數說明可知,assert_param是一個條件表達式宏定義,主要作用是對函數的輸入參數進行檢查。仔細查看程序段,不管是否定義USE_FULL_ASSERT,函數assert_param均有定義,編譯時不應該出現上述警告。
還有一種可能,那就是雖然定義了函數assert_param,但是包含定義的文件「stm32f10x_conf.h」沒有被編譯。
在工程文件中搜索字符「stm32f10x_conf.h」,在文件「stm32f10x.h」的第8301-8303行找到程序段。
這段代碼的意思:如果定義USE_STDPERIPH_DRIVER,則包含文件「stm32f10x_conf.h」。同樣的,如果沒定義則不包含。
在工程中搜索文本USE_STDPERIPH_DRIVER,沒有找到有關 USE_STDPERIPH_DRIVER的宏定義,因此也就沒有包含stm32f10x_conf.h文件,工程中也就沒有assert_param的聲明。
文本「USE_STDPERIPH_DRIVER」的字面意思:使用標準外設驅動。也就是說如果需要使用ST官方提供的外設驅動庫則需要定義「USE_STDPERIPH_DRIVER」。
很明顯問題出在使用了官方的標準外設庫又沒有定義「USE_STDPERIPH_DRIVER」。
3 問題解決
解決問題的辦法就是在工程中定義「USE_STDPERIPH_DRIVER」。這有兩種方法。
方法一:標準宏定義
在工程中定義USE_STDPERIPH_DRIVER。通過上面的分析,在「stm32f10x.h」文件的起始位置定義USE_STDPERIPH_DRIVER即可。
先修改「stm32f10x.h」的只讀屬性。在工程文件中找到文件後,把文件屬性修改為可讀寫的。
然後在Keil打開「stm32f10x.h」文件,在文件頭添加代碼「#define USE_STDPERIPH_DRIVER」。
重新編譯工程,問題解決。
方法二:工程參數設置
在Keil工程中,點擊「options for Target…」,在彈出窗口中點擊「C/C++」,在「Preprocessor Symbols」的「Define」欄輸入「USE_STDPERIPH_DRIVER」。
Preprocessor Symbols 就是預處理符號,輸入「USE_STDPERIPH_DRIVER」就是向工程中添加預處理標號「USE_STDPERIPH_DRIVER」,等同於在代碼中添加宏定義「#define USE_STDPERIPH_DRIVER」。
設置完後,編譯工程,問題解決。
關鍵字:Keil 編譯警告 解決方法 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/ic475508.html推薦閱讀
學習單片機要用到keil等的代碼編譯軟體,初學者需要從第一步新建工程走起,做好第一步,才能越走越遠。工具/原料電腦,keil軟體方法/步驟打開keil軟體,找到project,下拉菜單有一項new uvision project。點擊這個項目,會出現一個項目路逕自定義項目名稱和保存位置。選擇需要燒代碼的單片機晶片的生產公司以及相應的晶片型號上一步做好以後,出現一個提示,點是就會生成一個51的啟動文件,否就不會出現,如圖,是點了是以上步驟就新建了一個工程。我們可以直接add進去已有的文件。本次介紹如何自己新建文件。點標題欄的新建按鈕,出現了一個隨機的text1,點擊保存按鈕,會提出下圖的對話框。如果是C語言就在文件名後加上.c
發表於 2021-01-10
實驗目的:初步掌握Keil(C51語言)和SUN ES59PA實驗儀的操作和使用,能夠輸入和運行簡單的程序。實驗設備:SUN ES59PA實驗儀一套、具有一個RS232串行口並安裝Keil C51的計算機一臺。實驗原理及環境:1.在計算機上已安裝Keil C51軟體。這個軟體既可以與硬體(SUN ES59PA實驗儀)連接,在硬體(單片機)上運行程序;也可以不與硬體連接,僅在計算機上以虛擬仿真的方法運行程序。如果程序有對硬體的驅動,就需要與硬體連接;如果沒有硬體動作,僅有軟體操作,就可以使用虛擬仿真。2. 實驗的硬體環境:A3區:CPU總線、I/O接口 片選區JP37,JP45:地址線A0..A7;JP48、JP50:CPU的D0
發表於 2020-11-25
1."c" not an argument in function sum 該標識符不是函數的參數 2.array bounds missing ] in function main 缺少數組界限符 "]" 3.Array size too large in function main 數組規模太大 4.bad file name format in include directive 在包含指令中的文件名格式不正確. 5.Call of non-function in function main 調用未經
發表於 2020-10-15
;Keil版本: μVision 4.1.0 STM32固件庫版本: V3.4.0 第一步,建立工程文件夾,在其子文件夾內拷貝並整理好相應的文件。 1.1、建立工程文件夾,將它命名為"SysTick"。 1.2、在"SysTick"下分別建立"Lib
發表於 2020-10-15
1.由Keil C生成的啟動代碼程序清單1.1 AT89C51啟動代碼$NOMOD51 //不使用51默認的特殊功能寄存器;---; This file is part of the C51 Compiler package; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc
發表於 2020-09-23
定義j時應注意其變量類型char,此循環當j=0時,再執行一次則keil中j=0XFF,而不是-1,所以無法跳出循環。但在vc6.0中是可以跳出循環的。解決辦法如下:不能讓j的值為負數uchar j;
發表於 2020-09-21