按照上一章建立的第一個(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è)STM32的Systick ,仿真結(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 A ;
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鍵 就可以看到GPIOB的5,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è)工程都上傳上去。
2014年1月12日
題外篇:
快半個(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)題,私信我。