驗(yàn)二:標(biāo)準(zhǔn)外設(shè)庫(kù)方式流水燈與Keil仿真)
一、實(shí)驗(yàn)?zāi)康恼莆誗TM32標(biāo)準(zhǔn)外設(shè)庫(kù)SPL的工程搭建與GPIO庫(kù)函數(shù)用法用標(biāo)準(zhǔn)外設(shè)庫(kù)實(shí)現(xiàn)LED輪流閃爍使用Keil軟件仿真邏輯分析儀觀(guān)察GPIO輸出波形分析閃爍周期。二、實(shí)驗(yàn)硬件元件引腳說(shuō)明紅色LEDPA0高電平亮藍(lán)色LEDPA2高電平亮綠色LEDPB0高電平亮板載LEDPC13低電平亮三、工程項(xiàng)目創(chuàng)建與添加庫(kù)文件詳細(xì)過(guò)程3.1 新建Keil工程打開(kāi)Keil μVision5 → Project → New μVision Project選擇保存路徑命名為T(mén)ask2_SPL器件選擇窗口選STMicroelectronics → STM32F1 Series → STM32F103 → STM32F103C8彈出Manage Run-Time Environment先點(diǎn)Cancel后面手動(dòng)加庫(kù)。3.2 目錄結(jié)構(gòu)在工程文件夾下建立如下結(jié)構(gòu)Task2_SPL/ ├── Libraries/ │ ├── inc/ 標(biāo)準(zhǔn)外設(shè)庫(kù)頭文件 │ │ ├── stm32f10x.h │ │ ├── stm32f10x_gpio.h │ │ ├── stm32f10x_rcc.h │ │ ├── core_cm3.h │ │ ├── system_stm32f10x.h │ │ └── stm32f10x_conf.h │ └── src/ 標(biāo)準(zhǔn)外設(shè)庫(kù)源文件 │ ├── stm32f10x_gpio.c │ ├── stm32f10x_rcc.c │ ├── system_stm32f10x.c │ └── misc.c ├── Startup/ │ └── startup_stm32f10x_md.s 啟動(dòng)文件 ├── User/ │ └── main.c └── Listings/ Objects/ 編譯輸出3.3 添加源文件到Keil在Keil左側(cè)Project面板右鍵Source Group 1→ Add Existing Files選擇Libraries/src/下的stm32f10x_gpio.cstm32f10x_rcc.csystem_stm32f10x.cmisc.c再把startup_stm32f10x_md.s和User/main.c加進(jìn)來(lái)。3.4 配置頭文件路徑與宏右鍵工程 →Options for Target或按AltF7切到C/C選項(xiàng)卡Include Paths點(diǎn)…加入../Libraries/inc ../UserDefine框中填入U(xiǎn)SE_STDPERIPH_DRIVER, HSE_VALUE8000000切到Debug選項(xiàng)卡選Use Simulator軟件仿真點(diǎn)Settings→ 仿真選項(xiàng)卡中Dialog DLL保持默認(rèn)點(diǎn)OK保存。四、程序代碼#includestm32f10x.h/* 軟件延時(shí)約1ms8MHz主頻粗略值 */voidDelay_ms(volatileunsignedintms){unsignedinti,j;for(i0;ims;i)for(j0;j800U;j){;}}intmain(void){GPIO_InitTypeDef GPIO_InitStruct;/* 1. 開(kāi)GPIOA/B/C和AFIO時(shí)鐘 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);/* 2. PA0、PA2 推挽輸出50MHz */GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_2;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);/* 3. PB0 推挽輸出50MHz */GPIO_InitStruct.GPIO_PinGPIO_Pin_0;GPIO_Init(GPIOB,GPIO_InitStruct);/* 4. PC13 推挽輸出50MHz */GPIO_InitStruct.GPIO_PinGPIO_Pin_13;GPIO_Init(GPIOC,GPIO_InitStruct);/* 5. 初始全滅外接燈寫(xiě)0板載燈寫(xiě)1 */GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2);GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_13);/* 6. 流水循環(huán) */while(1){/* 紅燈 PA0 */GPIO_SetBits(GPIOA,GPIO_Pin_0);Delay_ms(1000);GPIO_ResetBits(GPIOA,GPIO_Pin_0);/* 藍(lán)燈 PA2 */GPIO_SetBits(GPIOA,GPIO_Pin_2);Delay_ms(1000);GPIO_ResetBits(GPIOA,GPIO_Pin_2);/* 綠燈 PB0 */GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(1000);GPIO_ResetBits(GPIOB,GPIO_Pin_0);/* 板載燈 PC13低電平亮 */GPIO_ResetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);GPIO_SetBits(GPIOC,GPIO_Pin_13);}}五、Keil軟件仿真邏輯分析儀觀(guān)察波形5.1 操作步驟編譯通過(guò)后按CtrlF5進(jìn)入Debug仿真菜單View → Analysis Windows → Logic Analyzer在彈出的Logic Analyzer窗口點(diǎn)Setup左上角點(diǎn)New(Insert)依次添加PORTA.0紅燈PORTA.2藍(lán)燈PORTB.0綠燈每個(gè)信號(hào)的Display Type改為Bit點(diǎn)Close然后按F5運(yùn)行波形繪制出來(lái)后用Zoom In/Out調(diào)整時(shí)間軸。5.2 仿真波形圖5.3 波形分析信號(hào)引腳高電平時(shí)間低電平時(shí)間周期紅色PA0約1s約3s約4s藍(lán)色PA2約1s約3s約4s綠色PB0約1s約3s約4s三個(gè)引腳均為方波高電平寬度約1秒對(duì)應(yīng)每只燈點(diǎn)亮的時(shí)間低電平約3秒對(duì)應(yīng)其余3只燈輪流亮的時(shí)間三路信號(hào)相位依次錯(cuò)開(kāi)符合流水燈邏輯高低電平轉(zhuǎn)換周期LED閃爍周期實(shí)測(cè)約為1秒與軟件延時(shí)目標(biāo)值基本一致軟件循環(huán)延時(shí)不是精確1秒受編譯器優(yōu)化和指令周期影響若需精確周期應(yīng)改用SysTick定時(shí)器。六、實(shí)驗(yàn)總結(jié)通過(guò)本實(shí)驗(yàn)掌握了標(biāo)準(zhǔn)外設(shè)庫(kù)的工程搭建方法學(xué)會(huì)了用庫(kù)函數(shù)RCC_APB2PeriphClockCmd、GPIO_Init、GPIO_SetBits等快速配置GPIO并使用Keil邏輯分析儀直觀(guān)觀(guān)察到了流水燈的輸出時(shí)序波形驗(yàn)證了代碼邏輯的正確性。