久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM32學(xué)習(xí)之GPIO與SYSTICK使用+軟件仿真

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年05月05日   【字體:

小弟也是剛剛學(xué)習(xí)STM32,有什么不懂的還望大師們指點(diǎn)。

以下程序是利用SYSTICK作為延時(shí)程序使GPIOA_Pin0產(chǎn)生1S的電壓變化。初學(xué),也就會(huì)這些了,拿出來(lái)與大家分享一下。

#include"stm32f10x_conf.h"
void delay_ms(u32 ms);   聲明延時(shí)函數(shù)
void GPIO_Config(void);   聲明GPIO配置函數(shù)
int main(void)   主程序
{
   SystemInit();    初始化系統(tǒng)時(shí)鐘默認(rèn)72MHZ
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    使能GPIOA時(shí)鐘
   GPIO_Config();    調(diào)用GPIO配置函數(shù)
   while(1)
 {
     GPIO_SetBits(GPIOA,GPIO_Pin_0); GPIOA的 Pin0腳置1(高電平)
    delay_ms(1000);  延時(shí)1000ms=1s
    GPIO_ResetBits(GPIOA,GPIO_Pin_0);GPIOA的 Pin0腳置0(低電平)
    delay_ms(1000);  延時(shí)1000ms=1s

 }
 


}
void GPIO_Config(void)  配置GPIOA函數(shù)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
 
}

void delay_ms(u32  ms) 延時(shí)函數(shù),重點(diǎn)!
{
        int temp;
        SysTick->CTRL=0x01;
        SysTick->LOAD=9000*ms;
        SysTick->VAL=0x00;
 do
 {
 temp=SysTick->CTRL;
 }
  while((temp&0x01)&&(!(temp&(1<<16))));
 
}

下面我把延時(shí)函數(shù)系統(tǒng)講一下:

延時(shí)函數(shù)主要用到的是systick,也叫滴答系統(tǒng)時(shí)鐘。我只知道systick其中的一個(gè)功能就是可以做定時(shí)器用而且非常精準(zhǔn),其他的許多功能還在研究。

systick的4個(gè)寄存器,CTRL-控制寄存器,LOAD-重裝載寄存器,VAL-當(dāng)前值寄存器,CALIB-校準(zhǔn)寄存器。

SYSTICK_CTRL 寄存器中只有0,1,2,16這四位是有效的。

第 0 位:ENABLE,Systick 使能位 (0:關(guān)閉 Systick 功能;1:開啟 Systick功能)
第 1 位:TICKINT,Systick 中斷使能位 (0:關(guān)閉 Systick 中斷;1:開啟Systick 中斷)
第 2 位:CLKSOURCE,Systick 時(shí)鐘源選擇 (0:使用 HCLK/8 作為 Systick時(shí)鐘;1:使用 HCLK 作為 Systick 時(shí)鐘)
第 16 位:COUNTFLAG,有些人這樣說(shuō)的: SysTick 已經(jīng)數(shù)到了 0,則該位為 1。如果讀取該位,該位將自動(dòng)清零(我不太理解這句話,我的疑問(wèn)是SYSTICK數(shù)到了0是不是說(shuō)VAL寄存器從重裝載值遞減到了0,第二個(gè)就是SYSTICK數(shù)到0之后這個(gè)位是保持1還是返回到0,讀取該位自動(dòng)清0是什么時(shí)候讀取。)這個(gè)先埋個(gè)疑問(wèn)一會(huì)說(shuō)說(shuō)我的理解。

SYSTICK_LOAD 重裝載寄存器,不用多說(shuō),假如你讓systick_val寄存器從100遞減到0,這個(gè)寄存器里面裝的就是100,只不過(guò)用二進(jìn)制表示,但是這個(gè)寄存器雖然是32位的,但只有24位有效,其最高的八位保留,它能裝入最大值為0xFFFFFF(0xFFFFFF==0x00FFFFFF,C語(yǔ)言中二者的值是一樣的,如0x01==0x0001==0x00000001)。

SYSTICK_CAL  當(dāng)前值寄存器,書上說(shuō)讀取它時(shí)返回當(dāng)前寄存器的值,對(duì)他進(jìn)行寫操作則清0,同時(shí)也對(duì)上面所說(shuō)SYSTICK_CTRL中 第16位清0。我理解是這樣的,這個(gè)寄存器里面的值是不斷變化的,一個(gè)指令周期完成一次自減,至于如何自減我們無(wú)須討論太多,只需知道若選擇1KHZ的頻 率,則它在1秒的時(shí)間里可以變化1000次,每變化一次便可自減一次,換句話說(shuō),我們將1000裝入它時(shí)開始計(jì)時(shí),逐步遞減999,998......到 它減到0計(jì)時(shí)結(jié)束剛好耗時(shí)1秒。

SYSTICK_CALIB  校準(zhǔn)寄存器,這個(gè)還沒(méi)研究透(都說(shuō)一般用不到,但最終還得弄明白它),sorry!

那么SYSTICK 的工作流程到底是怎樣實(shí)現(xiàn)定時(shí)的呢,下面以定時(shí)1ms為例。

1s=1000ms=1000000us,首先 

配置SysTick->CTRL=0x01;對(duì)照上面便知,先使能SYSTICK,關(guān)閉了中斷,選擇HCLK/8位工作頻率,狀態(tài)標(biāo)志位清零;然后SysTick->LOAD=9000*ms;設(shè)置重裝載寄存器的值,我們的系統(tǒng)時(shí)鐘是72MHZ,上面我們選擇的8分頻也就是9MHZ,也就是說(shuō)1ms變化9000次,然后SysTick->VAL=0x00;清 零當(dāng)前寄存器值,前面我們說(shuō)了,VAL寄存器是不斷自減的,并且只要它為0(無(wú)論是被寫入0還是自減到0)就自動(dòng)裝入LOAD寄存器中的值再一次開始遞 減,這樣循環(huán)往復(fù),那么VAL為0時(shí)的第二個(gè)動(dòng)作是將CTAL寄存器的16位狀態(tài)位置1,而我們就是通過(guò)讀取CTAL寄存器的16位狀態(tài)位才能知道是否到 了1ms,這里也說(shuō)一下上面埋下的疑問(wèn),這個(gè)狀態(tài)位其實(shí)像一個(gè)監(jiān)視器一樣監(jiān)視著VAL寄存器,只要VAL為0,它立刻置1,并且一直保持,直到對(duì)它讀取時(shí) 它才又一次被清0。

緊接著判斷1ms是否達(dá)到,do{...}while(...)語(yǔ)句,主要判斷CTRL寄存器中的16位是否為1,temp=SysTick->CTRL;將CTRL中的值傳遞給變量temp,注意while中的是重點(diǎn), while((temp&0x01)&&(!(temp&(1<<16))));說(shuō) 實(shí)話我看到這個(gè)語(yǔ)句真的不知道什么意思,C語(yǔ)言學(xué)的還不算透徹,這里面其實(shí)不只是判斷CTRL中的標(biāo)志位,還判斷了systick是否失能,如果 systick失能則在此處為0繼續(xù)執(zhí)行程序不再進(jìn)行判斷。先整體看看這個(gè)語(yǔ)句的結(jié)構(gòu),語(yǔ)句1&&語(yǔ)句2,這個(gè)“&&” 表示邏輯與操作和按位與“&”相似,是有順序執(zhí)行的,先判斷語(yǔ)句1,如果是真則判斷語(yǔ)句2,語(yǔ)句2為真則結(jié)果為真(1),語(yǔ)句2為假則結(jié)果為假 (0);若語(yǔ)句1為假,則不再對(duì)語(yǔ)句2進(jìn)行判斷,直接輸出為假(0)。那么如上,語(yǔ)句1(temp&0x01)是判斷systick是使能還是失 能,若使能則語(yǔ)句1為真繼續(xù)判斷語(yǔ)句2,若失能則語(yǔ)句1為假,則整個(gè)語(yǔ)句為假程序向下執(zhí)行,不再循環(huán)。既然語(yǔ)句1為真則繼續(xù)判斷語(yǔ)句2(!(temp&(1<<16)),它才是真正判斷CTRL標(biāo)志位的,這個(gè)應(yīng)該很好理解,如果CTRL標(biāo)志位為1,則語(yǔ)句2為假(0),則整個(gè)語(yǔ)句為假(0),向下執(zhí)行程序(systick正好產(chǎn)生了1ms的時(shí)間間隔)。

 

這么點(diǎn)程序,其實(shí)要說(shuō)的可真不少,ARM真的太深?yuàn)W了。以上這種方式是對(duì)寄存器直接操作,也可用stm32 提供的SYSTICK函數(shù),不過(guò)我感覺(jué)想弄懂它是怎么工作的還是要學(xué)習(xí)它相關(guān)的寄存器。函數(shù)庫(kù)只是為了方便開發(fā),在開發(fā)大程序是有一定的優(yōu)勢(shì)。好了最后看一下我的軟仿圖吧:

 


關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 激情一区二区三区 | 久久成人综合 | 色999视频 | 成人在线激情 | 国产日韩欧美一区 | 国产精品久久亚洲 | 亚洲免费一区二区 | 欧洲一区二区三区 | 91人人在线 | 亚洲一区视频在线 | av午夜电影 | 人人插人人 | 久久69精品久久久久久久电影好 | 99热这里有精品 | 在线视频久久 | 草草视频在线观看 | 亚州毛片 | 国产一区二区三区 | 欧美高清性xxxxhdvideosex | 一二三四在线视频观看社区 | 亚洲一区二区三区在线 | 国产成人精品福利 | 青青草av在线播放 | 成人毛片视频在线播放 | 国产在线精品一区 | 亚洲国产成人在线观看 | 中文字幕乱码一区二区三区 | 91亚洲国产成人久久精品网站 | 日韩国产中文字幕 | 中国一级特黄毛片大片 | 美女拍拍拍网站 | 亚洲美女网站 | 日韩精品在线观看网站 | 亚洲福利电影网 | 日干夜操 | 国产精品免费看 | 亚洲精品日韩一区二区电影 | 久久久久久亚洲精品 | 国产成人精品久久 | 色一情一乱一伦一区二区三区 | 亚洲欧美激情网 |