




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章LED燈控制與KeilMDK工程框架第一頁(yè),共八十五頁(yè)。1STM32F103通用目的輸入輸出口2STM32F103庫(kù)函數(shù)用法3KeilMDK工程框架4LED燈閃爍實(shí)例目錄第二頁(yè),共八十五頁(yè)。4.1STM32F103通用目的輸入輸出口第三頁(yè),共八十五頁(yè)。
STM32F103ZET6微控制器具有7個(gè)16位的GPIO口,記為GPIOx(x=A,B,...,G),共占用了112個(gè)管腳圖4-1GPIO端口結(jié)構(gòu)第四頁(yè),共八十五頁(yè)。
4.1.1GPIO寄存器這里的x=A,B,...,G,各個(gè)GPIO端口寄存器的基地址可查圖2-4,每個(gè)寄存器的讀寫操作必須按整個(gè)字(32位)進(jìn)行每個(gè)GPIO口具有7個(gè)寄存器2個(gè)32位的配置寄存器(GPIOx_CRL和GPIOx_CRH)2個(gè)32位的數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR)1個(gè)32位的置位/清零寄存器(GPIOx_BSRR)1個(gè)16位的清零寄存器(GPIOx_BRR)1個(gè)32位的配置鎖定寄存器(GPIOx_LCKR)第五頁(yè),共八十五頁(yè)。
偏移地址名稱類型復(fù)位值說明0x00CRL讀/寫0x44444444配置寄存器低位(每個(gè)端口4位)0x04CRH讀/寫0x44444444配置寄存器高位(每個(gè)端口4位)0x08IDR讀0x000016位輸入數(shù)據(jù)寄存器0x0CODR讀/寫0x000016位輸出數(shù)據(jù)寄存器0x10BSRR寫0x00000000位置位/復(fù)位寄存器0x14BRR寫0x0000位復(fù)位(清零)寄存器0x18LCKR讀/寫0x00000配置鎖定寄存器4.1.1GPIO寄存器第六頁(yè),共八十五頁(yè)。注:(1)ODR=1:上拉,ODR=0:下拉(2)01/10/11依次對(duì)應(yīng)最大輸出頻率為10MHz/2MHz/50MHzCNF[1:0]MODE[1:0]輸入配置CNF[1:0]MODE[1:0](2)輸出配置0000模擬輸入0001/10/11通用推挽輸出0100浮空輸入(復(fù)位狀態(tài))0101/10/11通用開漏輸出1000上拉/下拉輸入(1)1001/10/11復(fù)用推挽輸出1100保留1101/10/11復(fù)用開漏輸出每個(gè)端口的4個(gè)配置位是CNF[1:0]和MODE[1:0]第七頁(yè),共八十五頁(yè)。圖4-4端口置位/清零寄存器GPIOx_RSRR圖中的BRy和BSz寫入0無效;BRy寫入1,則清零相應(yīng)的端口管腳;BSz寫入1,則置位相應(yīng)的端口管腳。例如,使GPIOE的第5管腳輸出高電平,則使用語句“GPIOE_RSRR=(1uL<<5);”;使GPIOE端口的第11管腳輸出低電平,則使用語句“GPIOE_RSRR=(1uL<<11)<<16;”。如果使用端口輸出數(shù)據(jù)寄存器GPIOE_ODR,則上述兩個(gè)操作為“讀出—修改—寫回”處理,其語句為“GPIOE_ODR&=~(1uL<<5);”和“GPIOE_ODR|=(1uL<<11)”,顯然,直接寫寄存器GPIOE_RSRR速度更快。第八頁(yè),共八十五頁(yè)。上述使用GPIOx_RSRR清零某個(gè)GPIO端口的特定管腳時(shí),有一個(gè)左移16位(“<<16”)的操作,因?yàn)榍辶慵拇嫫魑挥贕PIOx_RSRR的高16位,為了省掉這個(gè)操作,GPIO模塊還具有一個(gè)16位的端口清零寄存器GPIOx_BRR(偏移地址:0x14,復(fù)位值為0x0),每位記為BRy(y=0,1,...,15),各位寫入0無效,寫入1清零相應(yīng)的端口管腳。例如,使GPIOE端口的第11管腳輸出低電平,則可使用語句“GPIOE_BRR=(1uL<<11);”。配置鎖定寄存器GPIOx_LCKR(偏移地址:0x18,復(fù)位值為0x0),用于鎖定配置寄存器GPIOx_CRL和GPIOx_CRH的值,如圖4-5所示。第九頁(yè),共八十五頁(yè)。圖4-5配置鎖定寄存器GPIOx_LCKR在圖4-5中,LCK[15:0]對(duì)應(yīng)著GPIO端口的16個(gè)管腳,例如,LCKy=1,則GPIO端口的第y腳的配置被鎖定,如果LCKy=0,則其配置是可以更新的。一旦某個(gè)GPIO管腳的配置被鎖定,只有再次“復(fù)位GPIO口”,才能解鎖。鎖定某個(gè)管腳的配置的方法為,使該管腳對(duì)應(yīng)的LCKy為1,然后,向LCKK順序執(zhí)行:寫入1、寫入0、寫入1、讀出0、讀出1(其間LCK[15:0]的值不能改變)。例如,要鎖定GPIOE端口的第5腳和第11腳的配置,則使用以下語句:第十頁(yè),共八十五頁(yè)。GPIOE_LCKR=(1uL<<11)|(1uL<<5);
GPIOE_LCKR=(1uL<<16)|(1uL<<11)|(1uL<<5);GPIOE_LCKR=(1uL<<11)|(1uL<<5);GPIOE_LCKR=(1uL<<16)|(1uL<<11)|(1uL<<5);v1=GPIOE_LCKR;v2=GPIOE_LCKR;
//(這里v1和v2為無符號(hào)32位整型)。
上面提到的“復(fù)位GPIO口”是由復(fù)位與時(shí)鐘控制模塊(RCC)管理的,此外,GPIO模塊(或其他外設(shè)模塊)在使用前,必須通過RCC給相應(yīng)的模塊提供時(shí)鐘源,相關(guān)的寄存器有APB2外設(shè)復(fù)位寄存器(RCC_APB2RSTR,偏移地址:0x0C)和APB2外設(shè)時(shí)鐘有效寄存器(RCC_APB2ENR,偏移地址:0x18),由圖2-4可知,RCC模塊的基地址為0x40021000。
第十一頁(yè),共八十五頁(yè)。圖4-6APB2外設(shè)復(fù)位寄存器RCC_APB2RSTR圖4-7APB2外設(shè)時(shí)鐘有效寄存器RCC_APB2ENR第十二頁(yè),共八十五頁(yè)。APB2外設(shè)復(fù)位寄存器RCC_APB2RSTR(復(fù)位值為0x0)和APB2外設(shè)時(shí)鐘有效寄存器RCC_APB2ENR(復(fù)位值為0x0)如圖4-6和圖4-7所示。對(duì)于圖4-6中的RCC_APB2RSTR寄存器,各位寫入0無效,寫入1則復(fù)位相應(yīng)的片上外設(shè);對(duì)于圖4-7的RCC_APB2ENR寄存器,各位寫入0關(guān)閉相應(yīng)外設(shè)的時(shí)鐘,寫入1開放相應(yīng)外設(shè)的時(shí)鐘。例如,要使用GPIOE口,則需要執(zhí)行語句:RCC_APB2ENR|=RCC_APB2ENR|(1uL<<6);啟動(dòng)GPIOE口的時(shí)鐘源。第十三頁(yè),共八十五頁(yè)。4.1.2AFIO寄存器(AlternateFunction)AFIO寄存器的基地址為0x40010000,STM32F103ZET6共包括7個(gè)AFIO寄存器(復(fù)位值均為0x0):事件控制寄存器AFIO_EVCR(偏移地址:0x0)替換功能重映射寄存器AFIO_MAPR(偏移地址:0x04)外部中斷配置寄存器AFIO_EXTICR1(偏移地址:0x08)外部中斷配置寄存器AFIO_EXTICR2(偏移地址:0x0C)外部中斷配置寄存器AFIO_EXTICR3(偏移地址:0x10)外部中斷配置寄存器AFIO_EXTICR4(偏移地址:0x14)替換功能重映射寄存器AFIO_MAPR2(偏移地址:0x1C)第十四頁(yè),共八十五頁(yè)。位號(hào)名稱屬性含義31:8
保留7EVOE可讀可寫設(shè)為1,Cortex內(nèi)核的EVENTOUT事件輸出端配置到PORT[2:0]和PIN[3:0]指定的管腳6:4PORT[2:0]可讀可寫可設(shè)為000b、001b、…、100b依次對(duì)應(yīng)PA、PB、…、PE口3:0PIN[3:0]可讀可寫可設(shè)為0000b、0001b、…、1111b依次對(duì)應(yīng)選定GPIO口的第0位、第1位、…、第15位對(duì)應(yīng)的管腳表4-1事件控制寄存器AFIO_EVCR
事件控制寄存器AFIO_EVCR如表4-1所示。第十五頁(yè),共八十五頁(yè)。表4-2替換功能重映射寄存器AFIO_MAPR位號(hào)名稱屬性含義31:27
保留26:24SWJ_CFG[2:0]只寫可設(shè)為000b~100b,依次表示JTAG和SW功能可用、JTAG和SW功能可用(無NJTRST)、只有SW可用、JTAG和SW不可用23:21
保留20ADC2_ETRG_REMAP可讀可寫清0表示ADC2外部常規(guī)觸發(fā)端為EXTI11,置1表示ADC2外部常規(guī)觸發(fā)端為TIM8_TRGO19ADC2_ETRGINJ_REMAP可讀可寫清0表示ADC2外部注入觸發(fā)端為EXTI15,置1表示ADC2外部注入觸發(fā)端為TIM8_Channel418ADC1_ETRG_REMAP可讀可寫清0表示ADC1外部常規(guī)觸發(fā)端為EXTI11,置1表示ADC1外部常規(guī)觸發(fā)端為TIM8_TRGO第十六頁(yè),共八十五頁(yè)。17ADC1_ETRGINJ_REMAP可讀可寫清0表示ADC1外部注入觸發(fā)端為EXTI15,置1表示ADC1外部注入觸發(fā)端為TIM8_Channel416TIM5CH4_IREMAP可讀可寫清0表示定時(shí)器5通道4與PA3連接,置1表示定時(shí)器5通道4與LSI時(shí)鐘連接15
保留14:13CAN_REMAP[1:0]可讀可寫為00b,關(guān)閉CAN通道;為01b表示CAN_RX與PB8連接、CAN_TX與PB9連接;為10b表示CAN_RX與PD0連接、CAN_TX與PD1連接12TIM4_REMAP可讀可寫清0表示TIM4無重映射;置1表示TIM4_CH1、TIM4_CH2、TIM4_CH3和TIM4_CH4依次映射到PD12~PD1511:10TIM3_REMAP[1:0]可讀可寫為00b表示TIM3無重映射;為01b保留;為10b表示部分映射(CH1/PB4、CH2/PB5);為11b表示全映射(CH1/PC6、CH4/PC7、CH3/PC8、CH4/PC9)9:8TIM2_REMAP[1:0]可讀可寫為00b表示TIM2無重映射;為01b表示部分映射(CH1/ETR/PA15、CH2/PB3);為10b表示部分映射(CH3/PB10、CH4/PB11);為11b表示全映射(CH1/ETR/PA15、CH2/PB3、CH3/PB10、CH4/PB11)第十七頁(yè),共八十五頁(yè)。9:8TIM2_REMAP[1:0]可讀可寫為00b表示TIM2無重映射;為01b表示部分映射(CH1/ETR/PA15、CH2/PB3);為10b表示部分映射(CH3/PB10、CH4/PB11);為11b表示全映射(CH1/ETR/PA15、CH2/PB3、CH3/PB10、CH4/PB11)7:6TIM1_REMAP[1:0]可讀可寫為00b表示TIM1無重映射;為01b表示部分映射(BKIN/PA6、CH1N/PA7、CH2N/PB0、CH3N/PB1);為10b保留;為11b表示全映射(ETR/PE7、CH1/PE9、CH2/PE11、CH3/PE13、CH4/PE14、BKIN/PE15、CH1N/PE8、CH2N/PE10、CH3N/PE12)5:4USART3_REMAP[1:0]可讀可寫為00b表示USART3無重映射;為01b表示部分映射(TX/PC10、RX/PC11、CK/PC12);為10b保留;為11b表示全映射(TX/PD8、RX/PD9、CK/PD10、CTS/PD11、RTS/PD12)3USART2_REMAP可讀可寫清0表示USART2無重映射;置1表示映射關(guān)系(CTS/PD3、RTS/PD4、TX/PD5、RX/PD6、CK/PD7)2USART1_REMAP可讀可寫清0表示USART1無重映射;置1表示映射關(guān)系(TX/PB6、RX/PB7)1I2C1_REMAP可讀可寫清0表示I2C1無重映射;置1表示映射關(guān)系(SCL/PB8、SDA/PB9)0SP11_REMAP可讀可寫清0表示SPI無重映射;置1表示映射關(guān)系(NSS/PA15、SCK/PB3、MISO/PB4、MOSI/PB5)第十八頁(yè),共八十五頁(yè)。外部中斷配置寄存器AFIO_EXTICR1、AFIO_EXTICR2、AFIO_EXTICR3和AFIO_EXTICR4的含義如表4-3所示。寄存器位號(hào)名稱含義AFIO_EXTICR431:16保留EXTIm[3:0],m=0,1,...,15表示外部中斷m,可取值為000b、001b、…、0110b,依次表示PA口、PB口、…、PG口。例如,設(shè)置PE口的第3管腳為外部中斷3的輸入端,則配置EXTI3[3:0]為4(即0100b)。15:12EXTI15[3:0]11:8EXTI14[3:0]7:4EXTI13[3:0]3:0EXTI12[3:0]AFIO_EXTICR331:16保留表4-3外部中斷配置寄存器AFIO_EXTICR1~4第十九頁(yè),共八十五頁(yè)。AFIO_EXTICR231:16保留
15:12EXTI7[3:0]11:8EXTI6[3:0]7:4EXTI5[3:0]3:0EXTI4[3:0]AFIO_EXTICR131:16保留替換功能重映射寄存器AFIO_MAPR2只有第10位有效,其余位保留。第10位符號(hào)為FSMC_NADV,可讀可寫屬性,為0表示FSMC_NADV與外部端口PB7相連接;為1表示FSMC_NADV無連接。第二十頁(yè),共八十五頁(yè)。4.2STM32F103庫(kù)函數(shù)用法第二十一頁(yè),共八十五頁(yè)。了解了STM32F103ZET6的GPIO寄存器,就可以操作GPIO口了。例如,令PB5(即GPIOB的第5腳)輸出高電平,可以使用語句:GPIOB->ODR|=(1uL<<5);或GPIOB->BSRR=(1uL<<5);這里的GPIOB是定義在文件stm32f10x.h中的結(jié)構(gòu)體指針,如程序段:第二十二頁(yè),共八十五頁(yè)。GPIOB的定義1typedefstruct2{3__IOuint32_tCRL;4__IOuint32_tCRH;5__IOuint32_tIDR;6__IOuint32_tODR;7__IOuint32_tBSRR;8__IOuint32_tBRR;9__IOuint32_tLCKR;10}GPIO_TypeDef;第二十三頁(yè),共八十五頁(yè)。11#definePERIPH_BASE((uint32_t)0x40000000)12#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)13#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)14#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)1516GPIOB->ODR&=~(1uL<<5);17GPIOB->ODR|=(1uL<<5);第二十四頁(yè),共八十五頁(yè)。程序段4-2自定義GPIOB_ODR寄存器1#defineGPIOB_ODR*(unsignedint*)0x40010C0C23GPIOB_ODR&=~(1uL<<5);4GPIOB_ODR|=(1uL<<5);第二十五頁(yè),共八十五頁(yè)。
意法半導(dǎo)體公司針對(duì)STM32F10x微控制器的全部外設(shè)提供了可以抽象訪問的庫(kù)函數(shù),所謂的“抽象訪問”是指當(dāng)訪問片內(nèi)外設(shè)時(shí),不需要關(guān)心片內(nèi)外設(shè)寄存器的地址和各位的函義,而是通過庫(kù)函數(shù)定義的見名知義的常量和函數(shù)調(diào)用直接訪問,例如,訪問PB5:用寄存器方式時(shí),需要了解PB口的各個(gè)寄存器及其地址,還要了解PB5在各個(gè)寄存器中的位置用庫(kù)函數(shù)方式時(shí),根據(jù)庫(kù)函數(shù)文件中定義的端口常量如GPIO_PIN_5、GPIO_Mode_Out_PP、GPIO_Speed_50MHz等和函數(shù)如GPIO_Init和GPIO_SetBits等進(jìn)行訪問這些常量和函數(shù)大都見名知義,并且意法半導(dǎo)體制作了STM32庫(kù)函數(shù)手冊(cè),方便查詢和使用第二十六頁(yè),共八十五頁(yè)。表4-4庫(kù)函數(shù)相關(guān)的文件序號(hào)庫(kù)函數(shù)文件庫(kù)函數(shù)頭文件描述1stm32f10x_adc.cstm32f10x_adc.hADC模塊庫(kù)函數(shù)(36個(gè))2stm32f10x_bkp.cstm32f10x_bkp.h備份寄存器BKP模塊庫(kù)函數(shù)(12個(gè))3stm32f10x_can.cstm32f10x_can.hCAN模塊庫(kù)函數(shù)(24個(gè))4stm32f10x_crc.cstm32f10x_crc.hCRC模塊庫(kù)函數(shù)(6個(gè))5stm32f10x_dac.cstm32f10x_dac.hDAC模塊庫(kù)函數(shù)(12個(gè))6stm32f10x_dma.cstm32f10x_dma.hDMA模塊庫(kù)函數(shù)(11個(gè))7stm32f10x_exti.cstm32f10x_exti.h外部中斷模塊庫(kù)函數(shù)(8個(gè))8stm32f10x_flash.cstm32f10x_flash.hFLASH模塊庫(kù)函數(shù)(28個(gè))9stm32f10x_fsmc.cstm32f10x_fsmc.hFSMC模塊庫(kù)函數(shù)(19個(gè))10stm32f10x_gpio.cstm32f10x_gpio.hGPIO模塊庫(kù)函數(shù)(18個(gè))11stm32f10x_i2c.cstm32f10x_i2c.hI2C模塊庫(kù)函數(shù)(33個(gè))第二十七頁(yè),共八十五頁(yè)。12stm32f10x_iwdg.cstm32f10x_iwdg.h內(nèi)部獨(dú)立看門狗模塊庫(kù)函數(shù)(6個(gè))13stm32f10x_pwr.cstm32f10x_pwr.h功耗控制PWR模塊庫(kù)函數(shù)(9個(gè))14stm32f10x_rcc.cstm32f10x_rcc.hRCC模塊庫(kù)函數(shù)(32個(gè))15stm32f10x_rtc.cstm32f10x_rtc.hRTC模塊庫(kù)函數(shù)(14個(gè))16stm32f10x_sdio.cstm32f10x_sdio.hSDIO模塊庫(kù)函數(shù)(30個(gè))17stm32f10x_spi.cstm32f10x_spi.hSPI模塊庫(kù)函數(shù)(23個(gè))18stm32f10x_tim.cstm32f10x_tim.hTIM模塊庫(kù)函數(shù)(87個(gè))19stm32f10x_usart.cstm32f10x_usart.hUSART模塊庫(kù)函數(shù)(29個(gè))20stm32f10x_wwdg.cstm32f10x_wwdg.hWWDG模塊庫(kù)函數(shù)(8個(gè))21misc.cmisc.hNVIC和SysTick庫(kù)函數(shù)(4個(gè)+1個(gè))22
stm32f10x_conf.h包括了序號(hào)1~21的全部庫(kù)函數(shù)頭文件第二十八頁(yè),共八十五頁(yè)。
由表4-4可知,庫(kù)函數(shù)全部的文件都是開源的C語言代碼,常量定義和函數(shù)聲明位于.h文件中,函數(shù)體位于.c文件中,例如,在stm32f10x_gpio.h中有以下宏定義語句和函數(shù)聲明:程序段4-3stm32f10x_gpio.h中的一個(gè)宏定義語句和一個(gè)函數(shù)聲明1#defineGPIO_Pin_5((uint16_t)0x0020)2voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);第二十九頁(yè),共八十五頁(yè)。而在相應(yīng)的stm32f10x_gpio.c文件中有以下函數(shù):
程序段4-4stm32f10x_gpio.c文件中的GPIO_SetBits函數(shù)1voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)2{3/*Checktheparameters*/4assert_param(IS_GPIO_ALL_PERIPH(GPIOx));5assert_param(IS_GPIO_PIN(GPIO_Pin));67GPIOx->BSRR=GPIO_Pin;8}第三十頁(yè),共八十五頁(yè)。
程序段4-3中,GPIO_Pin_5為常數(shù)(1uL<<5)。程序段4-4中,第4~5行為調(diào)用宏函數(shù)assert_param檢查函數(shù)GPIO_SetBits的兩個(gè)參數(shù)的合法性,第7行為寫寄存器GPIOx_BSRR。
現(xiàn)在結(jié)合程序段4-1中的第14行和程序段4-3和程序段4-4,可知語句“GPIO_SetBits(GPIOB,GPIO_Pin_5);”表示PB5口設(shè)為1。
因此,將PB5口設(shè)為1,用寄存器方式為“GPIOB->BSRR=(1uL<<5);”,用庫(kù)函數(shù)方式為“GPIO_SetBits(GPIOB,GPIO_Pin_5);”,顯然后者封裝了寄存器的各種信息,可讀性更好,更接近自然語言。如果使用庫(kù)函數(shù)進(jìn)行工程設(shè)計(jì),需要對(duì)表4-4中的文件,特別.h文件中每個(gè)常量和函數(shù)的含義做細(xì)致的研究,這需要花一定的時(shí)間。第三十一頁(yè),共八十五頁(yè)。4.3KeilMDK工程框架第三十二頁(yè),共八十五頁(yè)。第三十三頁(yè),共八十五頁(yè)。圖4-8工程01文件夾結(jié)構(gòu)安裝好KeilMDK后,會(huì)在桌面上顯示快捷圖標(biāo)“KeilMDKuVision5”,鼠標(biāo)左鍵雙擊該圖標(biāo)進(jìn)入圖4-9所示窗口。第三十四頁(yè),共八十五頁(yè)。圖4-9KeilMDK工作主界面在圖4-9中,單擊“芯片支持包安裝快捷鈕”進(jìn)入圖4-10所示界面。第三十五頁(yè),共八十五頁(yè)。圖4-10芯片支持包在線安裝窗口第三十六頁(yè),共八十五頁(yè)。
圖4-10中的“Device”一欄中顯示了KeilMDK開發(fā)環(huán)境所支持的芯片系列。在圖4-10中,至少要安裝圖中所示的STM32F103系列的芯片支持包,前文提到的stm23f10x.h文件就位于該支持包內(nèi)。
回到圖4-9,在其中單擊菜單“Project|NewμVisionProject...”(“|”后的表示子菜單項(xiàng)),彈出圖4-11所示窗口。第三十七頁(yè),共八十五頁(yè)。圖4-11創(chuàng)建新工程對(duì)話框第三十八頁(yè),共八十五頁(yè)。在圖4-10中,選擇目錄“D:\STM32F103ZET6工程\工程01\PRJ”,然后,在“文件名”一項(xiàng)中,輸入工程文件名為“MyPrj”,點(diǎn)擊“保存(S)”進(jìn)入圖4-12所示窗口。圖4-12選擇目標(biāo)芯片型號(hào)對(duì)話框第三十九頁(yè),共八十五頁(yè)。
在圖4-12中,選擇芯片STM32F103ZE,在“Description”中將顯示該芯片的資源情況。在圖4-12中單擊“OK”按鈕進(jìn)入圖4-13所示窗口。
在圖4-13中,選中“Core”、“DSP”、“GPIO”和“Startup”,依次表示向工程中添加Cortex-M3內(nèi)核支持庫(kù)、數(shù)字信號(hào)處理算法庫(kù)、通用目的輸入輸出口驅(qū)動(dòng)庫(kù)和芯片啟動(dòng)代碼文件。當(dāng)使用數(shù)字信號(hào)處理算法庫(kù)中的函數(shù)時(shí),需要在用戶程序文件中包括頭文件“arm_math.h”,DSP算法庫(kù)中包含了大量經(jīng)過優(yōu)化的數(shù)學(xué)函數(shù),可實(shí)現(xiàn)代數(shù)運(yùn)算、復(fù)數(shù)運(yùn)算、矩陣運(yùn)算、數(shù)字濾波器和統(tǒng)計(jì)處理等,例如,浮點(diǎn)數(shù)的正弦、余弦和開方運(yùn)算分別對(duì)應(yīng)著以下三個(gè)函數(shù):float32_ty=arm_sin_f32(float32_tx);float32_ty=arm_cos_f32(float32_tx);arm_sqrt_f32(float32_tx,float32_t*y);第四十頁(yè),共八十五頁(yè)。
圖4-13添加運(yùn)行時(shí)(Run-Time)環(huán)境第四十一頁(yè),共八十五頁(yè)。圖4-14工程01工作界面-I第四十二頁(yè),共八十五頁(yè)。
在圖4-14中,工程管理器顯示新建的工程為MyPrj,保存為“D:\STM32F103ZET6工程\工程01\PRJ\MyPrj.uvprojx”??尚薷墓こ坦芾砥髦械哪繕?biāo)“Target1”和分組“SourceGroup1”的名稱,單擊“工程管理快捷鈕”進(jìn)入圖4-15所示窗口。
在圖4-15中,將原來的目標(biāo)“Target1”修改為“STM32F103ZET6”,即所使用的芯片型號(hào);將原來的分組“SourceGroup1”刪除,新建兩個(gè)分組“USER”和“BSP”(注意,這里的分組名與工程在硬件中的保存目錄名沒有直接的關(guān)系)。點(diǎn)擊“OK”按鈕進(jìn)入圖4-16所示窗口。第四十三頁(yè),共八十五頁(yè)。圖4-15編輯工程管理器中的各項(xiàng)第四十四頁(yè),共八十五頁(yè)。圖4-16工程01工作界面-II第四十五頁(yè),共八十五頁(yè)。
在圖4-16中,工程管理器中有兩個(gè)分組,即“USER”和“BSP”,這兩個(gè)分組分別用于管理用戶程序文件和板級(jí)支持包文件。圖4-16中顯示了常用的快捷按鈕,如“新建文檔按鈕”用于打開一個(gè)文檔輸入窗口進(jìn)行程序編輯;“在線調(diào)試快捷鈕”用于在線仿真調(diào)試;“編譯、編譯鏈接、全部編譯鏈接”三個(gè)快捷鈕分別用于編譯當(dāng)前活躍文件、編譯鏈接修改過的源文件和全部編譯鏈接整個(gè)工程文件;“下載工程可執(zhí)行代碼到目標(biāo)芯片”用于將編譯鏈接成功后的.hex目標(biāo)代碼寫入到STM32F103ZET6芯片的Flash存儲(chǔ)器中。在圖4-16中,鼠標(biāo)右鍵單擊“STM32F103ZET6”,在其彈出的菜單中選擇“OptionsforTarget'STM32F103ZET6'...Alt+F7”,進(jìn)入到圖4-17所示窗口。第四十六頁(yè),共八十五頁(yè)。圖4-17目標(biāo)選項(xiàng)卡第四十七頁(yè),共八十五頁(yè)。
在圖4-17中,選中“IROM1”,長(zhǎng)度為0x80000(即512kBFLASH);選中“IRAM1”,長(zhǎng)度為“0x10000”(即64kBSRAM)。在圖4-17中,選擇“Output”頁(yè)面,進(jìn)入圖4-18所示窗口。
在圖4-18中,設(shè)定工程生成的目標(biāo)文件名為MyPrj,所在的路徑為“.\Objects\MyPrj”,即工程所在路徑下的“D:\STM32F103ZET6工程\工程01\PRJ\Objects\MyPrj”,然后,選中“CreateHEXFile”復(fù)選框,表示編譯鏈接后產(chǎn)生HEX格式的目標(biāo)文件。在圖4-18中選擇“C/C++”選項(xiàng)卡,進(jìn)入圖4-19所示窗口。第四十八頁(yè),共八十五頁(yè)。圖4-18“Output”輸出目標(biāo)文件路徑和格式選項(xiàng)卡第四十九頁(yè),共八十五頁(yè)。圖4-19“C/C++”選項(xiàng)卡
第五十頁(yè),共八十五頁(yè)。圖4-20“Debug”選項(xiàng)卡第五十一頁(yè),共八十五頁(yè)。
在圖4-19中,“IncludePaths”中指定工程編譯時(shí)搜索文件的路徑,這里的“.”表示工程所在的路徑,即“D:\STM32F103ZET6工程\工程01\PRJ\”,“..”表示工程所在路徑的上一個(gè)路徑,即“D:\STM32F103ZET6工程\工程01\”。然后,在圖4-19中選擇“Debug”選項(xiàng)卡,進(jìn)入圖4-20所示窗口。
在圖4-20中,由于這里使用了ULINK2仿真器,所以選擇了“ULINK2/MECotexDebugger”,選中“Runtomain()”表示在線真調(diào)試時(shí),程序計(jì)數(shù)器指針PC自動(dòng)跳轉(zhuǎn)到main函數(shù)執(zhí)行,否則,PC將跳轉(zhuǎn)到匯編語言編寫的啟動(dòng)文件startup_stm32f10x_hd.s中的Reset_Handler標(biāo)號(hào)去執(zhí)行。在圖4-20中單擊“Settings”按鈕進(jìn)入圖4-21所示窗口。第五十二頁(yè),共八十五頁(yè)。圖4-21ULINK2仿真連接對(duì)話框第五十三頁(yè),共八十五頁(yè)。圖4-22FLASH編程算法選擇對(duì)話框第五十四頁(yè),共八十五頁(yè)。
如果STM32F103戰(zhàn)艦V3開發(fā)板已上電,且ULINK2連接正常,則圖4-21中將顯示Cortex-M3的IDCODE為“0x1BA01477”,表示連接正常。STM32F103ZET6支持JTAG和SW兩種調(diào)試方式,圖4-21中的“Port”可選SW或JTAG。在圖4-21中選擇“FlashDownload”選項(xiàng)卡,進(jìn)入圖4-22所示窗口。
在圖4-22中,添加FLASH編程算法“STM32F10xHigh-densityFlash”,然后,單擊“OK”按鈕回到圖4-20,在圖4-20中單擊“OK”按鈕回到圖4-16,這樣基于KeilMDK軟件開發(fā)環(huán)境的工程框架就配置好了。第五十五頁(yè),共八十五頁(yè)。4.4LED燈閃爍實(shí)例
在STM32F103戰(zhàn)艦V3開發(fā)板集成了2個(gè)LED燈,如圖3-12所示。由圖3-12、圖3-3和圖3-6可知,LED0燈由PB5控制,LED1燈由PE5控制。下面介紹LED燈閃爍控制的工程設(shè)計(jì)實(shí)例。4.4.1寄存器類型工程實(shí)例
在圖4-16基礎(chǔ)上,新建文件led.c和led.h保存在子文件夾“BSP”下。然后,新建文件main.c、includes.h和vartypes.h,保存在子文件夾“USER”下。接著,將led.c文件添加到工程管理器的“BSP”分組下,將main.c文件添加到工程管理器的“USER”分組下,如圖4-23所示。注意,圖4-23中工程管理器中的分組名與子文件夾的名稱是相同的,但是二者沒有聯(lián)系,分組名可以使用各種符號(hào)和漢字。第五十六頁(yè),共八十五頁(yè)。圖4-23工程01工作界面-III第五十七頁(yè),共八十五頁(yè)。下面依次介紹工程01中的各個(gè)文件,如程序段4-5至程序段4-9所示。
程序段4-5文件vartypes.h1//:vartypes.h23#ifndef_VARTYPES_H4#define_VARTYPES_H56typedefunsignedcharInt08U;7typedefsignedcharInt08S;8typedefunsignedshortInt16U;9typedefsignedshortInt16S;10typedefunsignedint
Int32U;11typedefsignedintInt32S;第五十八頁(yè),共八十五頁(yè)。1213typedeffloatFloat32;1415typedefenum{LED_ON,LED_OFF}LEDState;1617#endif
頭文件vartypes.h是用戶自定義的變量類型文件。程序段4-5中,第3、4行和第17行構(gòu)成預(yù)編譯處理,由于頭文件vartypes.h被工程中的多個(gè)源文件包括,使用預(yù)編譯處理指令可保證該頭文件僅被包括一次。第6~11行依次定義了自定義變量類型:無符號(hào)8位整型、有符號(hào)8位整型、無符號(hào)16位整型、有符號(hào)16位整型、無符號(hào)32位整型和有符號(hào)32位整型。第13行定義了32位浮點(diǎn)型自定義變量類型。第15行定義了枚舉型自定義類型,用于定義LED燈的狀態(tài),LED_ON和LED_OFF分別用于表示LED燈的開和關(guān)的狀態(tài)。第五十九頁(yè),共八十五頁(yè)。程序段4-6文件includes.h1//:includes.h23#include"stm32f10x.h"45#include"vartypes.h"6#include"led.h"
頭文件includes.h是工程中總的包括頭文件,包括了工程中用到的其余全部頭文件,該includes.h頭文件被全部用戶源文件所包括。程序段4-6中第3行包括了系統(tǒng)頭文件stm32f10x.h,該頭文件中宏定義了STM32F103ZET6芯片的全部片內(nèi)外設(shè)的寄存器。第5行包括了頭文件vartypes.h,該頭文件為用戶自定義的變量卷類型頭文件。第6行包括了闊大文件led.h,該頭文件聲明了源文件led.c中定義的函數(shù)的原型。第六十頁(yè),共八十五頁(yè)。程序段4-7文件main.c1//:main.c23#include"includes.h"45voidDelay(Int32U);67intmain(void)8{9 LEDInit();10 for(;;)11 {12 LED(0,LED_ON);13 LED(1,LED_OFF);14 Delay(500);第六十一頁(yè),共八十五頁(yè)。15 LED(0,LED_OFF);16 LED(1,LED_ON);17 Delay(500);18 }19}2021voidDelay(Int32Uu)22{23 Int32Ui,j;24 for(i=0;i<u;i++)25 for(j=0;j<12000;j++);26}第六十二頁(yè),共八十五頁(yè)。
程序段4-8文件led.h1//:led.h23#include"vartypes.h"45#ifndef_LED_H6#define_LED_H78voidLEDInit(void);9voidLED(Int08U,LEDState);1011#endif第六十三頁(yè),共八十五頁(yè)。本書工程中,每個(gè)源文件都有一個(gè)對(duì)應(yīng)的頭文件,用于聲明源文本中定義的函數(shù)。第3行包括了頭文件vartypes.h,因?yàn)榈?行的函數(shù)聲明用到了自定義變量類型Int08U和LEDState;第8行聲明了LEDInit函數(shù);第9行聲明了LED函數(shù)。
程序段4-9文件led.c1//:led.c23#include"includes.h"45voidLEDInit(void)6{第六十四頁(yè),共八十五頁(yè)。7 RCC->APB2ENR|=(1uL<<3)|(1uL<<6);8 GPIOB->CRL|=(1uL<<20);9 GPIOB->CRL&=~((1uL<<21)|(1uL<<22)|(1uL<<23));10 11 GPIOE->CRL|=(1uL<<20);12 GPIOE->CRL&=~((1uL<<21)|(1uL<<22)|(1uL<<23));13}1415voidLED(Int08Uw,LEDStates)16{17 switch(w)18 {19 case0:20 if(s==LED_ON)21 GPIOB->BRR=(1uL<<5);第六十五頁(yè),共八十五頁(yè)。22 else23 GPIOB->BSRR=(1uL<<5);24 break;25 case1:26 if(s==LED_ON)27 GPIOE->BRR=(1uL<<5); 28 else29 GPIOE->BSRR=(1uL<<5);30 break;31 default:32 break;33 } 34}第六十六頁(yè),共八十五頁(yè)。
文件led.c是LED燈的驅(qū)動(dòng)文件,包括了兩個(gè)函數(shù),即LEDInit和LED。第8~9行配置PB5為推挽輸出,最大速率為10MHz(參見圖4-2);第11~12行配置PE5為推挽輸出,最大速率為10MHz(參見圖4-2)。第15~34行為L(zhǎng)ED函數(shù),該函數(shù)有兩個(gè)參數(shù)w和s,w取0表示LED0,w取1表示LED1;s取值LED_ON,表示相應(yīng)的LED燈點(diǎn)亮,s取值LED_OFF,表示相應(yīng)的LED燈熄滅。在LED函數(shù)中,第17行判斷w的值,如果為0,則第20~24行被執(zhí)行,如果第20行為真,則第21行點(diǎn)亮LED0,否則熄滅LED0(第23行);如果w的值為1,則第26~30行被執(zhí)行,如果第26行為真,則點(diǎn)亮LED1(第27行),否則熄滅LED1(第29行)。
工程01的執(zhí)行過程如圖4-24所示、第六十七頁(yè),共八十五頁(yè)。圖4-24工程01的執(zhí)行流程
由圖4-24可知,工程01上電復(fù)位后,首先執(zhí)行位于文件system_stm32f10x.c中的SystemInit函數(shù),用于將STM32F103ZET6的時(shí)鐘由8MHz調(diào)整到72MHz(除此之外,在啟動(dòng)文件startup_stm32f10x_hd.s中還為C語言函數(shù)分配了堆??臻g);然后,轉(zhuǎn)到main函數(shù)執(zhí)行;進(jìn)入到main函數(shù)后,首先調(diào)用LEDInit函數(shù)初始化LED燈的控制;接著進(jìn)入無限循環(huán)體,依次循環(huán)執(zhí)行“LED0亮、LED1滅——延時(shí)約1秒——LED0滅、LED1亮——延時(shí)約1秒”。其中,LED0亮和LED1滅是main函數(shù)調(diào)用led.c文件中的LED函數(shù)實(shí)現(xiàn)的,延時(shí)函數(shù)Delay位于主文件main.c中,由for循環(huán)實(shí)現(xiàn)。第六十八頁(yè),共八十五頁(yè)。4.4.2庫(kù)函數(shù)類型工程實(shí)例第六十九頁(yè),共八十五頁(yè)。圖4-25工程02目錄和文件結(jié)構(gòu)
圖4-25中的src子目錄包括了表4-4中“庫(kù)函數(shù)文件”一欄中的全部文件,inc子目錄包括了表4-4中“庫(kù)函數(shù)頭文件”一欄中的全部文件。第七十頁(yè),共八十五頁(yè)。在工程02中,修改圖4-19所示的“C/C++”選項(xiàng)卡,如圖4-26所示,即添加兩個(gè)全局的宏定義常量STM32F10X_HD和USE_STDPERIPH_DRIVER,并且,編譯的搜索路徑改為“..\BSP;..\USER;.\RTE;..\STM32F10x_FWLib;..\STM32F10x_FWLib\inc”。這里添加的宏定義常量USE_STDPERIPH_DRIVER,是因?yàn)樵谖募tm32f10x.h中有以下語句:
程序段4-10文件stm32f10x.h中的語句1#ifdefUSE_STDPERIPH_DRIVER#include"stm32f10x_conf.h“3#endif
由于庫(kù)函數(shù)文件是針對(duì)STM23F10x全系列的微控制器,宏定義常量STM32F10X_HD表示僅使得那些STM32F103ZET6相關(guān)的常量和函數(shù)有效。第七十一頁(yè),共八十五頁(yè)。圖4-26“C/C++”選項(xiàng)卡第七十二頁(yè),共八十五頁(yè)。在工程管理器中,新建分組“LIB”,將目錄“D:\STM32F103ZET6工程\工程02\STM32F10x_FWLib\src”下的文件“stm32f10x_gpio.c”和“stm32f10x_rcc.c”添加到分組“LIB”下(當(dāng)然,可以將src子目錄下的全部文件都添加到分組LIB下,這里僅添加了本工程中用到的源文件),如圖4-27所示。第七十三頁(yè),共八十五頁(yè)。圖4-27工程02工作窗口第七十四頁(yè),共八十五頁(yè)。
相對(duì)于工程01的文件,工程02只需要修改led.c文件,如程序段4-11所示。
程序段4-11文件led.c1//:led.c23#include"includes.h"45voidLEDInit(void)6{7 GPIO_InitTypeDefg;8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);9 10 g.GPIO_Pin=GPIO_Pin_5;第七十五頁(yè),共八十五頁(yè)。11 g.GPIO_Mode=GPIO_Mode_Out_PP;12 g.GPIO_Speed=GPIO_Speed_50MHz;13 GPIO_Init(GPIOB,&g);14 15 g.GPIO_Pin=GPIO_Pin_5;16 g.GPIO_Mode=GPIO_Mode_Out_PP;17 g.GPIO_Speed=GPIO_Speed_50MHz;18 GPIO_Init(GPIOE,&g);19}2021voidLED(Int08Uw,LEDStates)//w-which(1or2),s-state(LED_ONorLED_OFF)第七十六頁(yè),共八十五頁(yè)。22{23 switch(w)24 {25 case0:26 if(s==LED_ON)27 GPIO_ResetBits(GPIOB,GPIO_Pin_5);28 else29 GPIO_SetBits(GPIOB,GPIO_Pin_5);30 break;31 case1:32 if(s==LED_ON)33
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025湖南省安全員知識(shí)題庫(kù)
- 2025遼寧省安全員《A證》考試題庫(kù)及答案
- 勞務(wù)合同范本里有
- 三年級(jí)口算題目大全集1000道
- 二年級(jí)口算練習(xí)題100道
- 單位定制制服合同范例
- 2025年陜西省安全員-A證考試題庫(kù)及答案
- 廠區(qū)保潔合同范本
- 北京出租司機(jī)合同范本
- 2025年天津市安全員-B證考試題庫(kù)附答案
- 2025年江蘇南京技師學(xué)院招聘工作人員19人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 華東師大版七年級(jí)數(shù)學(xué)下冊(cè)“第1周周考”
- DBJ50-T-385-2023半柔性復(fù)合路面技術(shù)標(biāo)準(zhǔn)
- 2025年湘教版二年級(jí)美術(shù)下冊(cè)計(jì)劃與教案
- GB/T 4706.30-2024家用和類似用途電器的安全第30部分:廚房機(jī)械的特殊要求
- 2024年岳陽職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案解析
- 消防安全管理制度完整版完整版
- 20馬工程教材《公共財(cái)政概論》-第一章-公課件
- 入團(tuán)志愿書(2016版本)(可編輯打印標(biāo)準(zhǔn)A4) (1)
- 機(jī)電一體化系統(tǒng)設(shè)計(jì)課件姜培剛[1]
- 《質(zhì)量管理小組活動(dòng)準(zhǔn)則》2020版_20211228_111842
評(píng)論
0/150
提交評(píng)論