我正在按照本教程學習嵌入式系統。在他們為 TM4C123 上 LED 閃爍的附加代碼中,他們創建了ulLoop
一個讓我感到困惑的變數,因為他們只是將點擊啟用位元組分配給ulLoop
但之后從未使用過它。但是,我嘗試洗掉行寫入ulLoop = SYSCTL_RCGCGPIO_R;
并且 LED 停止閃爍,正如他們在教程中所說的“存在 uloop 變數和包含 uloop 的陳述句只是為了在移動到外圍設備之前停止 3 個時鐘周期,這是必須的蒂瓦。”
我無法理解他們所說的“停止 3 個時鐘周期”和“轉移到外設”是什么意思,以及為什么它需要停止 3 個時鐘周期,而不是 4 個或 5 個周期,或者根本不需要。此外,如果我對教程中提到的關于魔法變數的內容一無所知,只是發現程式不起作用,我怎么知道問題出在哪里而沒有更多資訊,因為在構建程序中存在 0 個錯誤和警告。如果問題的方式不正確或聽起來很愚蠢,請 Pealse 原諒我。
#define SYSCTL_RCGCGPIO_R (*(( volatile unsigned long *)0x400FE608 ) )
#define GPIO_PORTF_DATA_R (*(( volatile unsigned long *)0x40025038 ) )
#define GPIO_PORTF_DIR_R (*(( volatile unsigned long *)0x40025400 ) )
#define GPIO_PORTF_DEN_R (*(( volatile unsigned long *)0x4002551C ) )
#define GPIO_PORTF_CLK_EN 0x20
#define GPIO_PORTF_PIN1_EN 0x02
#define LED_ON1 0x02
#define GPIO_PORTF_PIN2_EN 0x04
#define LED_ON2 0x04
#define GPIO_PORTF_PIN3_EN 0x08
#define LED_ON3 0x08
#define DELAY_VALUE 1000000
volatile unsigned long j=0;
static void Delay(void){
for (j=0; j<DELAY_VALUE ; j );
}
int main ( void )
{
volatile unsigned long ulLoop ; // I don't understand why creating this variable
SYSCTL_RCGCGPIO_R |= GPIO_PORTF_CLK_EN ;
ulLoop = SYSCTL_RCGCGPIO_R; // But if not adding this line the LED won't blink
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN1_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN1_EN ;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN2_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN2_EN ;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN3_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN3_EN ;
// Loop forever .
while (1)
{
GPIO_PORTF_DATA_R &= LED_ON3;
GPIO_PORTF_DATA_R &= LED_ON2;
GPIO_PORTF_DATA_R |= LED_ON1;
Delay();
GPIO_PORTF_DATA_R &= LED_ON1;
GPIO_PORTF_DATA_R &= LED_ON2;
GPIO_PORTF_DATA_R |= LED_ON3;
Delay();
GPIO_PORTF_DATA_R &= LED_ON3;
GPIO_PORTF_DATA_R &= LED_ON1;
GPIO_PORTF_DATA_R |= LED_ON2;
Delay();
}
}
uj5u.com熱心網友回復:
因為在這前一行
SYSCTL_RCGCGPIO_R |= GPIO_PORTF_CLK_EN ;
程式正在啟用時鐘,這一行
ulLoop = SYSCTL_RCGCGPIO_R;
只是一個虛擬代碼,它為微控制器時鐘提供了一點時間來穩定。
您會發現這對您將使用的任何微控制器都有效,在時鐘設定之后,您必須留出一些時間讓時鐘穩定下來。
現在,為什么是 3 個時鐘周期?在閱讀微控制器資料表時應該找到此資訊,其中應指定需要多少個時鐘周期來穩定時鐘?
為什么不是 5 個或更多?當然,你不想在這個操作中浪費這么多時鐘周期,這樣剩下的程式就可以盡快執行了。
這條虛擬線如何對應 3 個時鐘周期?
ulLoop = SYSCTL_RCGCGPIO_R;
嗯,從一個控制器到另一個控制器,或者更具體地說,從編譯器到另一個控制器,這確實是不同的。編譯器確實將此 c 代碼行轉換為匯編代碼。每條流水線執行需要一個時鐘周期。因此,似乎無論是誰撰寫了這段代碼,只要查看編譯器生成的匯編代碼,就會發現這一行被翻譯成 3 條匯編指令。
如果沒有更多資訊,我該如何知道問題出在哪里
在嵌入式系統世界中,這可以通過除錯來實作。有些問題真的很難除錯,尤其是在控制器初始化序列中。在按照資料表說明/建議初始化控制器(時鐘、外設)時,您應該非常小心。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335269.html
上一篇:為什么位移位在C中是這樣寫的?
下一篇:C中的for回圈沒有執行