定时器中断实验
通用定時器
?
APB1默認為36M,36*2=72M,
計數器是0~65535
?
兩個AHB/APB橋在AHB和2個APB總線間提供同步連接。 APB1操作速度限于36MHz, APB2操
作于全速(最高72MHz)。
注意: 當對APB寄存器進行8位或者16位訪問時,該訪問會被自動轉換成32位的訪問:橋會自動將8位
或者32位的數據擴展以配合32位的向量。
程序存儲器、數據存儲器、寄存器和輸入輸出端口被組織在同一個4GB的線性地址空間內。
下面的例子說明如何映射別名區中SRAM地址為0x20000300的字節中的位2:16進制的計算
0x22006008 = 0x22000000 + (0x300× 32) + (2× 4).
對0x22006008地址的寫操作與對SRAM中地址0x20000300字節的位2執行讀-改-寫操作有著相
同的效果
128 256? 512 1024
一個輸入通道可以給兩個捕獲通道
?時鐘分頻是設置采樣濾波的
重復計數器是高級定時器需要設置的
分頻系數會自動加一,為36000,不能超過65535
500ms=1000*36000/72M
讀取狀態標志位以及清除中斷標志位,函數分別為TIM_GetFlagStatus和TIM_ClearFlag
?time.c
?
#include "time.h"
#include "led.h"
?
void TIM4_Init(u16 pre,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//結構體初始化
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//定時器預分頻器
TIM_TimeBaseInitStructure.TIM_Period=pre; //定時器周期
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//技術模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //時鐘分頻
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除標志
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占式優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //響應優先級,0到3選擇
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷通道
NVIC_Init(&NVIC_InitStructure);
?
TIM_Cmd(TIM4,ENABLE);
}
?
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==1)
{
led2=!led2;
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除標志
}
?
?總結:1.TIM4初始化函數,定義變量
? ? ? ? ? ? 2.TIM和NVIC結構體初始化
? ? ? ? ? ? 3.使能TIM4時鐘,掛接在APB1上
? ? ? ? ? ? 4.定時器預分頻器,周期,技術模式,時鐘分頻,初始變量及結構地址
? ? ? ? ? ?5.TIM_ITConfig,清除標志
? ? ? ? ? ?6.NVIC的設置,?TIM_Cmd(TIM4,ENABLE);
? ? ? ? ? ?7.TIM4_IRQHandler函數,if語句判斷狀態if(TIM_GetITStatus(TIM4,TIM_IT_Update)==1)
? ? ? ? ? ?8.清除標志,TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
?
?time.h
#ifndef _time_H
#define _time_H
#include "system.h"
void TIM4_Init(u16 pre,u16 psc);
#endif
總結:注意包含頭文件#include "system.h",初始化函數
?
main.c
?
#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "time.h"
?
int main()
{
u8 i=0;
SysTick_Init(72);//72M
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();//初始化
TIM4_Init(1000,36000-1);//500ms定時器時間
while(1) //可以檢測是否死機
{
i++;
if(i%20==0)
{
led1=!led1; //led1不斷閃爍
}
delay_ms(10);
}
}
?
?
?
?
轉載于:https://www.cnblogs.com/296389183yy/p/9370730.html
總結
- 上一篇: .Net微信开发之通过UnionID机制
- 下一篇: Xshell相关优化