牛人的STM32學習筆記(寄存器版本)_第1頁
牛人的STM32學習筆記(寄存器版本)_第2頁
牛人的STM32學習筆記(寄存器版本)_第3頁
牛人的STM32學習筆記(寄存器版本)_第4頁
牛人的STM32學習筆記(寄存器版本)_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 一、GPIO口的配置 STM32的DGPIO口最多可以有7組(GPIOaGPIOg),而每一組GPIO口均有16個雙向IO組成。并且沒個IO口均可配置成8種模式(4種輸入模式,4種輸出模式)。不管配置哪個IO口也不論將其配置成哪種模式(但是配置成哪種模式要看具體應用,參考中文參考手冊第105頁)都可以按以下步驟來進行配置:(1) 使能PORTx(x=AG)時鐘 這里就得操作寄存器RCC_APB2ENR(32為寄存器)了15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPD

2、ENIOPCENIOPBENIOPAEN保留AFIOEN RCC_APB2ENR的015位(0632位保留) 第28分別是使能GPIOAGPIOG時鐘的,只要將其置“1”即可,如RCC_APB2ENR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X;/PD.2推挽輸出;其余IO口的低8位以此類推。3130292827262524CNF151:0MODE151:0CNF141:0MODE141:02322212019181716CNF131:0MODE131:0CNF121:0MODE121:015141312111098CNF111:0MODE111:0CNF101:0MODE

3、101:076543210CNF91:0MODE91:0CNF81:0MODE81:0 GPIOx_CRH(端口配置高寄存器x=AE)該寄存器用于配置GPIOx的高8位,具體8種模式的配置見中文參考手冊例如:GPIOA-CRH&=0XFFFFFFF0;;GPIOA-CRH|=0X;/PA8 推挽輸出;其余IO口的高8位以此類推。(3) 端口的輸入和輸出電平配置15141312111098IDR15IDR14IDR13IDR12IDR11IDR10IDR9IDR876543210IDR7IDR6IDR5IDR4IDR3IDR2IDR1IDR0 GPIOx_IDR(端口輸入數(shù)據(jù)寄存器x=AE)該寄

4、存器配置IO口的015位的輸入數(shù)據(jù),以16位讀出。15141312111098ODR15ODR14ODR13ODR12ODR11ODR10ODR9ODR876543210ODR7ODR6ODR5ODR4ODR3ODR2ODR1ODR0 GPIOx_ODR(端口輸出數(shù)據(jù)寄存器x=AE)該寄存器配置IO口的015位的輸入初始狀態(tài),例如:GPIOA-ODR|=1APB2ENR|=1CRL&=0XFFFFFFF0;/PA0設置成輸入 GPIOA-CRL|=0X; GPIOA-CRH&=0X0F0FFFFF;/PA13,15設置成輸入 GPIOA-CRH|=0X; GPIOA-ODR|=1ODR|=1A

5、PB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0; GPIOA-CRH|=0X;/PA8 推挽輸出 GPIOA-ODR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X;/PD.2推挽輸出GPIOD-ODR|=12; /PD.2輸出高 二、串口通信STM32最多可以提供5路串口,其串口配置主要有以下步驟:(1) 串口時鐘使能15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOEN RCC

6、_APB2ENR的015位(1632位保留)在寄存器RCC_APB2ENR里的第14位就是對串口1的時鐘使能即:RCC_APB2ENR|=114; /使能串口1時鐘 , 那么除串口1的時鐘使能在RCC_APB2ENR外其余的時鐘使能位在寄存器RCC_APB1ENR里,看下表:3130292827262524保留DACENPWRENBKPEN保留CANEN保留2322212019181716USBENI2C2ENI2C1ENUART5ENUART4ENUART3ENUART2EN保留15141312111098SPI3ENSPI2EN保留WWDGEN保留76543210保留TIM7ENTIM6E

7、NTIM5ENTIM4ENTIM3ENTIM2EN RCC_APB1ENR例如:RCC_APB1ENR|=117; /使能串口2時鐘 ,其余串口時鐘使能以此類推。(2) 串口復位即結(jié)束復位STM32在使用串口時不管當前該串口出于什么狀態(tài)都先要將其復位,而復位后要將其結(jié)束復位。串口復位主要在寄存器RCC_APB1RSTR(串口1的復位)和寄存器RCC_APB2RSTR(其余串口復位)這兩個寄存器如下表15141312111098ADC3RSTUSART1RSTTIM8RSTSPI1RSTTIM1RSTADC2RSTADC1RSTIOPGRST76543210IOPFRSTIOPERSTIOPDR

8、STIOPCRSTIOPBRSTIOPARST保留AFIORST RCC_APB2RSTR(APB2外設復位寄存器)寄存器RCC_APB2RSTR的第14位是進行串口1的復位如:RCC_APB1RSTR|=114; /將串口1復位 ,然后結(jié)束復位RCC_APB1RSTR|=(114); /結(jié)束串口1復位其余串口復位在寄存器 RCC_APB1RSTR里如下表:3130292827262524保留DACRSTPWRRSTBKPRST保留CANRST保留2322212019181716USBRSTI2C2RSTI2C1RSTUART5RSTUART4RSTUART3RSTUART2RST保留1514

9、1312111098SPI3RSTSPI2RST保留WWDGRST保留76543210保留TIM7RSTTIM6RSTTIM5RSTTIM4RSTTIM3RSTTIM2TST RCC_APB1RSTR(APB1外設復位寄存器)如: RCC_APB1RSTR|=117; /復位串口2 RCC_APB1RSTR|=(1CR1|=0X200C; /1位停止,無校驗位. 0X200C=0010 0000 0000 1100B設置成使能串口8個字長1個停止位(USART_CR2中13:12默認為“0”)禁止校驗,禁止校驗所有中斷,使能發(fā)送和接收。(5) 數(shù)據(jù)發(fā)送和接收15141312111098保留DR

10、876543210DR7:0 USART_DR(數(shù)據(jù)寄存器) 發(fā)送數(shù)據(jù)緩存寄存器(向它寫數(shù)據(jù)它會自動發(fā)送數(shù)據(jù)),當接收到數(shù)據(jù)時則存放接收的數(shù)據(jù)(6) 串口控制15141312111098保留CTSLBD76543210TXETCRXNELDLEORENEFEPE USART_SR 參考程序: void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*)/(bound*16);/得到USARTDIVmantissa=temp; /得到整數(shù)部分fraction=(temp

11、-mantissa)*16; /得到小數(shù)部分 mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F; GPIOA-CRH|=0XB0;/IO狀態(tài)設置 RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; / 波特率設置 USART1-CR1|=0X200C; /1位停止,無校驗位. #ifdef EN_USART1_RX /如果使能了接收/使能接收中斷USART1-CR1|=1CR1|=1SR&(1DR; if(USART_RX_STA&0x80)=0)/接收未完成if(USART_RX_STA&0x40)/接收到了0x0dif(r

12、es!=0x0a)USART_RX_STA=0;/接收錯誤,重新開始else USART_RX_STA|=0x80;/接收完成了 else /還沒收到0X0Dif(res=0x0d)USART_RX_STA|=0x40;elseUSART_RX_BUFUSART_RX_STA&0X3F=res;USART_RX_STA+;if(USART_RX_STA63)USART_RX_STA=0;/接收數(shù)據(jù)錯誤,重新開始接收 以上兩個函數(shù)已經(jīng)封裝在usart.c中可直接調(diào)用 三、外部中斷STM32的每一個IO口都可以作為中斷輸入,要想把IO口作為中斷輸入則必須將IO口設置成上拉/下拉輸入或浮空輸入(設置

13、成浮空輸入時要接上拉或下拉電阻否則可能導致中斷不斷觸發(fā))。下面總結(jié)一下設置IO口為外部中斷時的步驟:(1) 將IO口設置成輸入模式這個在第一章總結(jié)過,這里不多說。(2)開啟IO口復用時鐘,設置IO口與中斷線的映射關(guān)系這一步在函數(shù)void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 中已經(jīng)封裝好可直接調(diào)用這里說一下IO口的復用時鐘使能:15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFI

14、OEN RCC_APB2ENR RCC_APB2ENR|=0X01; /使能IO口復用時鐘(3)開啟與該IO口相對應的線上中斷/事件,并設置觸發(fā)條件這一步封裝在函數(shù)void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 中,可以直接調(diào)用,例如:Ex_NVIC_Config(GPIO_A,0,RTIR); /設置PA(0)上升沿觸發(fā) Ex_NVIC_Config(GPIO_A,13,FTIR);/設置PA(13)下降沿觸發(fā)(4) 配置中斷分組(NVIC)并使能中斷 這一步封裝在函數(shù)void MY_NVIC_Init(u8 NVIC_PreemptionPrio

15、rity,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 里面可以直接調(diào)用,例如:MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); /搶占2,子優(yōu)先級2,組2這里值得注意的是EXTI0、EXTI1、EXTI2、EXTI3、EXTI4為Line0Line4EXTI15_10為Line15Line10 EXTI9_5為Line9Line5 (5)編寫中斷服務函數(shù)例如: void EXTI15_10_IRQHandler(void) delay_ms(10); /消抖 if(KEY0=0) /按鍵0 LED0=!LED0

16、; else if(KEY1=0)/按鍵1 LED1=!LED1; EXTI-PR=1PR=1APB1ENR|=1APB1ENR|=1APB1ENR|=1APB1ENR|=0X01;/使能TIME2的時鐘使能;(RCC-APB1ENR|=1DIER|=1DIER|=1CR1|=0x01; /使能定時器315141312111098保留CC4OFCC3OFCC2OFCC1OF保留76543210BIFTIFCOMIFCC4IFCC3IFCC2IFCC1IFUIF TIMx_SR該寄存器用來標記當前預定時器相關(guān)的各種事件/中斷是否發(fā)生。UIF:更新中斷標記,當產(chǎn)生更新事件時該位由硬件置1。例如:i

17、f(TIM3-SR&0X0001)/溢出中斷(5) TIM3中斷分組設置例如:MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/搶占1,子優(yōu)先級3,組2直接調(diào)用該函數(shù)就行(6) 編寫中斷服務程序例如:void TIM3_IRQHandler(void) if(TIM3-SR&0X0001)/溢出中斷 LED1=!LED1; TIM3-SR&=(1APB1ENR|=1ARR=arr; /設定計數(shù)器自動重裝值/剛好1ms TIM3-PSC=psc; /預分頻器7200,得到10Khz的計數(shù)時鐘 /這兩個東東要同時設置才可以使用中斷 TIM3-DIER|=1DIER|=1CR

18、1|=0x01; /使能定時器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/搶占1,子優(yōu)先級3,組2TIME2的CH2模式2的PWM輸出:脈沖寬度調(diào)制模式可以產(chǎn)生一個由寄存器TIMx_ARR確定頻率和由寄存器TIMx_CCRx確定其占空比的PWM波形;使能定時器:RCC-APB1ENR|=1CCMR1|=7CCMR1|=111; /使能預裝載寄存器使能自動重裝載的預裝載寄存器:最后還要設置TIMx_CR1寄存器的ARPE位,(在向上計數(shù)或中心對稱模式中)使能自動重裝載的預裝載寄存器;15141312111098保留CKD1:076543210ARPECMS1:0

19、DIR OPMURSUDISCEN TIMx_CR1 TIMx_CR1|=1CCER&=0X03; TIM2-CCMR|=1APB1ENR|=1ARR=arr;/設定計數(shù)器自動重裝值 TIM3-PSC=psc;/預分頻器不分頻 TIM2-CCMR1|=7CCMR1|=1CR1|=1CR1|=1CCER=0X3303; TIM2-CCER|=1APB1ENR|=1CRL&=0X0FFFFFFF;/PA7輸出GPIOA-CRL|=0XB;/復用功能輸出 GPIOA-ODR|=1ARR=arr;/設定計數(shù)器自動重裝值 TIM3-PSC=psc;/預分頻器不分頻TIM3-CCMR1|=7CCMR1|=1CCER|=1CR1=0x8000; /ARPE使能 TIM3-CR1|=0x01; /使能定時器3 其余幾個定時器的PWM輸出寄存器配置依次類推。以下子說明如何在TI1 輸入的上升沿時捕獲計數(shù)器的值到TIM1_CCR1寄存器中,步驟如下:1、 使能TIM1時鐘:15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOEN RCC_APB2ENR的015位(0632位保留) RCC-APB2ENR|=1CCMR=

溫馨提示

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

評論

0/150

提交評論