專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM32點(diǎn)亮第一個(gè)LED使用keil for ARM MDK 軟件仿真

作者:忙碌的小姚   來(lái)源:忙碌的小姚   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月10日   【字體:

按照上一章建立的第一個(gè)工程模板,我們只需要在main函數(shù)里加入相關(guān)的點(diǎn)亮led燈的代碼,并使用keil的軟件仿真功能。

 

  軟件仿真在一定程度上可以在設(shè)計(jì)的初期發(fā)現(xiàn)程序的錯(cuò)誤,減少我們下載到開(kāi)發(fā)板的麻煩。但是純軟件的仿真的正確,也不能保證程序就正確。有時(shí)候仿真正確,實(shí)物卻沒(méi)這個(gè)效果。有時(shí)軟件仿真結(jié)果是錯(cuò)誤,你分析你的程序卻沒(méi)錯(cuò)誤。

遇到多了,經(jīng)驗(yàn)也就出來(lái),前幾天我仿真一個(gè)STM32Systick ,仿真結(jié)果就不對(duì),程序就是對(duì)的,我估計(jì)也許是軟件本身的問(wèn)題。 

  我建議用STM32+JLINK 進(jìn)行仿真,有個(gè)硬件平臺(tái)結(jié)果的正確性就有保證。

Main.c 函數(shù)代碼:

   #include "stm32f10x.h"

void delay(void)  

{

  int i,j;

for(i=1000;i>0;i--)

  for(j=1000;j>0;j--);

}

 void GPIO_Config(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;   

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 GPIO_Pin_6;   

    GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;  

    GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; 

    GPIO_Init(GPIOB &GPIO_InitStructure); 

}

int main(void)

{  

 

GPIO_Config();

 SystemInit();

  

while(1)

GPIO_SetBits(GPIOB,GPIO_Pin_5 ); //點(diǎn)亮PB.5

     delay();

GPIO_ResetBits(GPIOB,GPIO_Pin_5 );//熄滅PB.5

   delay();

GPIO_SetBits(GPIOB,GPIO_Pin_6 );//點(diǎn)亮PB.6

     delay();

GPIO_ResetBits(GPIOB,GPIO_Pin_6 );//熄滅PB.6

    delay(); 

  }

}

 

代碼分析:

 

GPIO_InitTypeDef  GPIO_InitStructure; 

    定義一個(gè)結(jié)構(gòu)變量GPIO_InitStructure  ,結(jié)構(gòu)體類型為GPIO_InitTypeDef ,相當(dāng)于int   ;   

    GPIO_InitTypeDef =int     GPIO_InitStructure=A一樣。    

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    開(kāi)啟GPIOB的時(shí)鐘,要使用某個(gè)管腳都需要開(kāi)啟該管腳的時(shí)鐘 

 GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 GPIO_Pin_6;

     管腳號(hào)設(shè)置為第五腳和第六腳 

 

 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; 

   GPIO_Speed_10MHz

   GPIO_Speed_2MHz, 

   GPIO_Speed_50MH

   設(shè)置管腳電平翻轉(zhuǎn)的速率,比如不要求快速變化一般10M,做串口的時(shí)候設(shè)置較高波特率的話就使用50MHZ的。

 

GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; 

   設(shè)置輸出為推挽輸出。 它有8中工作模式,輸出只有兩種推挽和開(kāi)漏輸出。其它可以參  

   考相關(guān)手冊(cè)

GPIO_Init(GPIOB &GPIO_InitStructure); 

   這一句就是將前面四句的設(shè)置初始化到GPIOB中;

 

 SystemInit();   將系統(tǒng)時(shí)鐘設(shè)置為72M,不寫(xiě)這句,默認(rèn)為8M

      GPIO_SetBits(GPIOB,GPIO_Pin_5 ); //點(diǎn)亮PB.5

     delay();// 延時(shí)

GPIO_ResetBits(GPIOB,GPIO_Pin_5 );//熄滅PB.5

   delay();

GPIO_SetBits(GPIOB,GPIO_Pin_6 );//點(diǎn)亮PB.6

     delay();

GPIO_ResetBits(GPIOB,GPIO_Pin_6 );//熄滅PB.6

    delay(); 

編譯鏈接,然后開(kāi)始軟件仿真

軟件仿真介紹:

1、編譯連接好后,點(diǎn)擊debug 進(jìn)入調(diào)試界面

 


2、調(diào)試窗口如下


3、

圖片上加文字不好弄,大概就是復(fù)位、運(yùn)行、停止、單步運(yùn)行等我也不太熟悉,反正用到的時(shí)候試一試就知道了。



 

4、選擇菜單欄上的 peripherals 按鈕,選擇general purpose I/O GPIOB


5、點(diǎn)擊左上角的運(yùn)行按鈕 或者按F5鍵 就可以看到GPIOB5,6 在一閃一閃的


6、順便在看看波形仿真功能

   點(diǎn)擊下圖的波形分析按鈕


 

7、、點(diǎn)擊setup 按鈕 會(huì)彈出一個(gè)窗口,在窗口的右上邊,有個(gè)new的按鈕,點(diǎn)擊后

  分別輸入 PORTB.5  PORTB.6



 8、點(diǎn)擊運(yùn)行,將窗口調(diào)到合適的位置,最終波形圖如下;

  

 


 

      寫(xiě)得有些地方可能有錯(cuò)誤,明天就要回四川了,有些急。

      我想把keil工程傳上來(lái),沒(méi)有看見(jiàn)上傳文件的地方,以后把每個(gè)工程都上傳上去。

  

                                                                  2014112

題外篇:

    快半個(gè)月沒(méi)發(fā)表,我斷斷續(xù)續(xù)學(xué)到串口,滴答定時(shí)器那里了。我感覺(jué)這樣不好,以后我學(xué)習(xí)一課我就發(fā)表一篇學(xué)習(xí)筆記,不要老是等學(xué)了幾課后再發(fā)表前面的。

    明天就回四川了,上個(gè)月六號(hào)離開(kāi)四川去深圳,這個(gè)月13號(hào)又離開(kāi)深圳回四川。深圳我不想多談的城市,細(xì)數(shù)了一下,到現(xiàn)在為止一共去了五趟深。今年最多,三入深圳,兩進(jìn)手術(shù)臺(tái),倒把人生的大多事看明白了看得淡了。好多事情我都不愿去管了,越來(lái)越漠不關(guān)心了。 

   估計(jì)再也不會(huì)來(lái)深圳,它的繁華亦不會(huì)再與我有交集。   

 

PS:  理論夠硬,才能走得更遠(yuǎn)。有問(wèn)題,私信我。

關(guān)閉窗口

相關(guān)文章