STM32各模塊學(xué)習(xí)筆記.doc_第1頁
STM32各模塊學(xué)習(xí)筆記.doc_第2頁
STM32各模塊學(xué)習(xí)筆記.doc_第3頁
STM32各模塊學(xué)習(xí)筆記.doc_第4頁
STM32各模塊學(xué)習(xí)筆記.doc_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

STM32中斷優(yōu)先級(jí)和開關(guān)總中斷一,中斷優(yōu)先級(jí):STM32(Cortex-M3)中的優(yōu)先級(jí)概念STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),有人把響應(yīng)優(yōu)先級(jí)稱作亞優(yōu)先級(jí)或副優(yōu)先級(jí),每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí)。具有高搶占式優(yōu)先級(jí)的中斷可以在具有低搶占式優(yōu)先級(jí)的中斷處理過程中被響應(yīng),即中斷嵌套,或者說高搶占式優(yōu)先級(jí)的中斷可以嵌套低搶占式優(yōu)先級(jí)的中斷。當(dāng)兩個(gè)中斷源的搶占式優(yōu)先級(jí)相同時(shí),這兩個(gè)中斷將沒有嵌套關(guān)系,當(dāng)一個(gè)中斷到來后,如果正在處理另一個(gè)中斷,這個(gè)后到來的中斷就要等到前一個(gè)中斷處理完之后才能被處理。如果這兩個(gè)中斷同時(shí)到達(dá),則中斷控制器根據(jù)他們的響應(yīng)優(yōu)先級(jí)高低來決定先處理哪一個(gè);如果他們的搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都相等,則根據(jù)他們在中斷表中的排位順序決定先處理哪一個(gè)。既然每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí),就需要有相應(yīng)的寄存器位記錄每個(gè)中斷的優(yōu)先級(jí);在Cortex-M3中定義了8個(gè)比特位用于設(shè)置中斷源的優(yōu)先級(jí),這8個(gè)比特位可以有8種分配方式,如下:所有8位用于指定響應(yīng)優(yōu)先級(jí)最高1位用于指定搶占式優(yōu)先級(jí),最低7位用于指定響應(yīng)優(yōu)先級(jí)最高2位用于指定搶占式優(yōu)先級(jí),最低6位用于指定響應(yīng)優(yōu)先級(jí)最高3位用于指定搶占式優(yōu)先級(jí),最低5位用于指定響應(yīng)優(yōu)先級(jí)最高4位用于指定搶占式優(yōu)先級(jí),最低4位用于指定響應(yīng)優(yōu)先級(jí)最高5位用于指定搶占式優(yōu)先級(jí),最低3位用于指定響應(yīng)優(yōu)先級(jí)最高6位用于指定搶占式優(yōu)先級(jí),最低2位用于指定響應(yīng)優(yōu)先級(jí)最高7位用于指定搶占式優(yōu)先級(jí),最低1位用于指定響應(yīng)優(yōu)先級(jí)這就是優(yōu)先級(jí)分組的概念。-Cortex-M3允許具有較少中斷源時(shí)使用較少的寄存器位指定中斷源的優(yōu)先級(jí),因此STM32把指定中斷優(yōu)先級(jí)的寄存器位減少到4位,這4個(gè)寄存器位的分組方式如下: 第0組:所有4位用于指定響應(yīng)優(yōu)先級(jí)第1組:最高1位用于指定搶占式優(yōu)先級(jí),最低3位用于指定響應(yīng)優(yōu)先級(jí)第2組:最高2位用于指定搶占式優(yōu)先級(jí),最低2位用于指定響應(yīng)優(yōu)先級(jí)第3組:最高3位用于指定搶占式優(yōu)先級(jí),最低1位用于指定響應(yīng)優(yōu)先級(jí)第4組:所有4位用于指定搶占式優(yōu)先級(jí)可以通過調(diào)用STM32的固件庫中的函數(shù)NVIC_PriorityGroupConfig()選擇使用哪種優(yōu)先級(jí)分組方式,這個(gè)函數(shù)的參數(shù)有下列5種:NVIC_PriorityGroup_0 = 選擇第0組NVIC_PriorityGroup_1 = 選擇第1組NVIC_PriorityGroup_2 = 選擇第2組NVIC_PriorityGroup_3 = 選擇第3組NVIC_PriorityGroup_4 = 選擇第4組 接下來就是指定中斷源的優(yōu)先級(jí),下面以一個(gè)簡單的例子說明如何指定中斷源的搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí):/ 選擇使用優(yōu)先級(jí)分組第1組NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); / 使能EXTI0中斷NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; / 指定搶占式優(yōu)先級(jí)別1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; / 指定響應(yīng)優(yōu)先級(jí)別0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); / 使能EXTI9_5中斷NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; / 指定搶占式優(yōu)先級(jí)別0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; / 指定響應(yīng)優(yōu)先級(jí)別1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);要注意的幾點(diǎn)是:1)如果指定的搶占式優(yōu)先級(jí)別或響應(yīng)優(yōu)先級(jí)別超出了選定的優(yōu)先級(jí)分組所限定的范圍,將可能得到意想不到的結(jié)果;2)搶占式優(yōu)先級(jí)別相同的中斷源之間沒有嵌套關(guān)系;3)如果某個(gè)中斷源被指定為某個(gè)搶占式優(yōu)先級(jí)別,又沒有其它中斷源處于同一個(gè)搶占式優(yōu)先級(jí)別,則可以為這個(gè)中斷源指定任意有效的響應(yīng)優(yōu)先級(jí)別。二,開關(guān)總中斷:在STM32/Cortex-M3中是通過改變CPU的當(dāng)前優(yōu)先級(jí)來允許或禁止中斷。PRIMASK位:只允許NMI和hard fault異常,其他中斷/異常都被屏蔽(當(dāng)前CPU優(yōu)先級(jí)=0)。FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當(dāng)前CPU優(yōu)先級(jí)=-1)。在STM32固件庫中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定義了四個(gè)函數(shù)操作PRIMASK位和FAULTMASK位,改變CPU的當(dāng)前優(yōu)先級(jí),從而達(dá)到控制所有中斷的目的。下面兩個(gè)函數(shù)等效于關(guān)閉總中斷:void NVIC_SETPRIMASK(void);void NVIC_SETFAULTMASK(void);下面兩個(gè)函數(shù)等效于開放總中斷:void NVIC_RESETPRIMASK(void);void NVIC_RESETFAULTMASK(void);上面兩組函數(shù)要成對使用,不能交叉使用。例如:第一種方法:NVIC_SETPRIMASK(); /關(guān)閉總中斷NVIC_RESETPRIMASK();/開放總中斷第二種方法:NVIC_SETFAULTMASK(); /關(guān)閉總中斷NVIC_RESETFAULTMASK();/開放總中斷常常使用NVIC_SETPRIMASK(); / Disable InterruptsNVIC_RESETPRIMASK(); / Enable Interrupts STM32時(shí)鐘系統(tǒng)STM32資料 2009-09-23 14:53 閱讀72 評論0 字號(hào): 大大 中中 小小 在STM32中,有五個(gè)時(shí)鐘源,為HSI、HSE、LSI、LSE、PLL。、HSI是高速內(nèi)部時(shí)鐘,RC振蕩器,頻率為8MHz。、HSE是高速外部時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)鐘源,頻率范圍為4MHz16MHz。、LSI是低速內(nèi)部時(shí)鐘,RC振蕩器,頻率為40kHz。、LSE是低速外部時(shí)鐘,接頻率為32.768kHz的石英晶體。、PLL為鎖相環(huán)倍頻輸出,其時(shí)鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為216倍,但是其輸出頻率最大不得超過72MHz。圖1 HSE/LSE時(shí)鐘源其中40kHz的LSI供獨(dú)立看門狗IWDG使用,另外它還可以被選擇為實(shí)時(shí)時(shí)鐘RTC的時(shí)鐘源。另外,實(shí)時(shí)時(shí)鐘RTC的時(shí)鐘源還可以選擇LSE,或者是HSE的128分頻。RTC的時(shí)鐘源通過RTCSEL1:0來選擇。STM32中有一個(gè)全速功能的USB模塊,其串行接口引擎需要一個(gè)頻率為48MHz的時(shí)鐘源。該時(shí)鐘源只能從PLL輸出端獲取,可以選擇為1.5分頻或者1分頻,也就是,當(dāng)需要使用USB模塊時(shí),PLL必須使能,并且時(shí)鐘頻率配置為48MHz或72MHz。另外,STM32還可以選擇一個(gè)時(shí)鐘信號(hào)輸出到MCO腳(PA8)上,可以選擇為PLL輸出的2分頻、HSI、HSE、或者系統(tǒng)時(shí)鐘。系統(tǒng)時(shí)鐘SYSCLK,它是供STM32中絕大部分部件工作的時(shí)鐘源。系統(tǒng)時(shí)鐘可選擇為PLL輸出、HSI或者HSE。系統(tǒng)時(shí)鐘最大頻率為72MHz,它通過AHB分頻器分頻后送給各模塊使用,AHB分頻器可選擇1、2、4、8、16、64、128、256、512分頻。其中AHB分頻器輸出的時(shí)鐘送給5大模塊使用:、送給AHB總線、內(nèi)核、內(nèi)存和DMA使用的HCLK時(shí)鐘。、通過8分頻后送給Cortex的系統(tǒng)定時(shí)器時(shí)鐘。、直接送給Cortex的空閑運(yùn)行時(shí)鐘FCLK。、送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設(shè)使用(PCLK1,最大頻率36MHz),另一路送給定時(shí)器(Timer)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時(shí)鐘輸出供定時(shí)器2、3、4使用。、送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設(shè)使用(PCLK2,最大頻率72MHz),另一路送給定時(shí)器(Timer)1倍頻器使用。該倍頻器可選擇1或者2倍頻,時(shí)鐘輸出供定時(shí)器1使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻后送給ADC模塊使用。ADC分頻器可選擇為2、4、6、8分頻。在以上的時(shí)鐘輸出中,有很多是帶使能控制的,例如AHB總線時(shí)鐘、內(nèi)核時(shí)鐘、各種APB1外設(shè)、APB2外設(shè)等等。當(dāng)需要使用某模塊時(shí),記得一定要先使能對應(yīng)的時(shí)鐘。需要注意的是定時(shí)器的倍頻器,當(dāng)APB的分頻為1時(shí),它的倍頻值為1,否則它的倍頻值就為2。連接在APB1(低速外設(shè))上的設(shè)備有:電源接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看門狗、Timer2、Timer3、Timer4。注意USB模塊雖然需要一個(gè)單獨(dú)的48MHz時(shí)鐘信號(hào),但它應(yīng)該不是供USB模塊工作的時(shí)鐘,而只是提供給串行接口引擎(SIE)使用的時(shí)鐘。USB模塊工作的時(shí)鐘應(yīng)該是由APB1提供的。連接在APB2(高速外設(shè))上的設(shè)備有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PAPE)、第二功能IO口。下圖是STM32用戶手冊中的時(shí)鐘系統(tǒng)結(jié)構(gòu)圖,通過該圖可以從總體上掌握STM32的時(shí)鐘系統(tǒng)。 STM32外部中斷之二STM32資料 2009-09-10 21:18 閱讀243 評論0 字號(hào): 大大 中中 小小 STM32 外部中斷配置1配置中斷1、 分配中斷向量表:/* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2、 設(shè)置中斷優(yōu)先級(jí):NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /設(shè)置中斷優(yōu)先級(jí)3、 初始化外部中斷:/*允許EXTI4中斷 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; /中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;/強(qiáng)占優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /次優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /通道中斷使能 NVIC_Init(&NVIC_InitStructure); /初始化中斷注意:如果我們配置的外部針腳為PA4,或PB4,或PC4,PD4等,那么采用的外部中斷也必須是EXTI4,同樣,如果外部中斷針腳是PA1,PB1,PC1,PD1 那么中斷就要用EXTI1,其他類推。2配置GPIO針腳作為外部中斷的觸發(fā)事件 1、 選擇IO針腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;注意,如果的針腳是端口的4號(hào)針腳,配置的中斷一定是EXTI42、 配置針腳為輸入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;3、 初始化針腳GPIO_Init(GPIOD,&GPIO_InitStructure);3配置EXTI線,使中斷線和IO針腳線連接上1、 將EXTI線連接到IO端口上將EXTI線4連接到端口GPIOD的第4個(gè)針腳上 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4); 注意:如果配置的針腳是4號(hào),那么參數(shù)必須是GPIO_PinSource4 如果配置的針腳是3號(hào),那么參數(shù)必須是GPIO_PinSource32、配置中斷邊沿 /*配置EXTI線0上出現(xiàn)下降沿,則產(chǎn)生中斷*/ EXTI_InitStructure.EXTI_Line = EXTI_Line4; 注意:如果配置的4號(hào)針腳,那么EXTI_Line4是必須的 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /下降沿觸發(fā) EXTI_InitStructure.EXTI_LineCmd = ENABLE; /中斷線使能 EXTI_Init(&EXTI_InitStructure); /初始化中斷 EXTI_GenerateSWInterrupt(EXTI_Line4); /EXTI_Line4中斷允許到此中斷配置完成,可以寫中斷處理函數(shù)。舉例:配置函數(shù)/* 函數(shù)名 NVIC_Configration* 描述 配置各個(gè)中斷寄存器* 輸入 無 * 輸出 無* 返回值 無*/void NVIC_Configration(void) NVIC_InitTypeDef NVIC_InitStructure; /#ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); /#else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ /NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /#endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /設(shè)置中斷優(yōu)先級(jí) /*允許EXTI4中斷 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*允許EXTI9中斷*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*配置SysTick處理優(yōu)先級(jí):優(yōu)先級(jí)以及子優(yōu)先級(jí)*/ /* 函數(shù)名 :GPIO_Configuration(void)* 描述 :配置TIM2陣腳* 輸入 :無* 輸出 :無* 返回 :無*/void GPIO_Configuration(void)/* GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); /*配置GPIOD的第一個(gè)管角為浮動(dòng)輸入*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD,&GPIO_InitStructure); /*配置GPIOB的第9個(gè)管腳為浮動(dòng)輸入*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStructure); /* 函數(shù) SysTick_Configuration* 描述 設(shè)置SysTick* 輸入 無* 輸出 無* 返回值 無*/void SysTick_Configuration(void) /*配置 HCLK 時(shí)鐘做為SysTick 時(shí)鐘源*/ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); /系統(tǒng)時(shí)鐘8分頻 72MHz NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 8,2); /*SysTick Interrupt each 1000Hz with HCLK equal to 72MHz*/ SysTick_SetReload(9000);/中斷周期1ms /*Enable the SysTick Interrupt */ SysTick_ITConfig(ENABLE);/打開中斷 SysTick_CounterCmd(SysTick_Counter_Enable); SysTick_CounterCmd(SysTick_Counter_Clear); /* 函數(shù)名 EXTI_Configuration* 描述 配置EXTI線* 輸入 無 * 輸出 無* 返回值 無*/void EXTI_Configuration(void) /*將EXTI線0連接到PA0*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4); /*配置EXTI線0上出現(xiàn)下降沿,則產(chǎn)生中斷*/ EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_GenerateSWInterrupt(EXTI_Line4); /*將EXTI線9連接到PB9上*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9); /*將EXTI線9上出現(xiàn)下降沿產(chǎn)生中斷*/ EXTI_InitStructure.EXTI_Line = EXTI_Line9; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_GenerateSWInterrupt(EXTI_Line9); 中斷函數(shù):void EXTI4_IRQHandler(void) if(EXTI_GetITStatus(EXTI_Line4)!= RESET) EXTI_ClearITPendingBit(EXTI_Line4); if(Ledflag = 0) Ledflag = 1; GPIOC-ODR |= 0X00000080; else Ledflag = 0; GPIOC-ODR &= 0XFFFFFF7F; 注:時(shí)鐘設(shè)置的時(shí)候最好加上這句: RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); / 使能AFIO時(shí)鐘 STM32中定時(shí)器的時(shí)鐘源STM32資料 2009-07-24 21:34 閱讀277 評論0 字號(hào): 大大 中中 小小 STM32中有多達(dá)8個(gè)定時(shí)器,其中TIM1和TIM8是能夠產(chǎn)生三對PWM互補(bǔ)輸出的高級(jí)定時(shí)器,常用于三相電機(jī)的驅(qū)動(dòng),它們的時(shí)鐘由APB2的輸出產(chǎn)生。其它6個(gè)為普通定時(shí)器,時(shí)鐘由APB1的輸出產(chǎn)生。下圖是STM32參考手冊上時(shí)鐘分配圖中,有關(guān)定時(shí)器時(shí)鐘部分的截圖:從圖中可以看出,定時(shí)器的時(shí)鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個(gè)倍頻器,圖中的藍(lán)色部分。下面以定時(shí)器27的時(shí)鐘說明這個(gè)倍頻器的作用:當(dāng)APB1的預(yù)分頻系數(shù)為1時(shí),這個(gè)倍頻器不起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率;當(dāng)APB1的預(yù)分頻系數(shù)為其它數(shù)值(即預(yù)分頻系數(shù)為2、4、8或16)時(shí),這個(gè)倍頻器起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率兩倍。假定AHB=36MHz,因?yàn)锳PB1允許的最大頻率為36MHz,所以APB1的預(yù)分頻系數(shù)可以取任意數(shù)值;當(dāng)預(yù)分頻系數(shù)=1時(shí),APB1=36MHz,TIM27的時(shí)鐘頻率=36MHz(倍頻器不起作用);當(dāng)預(yù)分頻系數(shù)=2時(shí),APB1=18MHz,在倍頻器的作用下,TIM27的時(shí)鐘頻率=36MHz。有人會(huì)問,既然需要TIM27的時(shí)鐘頻率=36MHz,為什么不直接取APB1的預(yù)分頻系數(shù)=1?答案是:APB1不但要為TIM27提供時(shí)鐘,而且還要為其它外設(shè)提供時(shí)鐘;設(shè)置這個(gè)倍頻器可以在保證其它外設(shè)使用較低時(shí)鐘頻率時(shí),TIM27仍能得到較高的時(shí)鐘頻率。再舉個(gè)例子:當(dāng)AHB=72MHz時(shí),APB1的預(yù)分頻系數(shù)必須大于2,因?yàn)锳PB1的最大頻率只能為36MHz。如果APB1的預(yù)分頻系數(shù)=2,則因?yàn)檫@個(gè)倍頻器,TIM27仍然能夠得到72MHz的時(shí)鐘頻率。能夠使用更高的時(shí)鐘頻率,無疑提高了定時(shí)器的分辨率,這也正是設(shè)計(jì)這個(gè)倍頻器的初衷。STM32筆記之外部中斷GPIOSTM32資料 2009-07-14 13:35 閱讀331 評論0 字號(hào): 大大 中中 小小 b) 初始化函數(shù)定義:void EXTI_Configuration(void); /定義IO中斷初始化函數(shù)c) 初始化函數(shù)調(diào)用:EXTI_Configuration();/IO中斷初始化函數(shù)調(diào)用簡單應(yīng)用:d) 初始化函數(shù):void EXTI_Configuration(void) EXTI_InitTypeDef EXTI_InitStructure; /EXTI初始化結(jié)構(gòu)定義EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);/清除中斷標(biāo)志 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);/管腳選擇 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/事件選擇 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;/觸發(fā)模式 EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; /線路選擇 EXTI_InitStructure.EXTI_LineCmd = ENABLE;/啟動(dòng)中斷 EXTI_Init(&EXTI_InitStructure);/初始化e) RCC初始化函數(shù)中開啟I/O時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);GPIO初始化函數(shù)中定義輸入I/O管腳。/IO輸入,GPIOA的4腳輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /上拉輸入 GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化f) 在NVIC的初始化函數(shù)里面增加以下代碼打開相關(guān)中斷: NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; /通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/占先級(jí) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /響應(yīng)級(jí) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /啟動(dòng) NVIC_Init(&NVIC_InitStructure); /初始化g) 在stm32f10x_it.c文件中找到void USART1_IRQHandler函數(shù),在其中添入執(zhí)行代碼。一般最少三個(gè)步驟:先使用if語句判斷是發(fā)生那個(gè)中斷,然后清除中斷標(biāo)志位,最后給字符串賦值,或做其他事情。 if(EXTI_GetITStatus(EXTI_Line3) != RESET) /判斷中斷發(fā)生來源 EXTI_ClearITPendingBit(EXTI_Line3); /清除中斷標(biāo)志 USART_SendData(USART1, 0x41); /發(fā)送字符“a” GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2);/LED發(fā)生明暗交替h) 中斷注意事項(xiàng):中斷發(fā)生后必須清除中斷位,否則會(huì)出現(xiàn)死循環(huán)不斷發(fā)生這個(gè)中斷。然后需要對中斷類型進(jìn)行判斷再執(zhí)行代碼。使用EXTI的I/O中斷,在完成RCC與GPIO硬件設(shè)置之后需要做三件事:初始化EXTI、NVIC開中斷、編寫中斷執(zhí)行代碼。 STM32的USARTSTM32資料 2009-07-14 13:33 閱讀489 評論4 字號(hào): 大大 中中 小小 b) 初始化函數(shù)定義:void USART_Configuration(void); /定義串口初始化函數(shù)c) 初始化函數(shù)調(diào)用:void UART_Configuration(void); /串口初始化函數(shù)調(diào)用初始化代碼:void USART_Configuration(void) /串口初始化函數(shù)/串口參數(shù)初始化 USART_InitTypeDef USART_InitStructure; /串口設(shè)置恢復(fù)默認(rèn)參數(shù)/初始化參數(shù)設(shè)置 USART_InitStructure.USART_BaudRate = 9600; /波特率9600 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /字長8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; /1位停止字節(jié) USART_InitStructure.USART_Parity = USART_Parity_No; /無奇偶校驗(yàn) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/無流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/打開Rx接收和Tx發(fā)送功能 USART_Init(USART1, &USART_InitStructure); /初始化 USART_Cmd(USART1, ENABLE); /啟動(dòng)串口RCC中打開相應(yīng)串口RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);GPIO里面設(shè)定相應(yīng)串口管腳模式/串口1的管腳初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /管腳9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /復(fù)用推挽輸出 GPIO_Init(GPIOA, &GPIO_InitStructure); /TX初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /管腳10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /浮空輸入 GPIO_Init(GPIOA, &GPIO_InitStructure); /RX初始化d) 簡單應(yīng)用:發(fā)送一位字符USART_SendData(USART1, 數(shù)據(jù)); /發(fā)送一位數(shù)據(jù)while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) = RESET) /等待發(fā)送完畢接收一位字符while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) /等待接收完畢變量= (USART_ReceiveData(USART1); /接受一個(gè)字節(jié)發(fā)送一個(gè)字符串 先定義字符串:char rx_data250; 然后在需要發(fā)送的地方添加如下代碼 int i; /定義循環(huán)變量 while(rx_data!=0) /循環(huán)逐字輸出,到結(jié)束字0 USART_SendData(USART1, rx_data); /發(fā)送字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) = RESET) /等待字符發(fā)送完畢 i+; e) USART注意事項(xiàng):發(fā)動(dòng)和接受都需要配合標(biāo)志等待。只能對一個(gè)字節(jié)操作,對字符串等大量數(shù)據(jù)操作需要寫函數(shù)使用串口所需設(shè)置:RCC初始化里面打開RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx);GPIO里面管腳設(shè)定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP); f) printf函數(shù)重定義(不必理解,調(diào)試通過以備后用)(1) 需要c標(biāo)準(zhǔn)函數(shù):#include stdio.h(2) 粘貼函數(shù)定義代碼#define PUTCHAR_PROTOTYPE int _io_putchar(int ch) /定義為putchar應(yīng)用(3) RCC中打開相應(yīng)串口(4) GPIO里面設(shè)定相應(yīng)串口管腳模式(6) 增加為putchar函數(shù)。int putchar(int c) /putchar函數(shù) if (c = n)putchar(r); /將printf的n變成r USART

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論