|
在配置STM32外設(shè)的時(shí)候,任何時(shí)候都要先使能該外設(shè)的時(shí)鐘!
第一個(gè)例程,首先,考慮一個(gè)延時(shí)程序,要實(shí)現(xiàn)這一功能,共四步步驟(實(shí)際使用中兩步就夠了,第一步任何例程都必須做,):
Stm32_Clock_Init(9); //系統(tǒng)時(shí)鐘設(shè)置,系統(tǒng)時(shí)鐘設(shè)置為9倍頻,即8Mhz*9=72Mhz
delay_init(72); //延時(shí)初始化,按總線時(shí)鐘72Mhz延時(shí)
//LED_Init(); //初始化與LED連接的硬件接口,這個(gè)不算第三步,使用它以便演示流水燈
delay_ms(300);
第一步,看第一個(gè)程序:
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //復(fù)位并配置向量表
RCC->CR|=0x00010000; //外部高速時(shí)鐘使能HSEON
while(!(RCC->CR>>17));//等待外部時(shí)鐘就緒
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2個(gè)單位
RCC->CFGR|=PLL<<18; //設(shè)置PLL值 2~16
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x32; //FLASH 2個(gè)延時(shí)周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));//等待PLL鎖定
RCC->CFGR|=0x00000002;//PLL作為系統(tǒng)時(shí)鐘
while(temp!=0x02) //等待PLL作為系統(tǒng)時(shí)鐘設(shè)置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
第二步,延時(shí)功能初始化,看第二個(gè)程序
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,選擇外部時(shí)鐘 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
第三部,調(diào)用延時(shí)程序:
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//時(shí)間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計(jì)數(shù)器
SysTick->CTRL=0x01 ; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá),先將
SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
//延時(shí)nus
//nus為要延時(shí)的us數(shù).
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時(shí)間加載
SysTick->VAL=0x00; //清空計(jì)數(shù)器
SysTick->CTRL=0x01 ; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)
SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
------------------------------------
不得不說,《21天學(xué)通ARM嵌入式開發(fā)》是一本不折不扣的爛書,只是把官方手冊照搬上去,再把庫函數(shù)加些注釋就變成一本書了,誰買誰上當(dāng),視頻教程也沒什么技術(shù)含量可言,千萬不要買這本書。
STM32的定時(shí)器功能比單片機(jī)復(fù)雜,切不可照搬,首先給出一些基本定義:
ARR:auto reload register:自動重載寄存器,ARR也有定時(shí)器重載值的含義,STM32中的定時(shí)器是自動重載的,(不像單片機(jī)中的定時(shí)器有自動重載模式和手動軟件重載模式,而且手動重載用得較多);
TIMx_CR:定時(shí)器控制寄存器;
更新事件:更新不等于觸發(fā)中斷,更新是指計(jì)數(shù)器上溢或下溢時(shí),內(nèi)部產(chǎn)生一個(gè)更新信號,根據(jù)此時(shí)相關(guān)寄存器的設(shè)置執(zhí)行一些相應(yīng)操作,比如重載ARR,具體在下文中會介紹。
觸發(fā)事件:主要用于信號計(jì)數(shù),可以使內(nèi)部信號(定時(shí)器的輸出也可以作為觸發(fā)信號),也可以是外部引腳信號
接下來關(guān)注下面寄存器TIMx_CR中的兩個(gè)位
ARPE:自動重裝載預(yù)裝載允許位
TIMx_CR中的UDIS:update disable 禁止更新
ARPE為0時(shí),若改變ARR值,影子寄存器中的值立即被改變;ARPE=1時(shí),影子寄存器中的值將等到計(jì)數(shù)值到達(dá)上一次設(shè)定的溢出值(即發(fā)生更新事件后)時(shí),才會裝載被修改過的ARR值;
UDIS:禁止更新,1有效
產(chǎn)生更新事件的條件:
①當(dāng)計(jì)數(shù)器上溢或下溢時(shí),并觸發(fā)中斷;
②當(dāng)循環(huán)計(jì)數(shù)器計(jì)數(shù)值為0時(shí)(僅適用于TIM1),觸發(fā)中斷;
③通過軟件設(shè)置UG(Update Generation)位,這種情況下不會觸發(fā)定時(shí)中斷。
|
|