❶ 有一個程序,我在keil上編譯的時候有一個錯誤,但不知道在怎麼改,求大神們幫忙看一下!!
鏈接中給出代碼,經過編譯,沒有顯示任何錯誤。
復制粘貼如下:
#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
unsigned int c=0;
sbit led1=P2^0; //指示燈0
sbit led2=P2^1; //指示燈1
sbit led3=P2^3; //指示燈3
void init(); //串口初始化
void send(unsigned char a); //單位元組發送函數
void ctrl(); //接收處理函數
void main()
{
init();
while(1)
{
if(RI==1) //是否有數據到來
{
RI = 0;
tmp = SBUF; //暫存接收到的數據
ctrl();
}
}
}
void init() //串口初始化
{
ES=0; //關中斷
SCON = 0x50; // REN=1允許串列接受狀態,串口工作模式1,
//10位UART(1位起始位,8位數據位,1位停止位,無奇偶校驗),波特率可變
TMOD = 0x20; //定時器1工作於方式2,8位自動重載模式,用於產生波特率
TH1=TL1=0xFD; //波特率9600 (本次測試採用晶振為11.0592)
PCON &= 0x7f; //波特率不倍增
TR1 = 1; //定時器1開始工作,產生波特率
//發送標志位置0
TI=0; //接收標志位置0
RI=0;
//EA=0;
ES=1;
led1=0; //初始化設置3個指示燈全亮
led2=0;
led3=0;
}
void send(unsigned char a) //單位元組數據發送
{ //注意:若單片機TXD(P3.1)無上拉能力,必須在P3.1端接上拉電阻。本次測試需要接上拉電阻
TI=0;
SBUF=a;
while(TI==0);
TI=0;
if(c%2) //發送指示燈標志,每接收一次,此燈亮滅交替
led3=1;
else
led3=0;
c++;
}
void ctrl() //接收處理函數
{
switch(tmp)
{
case '1':
led1=1; //收到字元1,指示燈0滅
send(tmp);
break;
case '2': //收到字元2,指示燈1滅
led2=1;
send(tmp);
break;
case '3': //收到字元3,指示燈0、1亮
led1=0;
led2=0;
send(tmp);
break;
case '4': //收到字元4,指示燈0、1滅
led1=1;
led2=1;
send(tmp);
break;
case '5': //收到字元5,指示燈3亮
led3=0;
send(tmp);
break;
default: //其他,燈全滅
led1=1;
led2=1;
led3=1;
send(tmp);
}
}
上述代碼,沒有任何修改,完全是題目鏈接裡面所給出的。
❷ Keil 5 編譯時出錯
未定義Display_char等3個函數,調用之前加上定義,可以在文件最前面。
❸ 用keil5 STM32F107系列晶元編譯一個指令時提示錯誤為 A1105E: Area directive missing 怎麼解決
STM32調試過程中常見的問題及解決方法 一、 在「Debug選項卡」下設置好模擬器的類型後,下載程序時卻提示「No ULINK Device found.」
解決辦法: Keil MDK默認使用ULINK模擬器下載程序,在「Project --->Option for Target 'xxx' --->Utilities選項卡」下把編程所使用的模擬器改為相應的類型即可。
二、 編譯工程時提示如下信息:
main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_nvic.o).
解決辦法:工程缺少「cortexm3_macro.s」文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。
三、調試器不能連接到STM32的問題與解決辦法
很多人都碰到過調試器不能連接到STM32的問題,不管是IAR的J-Link還是Keil的ULink,或者是ST的ST-Link。出現這個問題時,調試軟體會提示不能建立與Cortex-M3的連接,或提示不能下載程序,或提示找不到要調試的設備等。
這樣的問題都是發生在調試那些可以在CPU不幹預的時候自動運行的模塊、或在調試低功耗模式的程序的時候。所謂「可以在CPU不幹預的時候自動運行的模塊」包括:DMA、定時器、連續轉換模式下的ADC、看門狗等模塊。
--------------------------------------------------------------------------------
這個問題的根源是:
1. 調試器需要在RAM內執行一段程序,對Flash進行擦寫操作,如果不停止這些自動運行的模塊,它們會干擾程序在RAM中的執行,致使下載失敗。比如DMA模塊被配置為不停地拷貝一段數據區,而調試器剛好需要使用DMA數據傳輸的目標區域,這時DMA的操作將會與調試器的操作發生沖突。再比如,如果啟動了看門狗而沒有執行硬體復位,則在下次調試器需要下載程序時,看門狗超時將觸發晶元復位,導致下載操作失敗。
2. 低功耗是通過停止CPU的時鍾而實現,JTAG調試是通過與CPU的通信實現,停止了CPU的時鍾致使調試器會失去與CPU的通信。
❹ Keil5編譯的時候總是出現這個是什麼情況啊
編譯出錯吧!你把led.c的後綴改成.h
把void LED_Init()的實現放在led.c裡面
❺ keil編譯時報錯:error: L6002U: Could not open file .\***\core_cm3.o
歷時好幾次的碰壁,我終於解決這個問題了。
根據網路其他答案給的思路,其實就是修改環境變數,因為當前系統TEMP和TMP環境變數存在著中文。但是如果你直接修改 %USERPROFILE% 為其他英文路徑開Keil會卡死並閃退(其實是你打開main.c就閃退)!!!
因為修改成別的一個英文文件夾是不行的,你只是在環境變數中修改了文件路徑,但是電腦中這些路徑並不存在,所以你打開Keil才會閃退。
那麼解決問題的關鍵就是:先在系統C盤中創建好了所有的英文路徑,再你創建的文件夾路徑修改環境變數!!!
准備工作:先將你的Keil軟體關閉
1、在【C盤根目錄】創建【UserData】文件夾
點擊確定後退出。
再次打開Keil編譯即可不再報錯,再次愉快寫代碼吧。
祝願諸位萬事如意。
❻ keil編譯中出現錯誤怎麼辦
1、打開軟體project-new project創建一個工程,並為其選擇一個存放目錄。
2、對工程進行一些配置(project-options for target 『target 1』)在output選項下的「create HEX file」前打上對號,工程編譯之後能夠輸出一個可以下載的「HEX」文件。
3、為工程添加.C,.h文件,右鍵單擊「source group 1」,應該就可以了。
❼ 問一個keil5的編譯錯誤的問題
提示指出了4個未定義的符號,在文件中無法識別到。
例如 stm32f4xx_it 中用到了 EXTI_ClearITPendingBit,但是從 stm32f4xx_it 這個模塊的角度而言,它查不到你在哪裡定義了這個符號,無法判斷這個符號究竟是什麼,也就無法進行連接。
一般而言都是包含關系有錯誤,或工程的搜尋路徑配置有問題。
❽ keil5,編譯出現錯誤,提示是段太大,怎麼辦
keil5,編譯出現錯誤,提示是段太大,怎麼辦?如果是51單片機的話,因為RAM資源很小,所以要盡量節約每一個位元組RAM,如果是常量數組就定義成常量,例如 code char datastr[2]={1,2};
如果有外部RAM,則定義到XRAM中,例如:xdata char datastr[2];
能用BIT就不要用char,能用char 就不要用Int。做單片機的話, 還是必須要了解一下其存儲結構, 最起碼得知道data idata xdata所指的存儲區域
idata 指向的片內ram ,大小范圍為256位元組,所以你一個數組定義在idata段內,不能超過256位元組,超過就會報錯。
xdata指向的片外ram,大小范圍為64KB,你可以將你需要的大容量數組定義在該段內
❾ 用Keil編程序時編譯有錯誤,怎麼才能知道錯誤是什麼呢
每個錯誤都有自己的標號,你可以根據標號在keil提供的幫助文件中搜索有關的詳細內容,按下F1會彈出幫助文檔,文檔都是英文寫的。
另外你雙擊錯誤時游標會自動跳到keil認為的錯誤行,實際錯誤就在那一行的附近
或者你可以把你的錯誤放在網路裡面搜一搜,一般都會得到。