STM32學(xué)習(xí)筆記(寄存器版本)_第1頁
STM32學(xué)習(xí)筆記(寄存器版本)_第2頁
STM32學(xué)習(xí)筆記(寄存器版本)_第3頁
STM32學(xué)習(xí)筆記(寄存器版本)_第4頁
STM32學(xué)習(xí)筆記(寄存器版本)_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、NR|=1<<2;就是使能 GPIOA 的時鐘;其余 IO 口的始終使能一次類推 。 GPIOx_CRL(x=AG(端口配置低寄存器 x=A E該寄存器用于配置 GPIOx 的低 8位,具體 8種模式的配置見中文參考手冊例如: GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300; /PD.2推挽輸出;其余 IO 口的 GPIOx_CRH(端口配置高寄存器 x=A E該寄存器用于配置 GPIOx 的高 8位,具體 8種模式的配置見中文參考手冊例如: GPIOA->CRH&=0XFFFFFFF0; GPIOA-

3、>CRH|=0X00000003; /PA8 推挽輸出;其余 IO 口 的高 8位以此類推。 GPIOx_IDR(端口輸入數(shù)據(jù)寄存器 x=A E GPIOx_ODR(端口輸出數(shù)據(jù)寄存器 x=A E 該寄存器配置 IO 口的 015位的輸入初始狀態(tài), 例如:GPIOA->ODR|=1<<13; /PA13上拉 輸入一般 GPIO 口配置可仿以下兩個程序:void KEY_Init(voidRCC->APB2ENR|=1<<2; /使能 PORTA 時鐘GPIOA->CRL&=0XFFFFFFF0;/PA0設(shè)置成輸入GPIOA->CRL

4、|=0X00000008;GPIOA->CRH&=0X0F0FFFFF;/PA13,15設(shè)置成輸入GPIOA->CRH|=0X80800000;GPIOA->ODR|=1<<13; /PA13上拉 ,PA0默認(rèn)下拉GPIOA->ODR|=1<<15; /PA15上拉void LED_Init(voidRCC->APB2ENR|=1<<2; /使能 PORTA 時鐘RCC->APB2ENR|=1<<5; /使能 PORTD 時鐘GPIOA->CRH&=0XFFFFFFF0;GPIOA->

5、;CRH|=0X00000003;/PA8 推挽輸出GPIOA->ODR|=1<<8; /PA8 輸出高GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300;/PD.2推挽輸出GPIOD->ODR|=1<<2; /PD.2輸出高二、串口通信STM32最多可以提供 5路串口,其串口配置主要有以下步驟:(1串口時鐘使能 RCC_APB2ENR的 015位(1632位保留在寄存器 RCC_APB2ENR里的第 14位就是對串口 1的時鐘使能即:RCC_APB2ENR|=1<<14; /使能串口

6、1時鐘 , 那么除串口 1的時鐘使能在 RCC_APB2ENR外其余的時鐘使能位在寄存器 RCC_APB1ENR里,看下表: RCC_APB1ENR例如:RCC_APB1ENR|=1<<17; /使能串口 2時鐘 ,其余串口時鐘使能以此類推。(2串口復(fù)位即結(jié)束復(fù)位STM32在使用串口時不管當(dāng)前該串口出于什么狀態(tài)都先要將其復(fù)位,而復(fù)位后要將其 RCC_APB2RSTR(APB2外設(shè)復(fù)位寄存器寄存器 RCC_APB2RSTR的第 14位是進(jìn)行串口 1的復(fù)位如:RCC_APB1RSTR|=1<<14; /將 串口 1復(fù)位 ,然后結(jié)束復(fù)位 RCC_APB1RSTR|=(1<

7、;<14 ; /結(jié)束串口 1復(fù)位其余串口復(fù)位在寄存器 RCC_APB1RSTR里如下表: RCC_APB1RSTR(APB1外設(shè)復(fù)位寄存器如:RCC_APB1RSTR|=1<<17; /復(fù)位串口 2 RCC_APB1RSTR|=(1<<17; / 結(jié)束串 口 2復(fù)位 ,其余串口復(fù)位操作以此類推。 USART_BRR(波特比率寄存器該寄存器的 15-4位:DIV_Mantissa11:0USARTDIV的整數(shù)部分,這 12位定義了 USART 分頻器除法因子 (USARTDIV的整數(shù)部分; 3-0位:DIV_Fraction3:0USARTDIV的 小數(shù)部分,這 4

8、位定義了 USART 分頻器除法因子 (USARTDIV的小數(shù)部分。關(guān)于波特率設(shè) 置在函數(shù)void uart_init(u32 pclk2,u32 bound里已經(jīng)設(shè)置好, 并且封裝在 usart.c 文件里面可以直接調(diào)用。 (4串口控制 USART_CR1(控制寄存器 1該寄存器 3214位保留, 第 13位使能串口 (任何串口在應(yīng)用的時候都必需將其置 “ 1” 第 12位設(shè)置字長,當(dāng)這位為“ 0” 的時候設(shè)置串口位 8個字長外加 n 個停止位, 這 n 個停止 位在寄存器 USART_CR2中第 13:12位來決定。 PCE 為奇偶校驗(yàn)使能位設(shè)置為“ 0”則禁止 校驗(yàn),否則使能校驗(yàn)。 PS

9、 是交驗(yàn)選擇位,設(shè)置為“ 0”則為偶校驗(yàn),否則為奇校驗(yàn)。 PEIE : PE (校驗(yàn)錯誤中斷使能,該位由軟件設(shè)置或清除,定義:0(禁止產(chǎn)生中斷, 1(當(dāng) USART_SR中的 PE 為 1時,產(chǎn)生 USART 中斷 。 TXEIE 發(fā)送緩沖區(qū)空中斷使能,(手 動,定義:0(禁止產(chǎn)生中斷, 1(當(dāng) USART_SR中的 TXE 為 1時,產(chǎn)生 USART 中斷 。 TCIE 發(fā)送完成中斷使能,(手動,定義:0(禁止產(chǎn)生中斷 1(當(dāng) USART_SR中的 TC 為 1時,產(chǎn)生 USART 中斷 。 RXNEIE 接收緩沖區(qū)非空中斷使能,(手動, 定義:0(禁止產(chǎn)生中斷 , 1(當(dāng) USART_SR

10、中的 ORE 或者 RXNE 為 1時,產(chǎn)生 USART 中斷 。 TE 為發(fā)送使能位,設(shè)置為“ 1”將開啟串口的發(fā)送功能。 RE 為接收使能位,用法同 TE 。 USART_CR2(控制寄存器 2如:USART1->CR1|=0X200C; /1位停止 , 無校驗(yàn)位 . 0X200C=0010 0000 0000 1100B 設(shè)置成使能串口 8個字長 1個停止位(USART_CR2中 13:12默認(rèn)為“ 0” 禁止校驗(yàn),禁止 校驗(yàn)所有中斷,使能發(fā)送和接收。 (5數(shù)據(jù)發(fā)送和接收 USART_DR(數(shù)據(jù)寄存器 發(fā)送數(shù)據(jù)緩存寄存器(向它寫數(shù)據(jù)它會自動發(fā)送數(shù)據(jù),當(dāng)接收到數(shù)據(jù)時則存放接收的數(shù)據(jù)

11、(6串口控制 USART_SR 參考程序:void uart_init(u32 pclk2,u32 bound float temp; u16 mantissa; u16 fraction; temp=(float(pclk2*1000000/(bound*16;/得到 USARTDIV mantissa=temp; /得到整數(shù)部分 fraction=(temp-mantissa*16; /得到小數(shù)部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<2; /使能 PORTA 口時鐘 RCC->APB2E

12、NR|=1<<14; /使能串口時鐘 GPIOA->CRH&=0XFFFFF00F; GPIOA->CRH|=0X000008B0;/IO狀態(tài)設(shè)置 RCC->APB2RSTR|=1<<14; /復(fù)位串口 1 RCC->APB2RSTR&=(1<<14;/停止復(fù)位/波特率設(shè)置USART1->BRR=mantissa; / 波特率設(shè)置USART1->CR1|=0X200C; /1位停止 , 無校驗(yàn)位 .#ifdef EN_USART1_RX /如果使能了接收/使能接收中斷USART1->CR1|=1<

13、;<8; /PE中斷使能USART1->CR1|=1<<5; /接收緩沖區(qū)非空中斷使能MY_NVIC_Init(3,3,USART1_IRQChannel,2;/組 2,最低優(yōu)先級 #endifvoid USART1_IRQHandler(voidu8 res;if(USART1->SR&(1<<5/接收到數(shù)據(jù)res=USART1->DR;if(USART_RX_STA&0x80=0/接收未完成if(USART_RX_STA&0x40/接收到了 0x0dif(res!=0x0aUSART_RX_STA=0;/接收錯誤 ,

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

15、拉或下拉電阻否則可能導(dǎo)致中 斷不斷觸發(fā) 。下面總結(jié)一下設(shè)置 IO 口為外部中斷時的步驟:(1將 IO 口設(shè)置成輸入模式這個在第一章總結(jié)過,這里不多說。(2開啟 IO 口復(fù)用時鐘,設(shè)置 IO 口與中斷線的映射關(guān)系這一步在函數(shù) void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM 中已經(jīng)封裝好可直接調(diào)用 這里說一下 IO 口的復(fù)用時鐘使能: RCC_APB2ENRRCC_APB2ENR|=0X01; /使能 IO 口復(fù)用時鐘(3開啟與該 IO 口相對應(yīng)的線上中斷 /事件,并設(shè)置觸發(fā)條件這一步封裝在函數(shù) void Ex_NVIC_Config(u8 GPIOx,u

16、8 BITx,u8 TRIM 中,可以直接調(diào) 用,例如:Ex_NVIC_Config(GPIO_A,0,RTIR; /設(shè)置 PA (0上升沿觸發(fā)Ex_NVIC_Config(GPIO_A,13,FTIR;/設(shè)置 PA (13下降沿觸發(fā)(4配置中斷分組(NVIC 并使能中斷這一步封裝在函數(shù) void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group 里面可以直接調(diào)用,例如:MY_NVIC_Init(2,2,EXTI0_IRQChannel,2; /搶占 2,子優(yōu)先級

17、2,組 2這里值得注意的是 EXTI0、 EXTI1、 EXTI2、 EXTI3、 EXTI4為 Line0Line4EXTI15_10為 Line15Line10 EXTI9_5為 Line9Line5(5編寫中斷服務(wù)函數(shù)例如:void EXTI15_10_IRQHandler(voiddelay_ms(10; /消抖if(KEY0=0 /按鍵 0LED0=!LED0;else if(KEY1=0/按鍵 1LED1=!LED1;EXTI->PR=1<<13; /清除 LINE13上的中斷標(biāo)志位EXTI->PR=1<<15; /清除 LINE15上的中斷標(biāo)志

18、位四、定時計(jì)數(shù)器中斷STM32共有 8個定時計(jì)數(shù)器, 其中 TIME1和 TIME8是高級定時器, TIME2TIME5是 通用定時器, TIME6和 TIME7是基本定時器,這里以 TIME3為例先總結(jié)以下定時計(jì)數(shù)器 的基本用法。定時計(jì)數(shù)器 TIME3中斷的配置步驟:(1 TIME3時鐘使能 RCC_APB1ENR例如:RCC->APB1ENR|=1<<1; /使能 TIME3的時鐘;RCC->APB1ENR|=1<<2; /使能 TIME4的時鐘;RCC->APB1ENR|=1<<3; /使能 TIME5的時鐘;RCC->APB1

19、ENR|=0X01; /使能 TIME2的時鐘使能; (RCC->APB1ENR|=1<<0; 其余的一次類推。 RCC_APB2ENR(2設(shè)置 TIM3_ARR和 TIM3_PSC的值 TIMx_PSC(TIM6和 TIM7預(yù)分頻器 TIMx_DIER 例如:TIM3->DIER|=1<<0;/允許更新中斷 TIM3->DIER|=1<<6; /允許觸發(fā)中斷 (4允許 TIM3工作(使能 TIM3 TIMx_CR1 例如:TIM3->CR1|=0x01; /使能定時器 3TIMx_SR該寄存器用來標(biāo)記當(dāng)前預(yù)定時器相關(guān)的各種事件 /中

20、斷是否發(fā)生。 UIF :更新中斷標(biāo)記,當(dāng)產(chǎn)生更新事件時該位由硬件置 1。 例如:if(TIM3->SR&0X0001/溢出中斷 (5 TIM3中斷分組設(shè)置例如:MY_NVIC_Init(1,3,TIM3_IRQChannel,2;/搶占 1,子優(yōu)先級 3,組 2直接調(diào)用該函數(shù)就行 (6編寫中斷服務(wù)程序例如:void TIM3_IRQHandler(void if(TIM3->SR&0X0001/溢出中斷 LED1=!LED1; TIM3->SR&=(1<<0;/清除中斷標(biāo)志位 參考程序: void Timerx_Init(u16 arr,u

21、16 psc RCC->APB1ENR|=1<<1;/TIM3時鐘使能 TIM3->ARR=arr; /設(shè)定計(jì)數(shù)器自動重裝值 /剛好 1ms TIM3->PSC=psc; /預(yù)分頻器 7200, 得到 10Khz 的計(jì)數(shù)時鐘 /這兩個東東要同時設(shè)置才可以使用中斷 TIM3->DIER|=1<<0; /允許更新中斷 TIM3->DIER|=1<<6; /允許觸發(fā)中斷 TIM3->CR1|=0x01; /使能定時器 3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2;/搶占 1,子優(yōu)先級 3,組 2 TI

22、ME2的 CH2模式 2的 PWM 輸出:脈沖寬度調(diào)制模式可以產(chǎn)生一個由寄存器 TIMx_ARR確定頻率和由寄存器 TIMx_CCRx確定其占空比的 PWM 波形;使能定時器:RCC->APB1ENR|=1<<0; /使能 TIME2的時鐘選擇通道(共 4個通道 :在 TIMx_CCMRx寄存器中的 OCxM 位寫入 110(PWM模式 TIMx_CCMR1(捕獲 /比較模式寄存器 1 TIM2->CCMR1|=7<<12;/選擇 PWM 模式 2使能預(yù)裝載寄存器:必須設(shè)置 TIMx_CCMRx寄存器 OCxPE 位以使能相應(yīng)的預(yù)裝載寄 TIMx_CCMR1

23、(捕獲 /比較模式寄存器 1 TIM2->CCMR1|=1<<11; /使能預(yù)裝載寄存器使能自動重裝載的預(yù)裝載寄存器:最后還要設(shè)置 TIMx_CR1寄存器的 ARPE 位, (在向 上計(jì)數(shù)或中心對稱模式中 使能自動重裝載的預(yù)裝載寄存器; TIMx_CR1TIMx_CR1|=1<<7; /使能自動裝載的預(yù)分頻寄存器設(shè)置極性:OCx 的極性可以通過軟件在 TIMx_CCER寄存器中的 CCxP 位設(shè)置,它可以 TIMx_CCER(捕獲 /比較使能寄存器 TIM2->CCER&=0X03;TIM2->CCMR|=1<<4; / /設(shè)置極性

24、并輸出時能void Timerx2_Init(u16 arr,u16 pscRCC->APB1ENR|=1<<0; /使能 TIME2的時鐘TIM3->ARR=arr;/設(shè)定計(jì)數(shù)器自動重裝值TIM3->PSC=psc;/預(yù)分頻器不分頻TIM2->CCMR1|=7<<12; /選擇 PWM 模式 2TIM2->CCMR1|=1<<11; /使能預(yù)裝載寄存器TIM2->CR1|=1<<7; /使能自動裝載的預(yù)分頻寄存器TIM2->CR1|=1<<0; /使能定時器/ TIM2->CCER=0

25、X3303;TIM2->CCER|=1<<4; /設(shè)置極性并輸出時能比如利用 TIM3的通道 TH3產(chǎn)生 PWM 輸出:void PWM_Init(u16 arr,u16 pscRCC->APB1ENR|=1<<1; /TIM3時鐘使能GPIOA->CRL&=0X0FFFFFFF;/PA7輸出GPIOA->CRL|=0XB0000000;/復(fù)用功能輸出GPIOA->ODR|=1<<7;/PA7上拉TIM3->ARR=arr;/設(shè)定計(jì)數(shù)器自動重裝值TIM3->PSC=psc;/預(yù)分頻器不分頻TIM3->C

26、CMR1|=7<<12; /CH2 PWM2模式TIM3->CCMR1|=1<<11; /CH2預(yù)裝載使能TIM3->CCER|=1<<4; /OC2 輸出使能TIM3->CR1=0x8000; /ARPE使能TIM3->CR1|=0x01; /使能定時器 3其余幾個定時器的 PWM 輸出寄存器配置依次類推。以下 子說明如何在 TI1輸入的上升沿時捕獲計(jì)數(shù)器的值到 TIM1_CCR1寄存器中, 步驟如下:1、使能 TIM1時鐘:RCC_APB2ENR的 015位(0632位保留RCC->APB2ENR|=1<<11;

27、 /使能 TIME1的時鐘2、 選擇有效輸入端 :TIM1_CCMR1必須 . 接到 TI1 輸入,所以寫入 TIM1_CCMR1寄存器中的 CC1S=01,一 旦 CC1S=01不為 00時, 通道被配置為輸入 , 并且 TIM1_CCMR1 寄存器變 . 只讀 。 TIM1_CCMR1(捕獲 /比較模式寄存器 1TIM1->CCMR1=0X01; /CC1通道選擇輸入, IC1映射在 TI1上 3、根據(jù)輸入信號的特點(diǎn),配置輸入濾波器為所需的帶寬(輸入為 TI1時 TIM1_CCMRx寄 存器中的 ICxF 位 。假設(shè)輸入信號在最多 5 個時鐘周期的時間內(nèi)抖動,我們 . 配置濾波器的

28、帶長于 5個時鐘周期。因此我們可以(以 fDTS 頻 連續(xù)采樣 8次,已確認(rèn)在 TI1上一次 真實(shí)的邊沿變換,即在 TIM1_CCMR1寄存器中寫入 IC1F=0011. TIM1_CCMR1(捕獲 /比較模式寄存器 1 TIM1->CCMR1|=3<<4; /TIMx_CCER(捕獲 /比較使能寄存器 TIM1->CCER&=0<<1;5、配置輸入預(yù)分頻器。在本 中,我們希望捕獲發(fā)生在每一個有效的電平轉(zhuǎn)換時刻,因此預(yù)分頻器被禁止 ( TIM1_CCMR1(捕獲 /比較模式寄存器 1 (見第二步TIMx_CCER(捕獲 /比較使能寄存器 TIM1-&

29、gt;CCER|=1<<0;7、 如 果 需 要 , 通 過 . 置 TIM1_DIER 寄 存 器 中 的 CC1IE 位 允 許 相 關(guān) 中 斷 求 , 通 過 置TIMx_DIER(TIM1和 TIM8 DMA/中斷使能寄存器TIM1->DIER|=1<<1;TIM1->DIER|=1<<0;捕獲函數(shù):void Tim1_th1_cap_Init(u16 arr,u16 pscRCC->APB2ENR|=1<<11; /使能 TIME1的時鐘RCC->APB2ENR|=1<<2; /就是使能 GPIOA

30、的時鐘RCC->CHL&=0XFFFFFFF0;RCC->CHL|=0X00000004; /設(shè)置 PA8為浮空輸入TIM1->ARR=arr;TIM1->PSC=psc;TIM1->CCMR1=0X01; /CC1通道選擇輸入, IC1映射在 TI1上 TIM1->CCMR1|=3<<4; /TIM1->CCER&=0<<1; /上升沿觸發(fā)TIM1->CCER|=1<<0; /捕獲使能TIM1->DIER|=1<<1; /允許捕獲中斷TIM1->DIER|=1<&

31、lt;0; /允許更新中斷TIM1->CR1|=1<<0; /使能計(jì)數(shù)器 1MY_NVIC_Init(1,1,TIM1_IRQChannel,2; /搶占 1, 子 1, 組 2 中斷服務(wù)程序:主函數(shù):五、 SPI 總線SPI_CR寄存器的 CPOL 和 CPHA 位,能夠組合成四種可能的時序關(guān)系。 CPOL(時鐘 極性 位控制在沒有數(shù)據(jù)傳輸時時鐘的空閑狀態(tài)電平,此位對主模式和從模式下的設(shè)備都有 效。如果 CPOL 被清 0 , SCK 引腳在空閑狀態(tài)保持低電平;如果 CPOL 被置 1 , SCK 引腳 在空閑狀態(tài)保持高電平。如果 CPHA(時鐘相位 位被置 1 , SCK

32、 時鐘的第二個邊沿 (CPOL位為 0時就是下降沿, CPOL 位為 1 時就是上升沿 進(jìn)行數(shù)據(jù)位的采樣, 數(shù)據(jù)在第二個時鐘邊沿被鎖 。如果 CPHA 位被清 0 , SCK 時鐘的第一邊沿 (CPOL位為 0 時就是下降沿, CPOL 位為 1 時就是上升沿 SPI 配置成主模式:1、使能 SPI 時鐘和 PORTA 時鐘: RCC_APB2ENR的 015位(0632位保留RCC->APB2ENR|=1<<2; /PORTA時鐘使能 RCC->APB2ENR|=1<<12; /SPI1時鐘使能 SPI 控制寄存器 1(SPI_CR1 SPI1->C

33、R1|=0<<10;/全雙工模式 SPI1->CR1|=1<<9; SPI1->CR1|=1<<8; /軟件 nss 管理 SPI 控制寄存器 1(SPI_CR1SPI1->CR1|=1<<2; /SPI主機(jī)SPI1->CR1|=0<<11;/8bit數(shù)據(jù)格式 SPI 控制寄存器 1(SPI_CR1SPI1->CR1|=1<<1; /空閑模式下 SCK 為 1 CPOL=1 SPI1->CR1|=1<<0; /數(shù)據(jù)采樣從第二個時間邊沿開始 ,CPHA=1 SPI 控制寄存器

34、1(SPI_CR1SPI1->CR1|=7<<3; /Fsck=Fcpu/256SPI1->CR1|=0<<7; /MSBfirstSPI 控制寄存器 1(SPI_CR1SPI1->CR1|=1<<6; /SPI設(shè)備使能參考程序:void SPIx_Init(voidRCC->APB2ENR|=1<<2; /PORTA時鐘使能RCC->APB2ENR|=1<<12; /SPI1時鐘使能/這里只針對 SPI 口初始化GPIOA->CRL&=0X000FFFFF;GPIOA->CRL|=0

35、XBBB00000;/PA5.6.7復(fù)用GPIOA->ODR|=0X7<<5; /PA5.6.7上拉SPI1->CR1|=0<<10;/全雙工模式SPI1->CR1|=1<<9; /軟件 nss 管理SPI1->CR1|=1<<8;SPI1->CR1|=1<<2; /SPI主機(jī)SPI1->CR1|=0<<11;/8bit數(shù)據(jù)格式SPI1->CR1|=1<<1; /空閑模式下 SCK 為 1 CPOL=1SPI1->CR1|=1<<0; /數(shù)據(jù)采樣從第二

36、個時間邊沿開始 ,CPHA=1SPI1->CR1|=7<<3; /Fsck=Fcpu/256SPI1->CR1|=0<<7; /MSBfirstSPI1->CR1|=1<<6; /SPI設(shè)備使能SPIx_ReadWriteByte(0xff;/啟動傳輸SPI 讀寫數(shù)據(jù)程序(注意全雙工同時讀寫 :/SPIx讀寫一個字節(jié)/TxData:要寫入的字節(jié)/返回值:讀到的字節(jié)u8 SPIx_ReadWriteByte(u8 Txdatau8 temp=0;while(SPI->SR&1<<1=0/SPI->SR&

37、1<<1(發(fā)送緩沖區(qū)為空 ;(SPI->SR&1<<1=0(發(fā)送緩沖區(qū)為空不成立即 /發(fā)送緩沖區(qū)不為空則一直判斷等待發(fā)送緩沖區(qū)為空(跳出 while 循環(huán) 才發(fā)送數(shù)據(jù)temp+;if(temp>300return 0; /若經(jīng)判斷發(fā)送緩沖區(qū)不為空則返回值“ 0”SPI->DR=Txdata; /若發(fā)送緩沖區(qū)為空則發(fā)送數(shù)據(jù)temp=0;while(SPI->SR&1<<0=0/(SPI->SR&1<<0=0(判斷接收緩沖區(qū)是否為空若為空則接收數(shù)據(jù) temp+;if(temp>300retu

38、rn 0;return SPI->DR;六、 DS18B20溫度傳感器用單片機(jī)控制溫度傳感器 DS18B20進(jìn)行溫度采集主要進(jìn)行一下步驟:(1復(fù)位:首先我們必須對 DS18B20芯片進(jìn)行復(fù)位,復(fù)位就是由控制器 (單片機(jī) 給 DS18B20單總線至少 480uS 的低電平信號。當(dāng) 18B20接到此復(fù)位信號后則會在 1560uS后回發(fā)一個芯片 的存在脈沖。void DS18B20_Rst(voidDS18B20_IO_OUT(; /講 PA0設(shè)置成輸出狀態(tài)DS18B20_DQ_OUT=0; /拉低 DQ (PA0接 DQ delay_us(750; /拉低 750usDS18B20_DQ_O

39、UT=1; / /DQ=1 釋放數(shù)據(jù)線講 DQ 交給 1820 delay_us(15; / /15US(2存在脈沖:在復(fù)位電平結(jié)束之后,控制器應(yīng)該將數(shù)據(jù)單總線拉高,以便于在 1560uS后接收存在脈沖, 存在脈沖為一個 60240uS的低電平信號 。至此,通信雙方已經(jīng)達(dá)成了基 本的協(xié)議,接下來將會是控制器與 18B20間的數(shù)據(jù)通信。如果復(fù)位低電平的時間不足或是單 總線的電路斷路都不會接到存在脈沖,在設(shè)計(jì)時要注意意外情況的處理。u8 DS18B20_Check(void /j檢測 ds18b20是否存在u8 retry=0;DS18B20_IO_IN(;/SET PA0 INPUTwhile

40、(DS18B20_DQ_IN&&retry<200retry+;delay_us(1;if(retry>=200return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240retry+;delay_us(1;if(retry>=240return 1;return 0;(3控制器發(fā)送 ROM 指令:雙方打完了招呼之后最要將進(jìn)行交流了, ROM 指令共有 5條,每 一個工作周期只能發(fā)一條, ROM 指令分別是讀 ROM 數(shù)據(jù)、指定匹配芯片、跳躍 ROM 、芯片搜索 、報警芯片搜索。 ROM 指

41、令為 8位長度,功能是對片內(nèi)的 64位光刻 ROM 進(jìn)行操作。其主要目的 是為了分辨一條總線上掛接的多個器件并作處理。誠然,單總線上可以同時掛接多個器件,并通過每個器件上所獨(dú)有的 ID 號來區(qū)別,一般只掛接單個 18B20芯片時可以跳過 ROM 指令 (注意:此處指的跳過 ROM 指令并非不發(fā)送 ROM 指令,而是用特有的一條“跳過指令” ???制器發(fā)送存儲器操作指令:在 ROM 指令發(fā)送給 18B20之后,緊接著 (不間斷 就是發(fā)送存儲器 操作指令了。操作指令同樣為 8位,共 6條,存儲器操作指令分別是寫 RAM 數(shù)據(jù)、讀 RAM 數(shù)據(jù) 、將 RAM 數(shù)據(jù)復(fù)制到 EEPROM 、溫度轉(zhuǎn)換、將

42、 EEPROM 中的報警值復(fù)制到 RAM 、工作方式切換。 存儲器操作指令的功能是命令 18B20作什么樣的工作,是芯片控制的關(guān)鍵。void DS18B20_Start(void/ ds1820 start convertDS18B20_Rst(;DS18B20_Check(;DS18B20_Write_Byte(0xcc; / skip rom 跳過 ROMDS18B20_Write_Byte(0x44; / convert 溫度轉(zhuǎn)換命令(4執(zhí)行或數(shù)據(jù)讀寫:一個存儲器操作指令結(jié)束后則將進(jìn)行指令執(zhí)行或數(shù)據(jù)的讀寫,這個操 作要視存儲器操作指令而定。如執(zhí)行溫度轉(zhuǎn)換指令則控制器(單片機(jī)必須等待 18

43、B20執(zhí)行 其指令,一般轉(zhuǎn)換時間為 500uS 。如執(zhí)行數(shù)據(jù)讀寫指令則需要嚴(yán)格遵循 18B20的讀寫時序來 操作。數(shù)據(jù)的讀寫方法將有下文有詳細(xì)介紹。若要讀出當(dāng)前的溫度數(shù)據(jù)我們需要執(zhí)行兩次 工作周期,第一個周期為復(fù)位、跳過 ROM 指令、 執(zhí)行溫度轉(zhuǎn)換存儲器操作指令 、等待 500uS 溫度轉(zhuǎn)換時間。緊接著執(zhí)行第二個周期為復(fù)位、跳過 ROM 指令、 執(zhí)行讀 RAM 的存儲器操作指 令 、讀數(shù)據(jù) (最多為 9個字節(jié),中途可停止,只讀簡單溫度值則讀前 2個字節(jié)即可 。其它的 操作流程也大同小異,在此不多介紹。七、內(nèi)部 ADC 轉(zhuǎn)換STM32最多會有三個內(nèi)部 ADC 轉(zhuǎn)換器, 每個轉(zhuǎn)換器均有 18個通

44、道其中 16個外部通道和 2個內(nèi)部通道 (信號源 。 每個 ADC 轉(zhuǎn)換器都有單次、 連續(xù)、 掃描或間斷四種工作模式, ADC 的結(jié)果可以左對齊或右對齊方式存儲在 16位數(shù)據(jù)寄存器中。1、 ADC 開關(guān)控制通過設(shè)置 ADC_CR2寄存器的 ADON 位可給 ADC 上電。(1當(dāng)?shù)谝淮卧O(shè)置 ADON 位時,它將 ADC 從斷電狀態(tài)下喚醒;(2 ADC 上電延遲一段時間后 (tSTAB,再次設(shè)置 ADON 位時開始進(jìn)行轉(zhuǎn)換;(3通過清除 ADON 位可以停止轉(zhuǎn)換,并將 ADC 置于斷電模式。2、 ADC 時鐘控制由時鐘控制器提供的 ADCCLK 時鐘和 PCLK2(APB2時鐘 同步, RCC 控

45、制器為 ADC 時鐘 提供一個專用的可編程預(yù)分頻器。3、通道選擇有 16個多路通道??梢园艳D(zhuǎn)換組織成兩組:規(guī)則組和注入組。在任意多個通道上以任 意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道 3、通道 8、 通道 2、通道 2、通道 0、通道 2、通道 2、通道 15。(1規(guī)則組由多達(dá) 16個轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在 ADC_SQRx寄存器 中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)應(yīng)寫入 ADC_SQR1寄存器的 L3:0位中。(2注入組由多達(dá) 4個轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在 ADC_JSQR寄存器中 選擇。注入組里的轉(zhuǎn)換總數(shù)目應(yīng)寫入 ADC_JSQR寄存器的 L

46、1:0位中。 如果 ADC_SQRx或 ADC_JSQR寄存器在轉(zhuǎn)換期間被更改,當(dāng)前的轉(zhuǎn)換被清除,一個新的啟動脈沖將發(fā)送到 ADC 以轉(zhuǎn)換新選擇的組。先說說利用 ADC1的通道 0的 單次轉(zhuǎn)換模式 下的相關(guān)設(shè)置,這一節(jié)我們使用來進(jìn)行 AD 轉(zhuǎn)換 ,其詳細(xì)設(shè)置步驟如下:1、開啟 PA 口時鐘,設(shè)置 PA0為模擬輸入。這里將 PA0配置為 ADC 的第 0個采樣 通道 ,所以,我們先要使能 PORTA 的時鐘,然后 設(shè)置 PA0為模擬輸入。RCC_APB2ENR|=1<<2; /使能 PORTA 口的時鐘GPIOA->CRL&=0XFFFF0000; /PA0 1 2 3

47、 anolog輸入2、使能 ADC1時鐘,并設(shè)置分頻因子。要使用 要使用 ADC1,第一步就是要使能 ADC1時鐘,在使能完之后進(jìn)行一次 的時鐘 ,在使能完之后進(jìn)行一次 ADC1的 復(fù)位。接著我們就可以通過 RCC_CFGR設(shè)置 ADC1的 分頻因子。分頻因子要確保 ADC1的時鐘(ADCCLK 不要超過 14Mhz 。RCC_APB2ENR的 015位(0632位保留 例如:RCC->APB2ENR|=1<<9; /ADC1時鐘使能同理:RCC->APB2ENR|=1<<10; /ADC2時鐘使能RCC->APB2ENR|=1<<15;

48、/ADC3時鐘使能 RCC_APB2RSTR|=1<<9; /ADC1復(fù)位同理:RCC->APB2ENR|=1<<10; /ADC2復(fù)位RCC->APB2ENR|=1<<15; /ADC3復(fù)位RCC_APB2RSTR|=(1<<9 ; /ADC1結(jié)束復(fù)位同理:RCC->APB2ENR|=(1<<10 ; /ADC2結(jié)束復(fù)位 RCC_CFGRRCC->CFGR&=(3<<14; /分頻因子清零RCC->CFGR|=2<<14; /SYSCLK/DIV2=12M ADC 時 鐘

49、 設(shè) 置 為 12M,ADC 最大時鐘不能超過 14M ,否則將導(dǎo)致 ADC 準(zhǔn)確度下降 !3、設(shè)置 ADC1的工作模式。在設(shè)置完分頻因子之后,我們就可以開始 ADC1的模式配置了,設(shè)置單次轉(zhuǎn)換模式、 觸發(fā)方式選擇、數(shù)據(jù)對齊方式等都在這一步實(shí)現(xiàn)。 ADC_CR1(ADC 控制寄存器 1ADC1->CR1&=0XF0FFFF; /工作模式清零ADC1->CR1|=0<<16; /獨(dú)立工作模式 ADC_CR2(ADC 控制寄存器 2ADC1->CR2&=(1<<1; /單次轉(zhuǎn)換模式ADC1->CR2&=(7<<17;ADC1->CR2|=7<<17; /軟件控制轉(zhuǎn)換ADC1->CR2|=1<<20; /使用用外部觸發(fā) (SWSTART! 必 須 使 用一個事件來觸發(fā)ADC1->CR2&=(1<<11; /右對齊4、設(shè)置 ADC1規(guī)則序列的相關(guān)信息。接下來我們要設(shè)置規(guī)則序列的相關(guān)信息,這里只有一個通道并且是單次轉(zhuǎn)換所以設(shè)置 ADC_SMPR2(ADC 采樣時間寄存器ADC1->SQR1&=(0XF<<20;ADC1->SQR1&=0<<20

溫馨提示

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

評論

0/150

提交評論