Upload
picbmt
View
975
Download
13
Embed Size (px)
Citation preview
LẬP TRÌNH TIMER CHO STM32
Chế độ TIMER BASE
Bước 1: Cấu hình cho TIMER (vd TIMER 3)
void TIMER3_Configuration(void){
uint16_t Prescalervalue = 0;
/* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Compute the prescaler value */Prescalervalue = (uint16_t)(SystemCoreClock/10000 - 1); //10KHz
/* Time base configuration */TIM_TimeBaseInitStructure.TIM_Prescaler = 0;TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100-1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
/* Prescaler configuration */TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);
/* TIM enable counter */TIM_Cmd(TIM3, ENABLE);
/* Clear TIM3 update pending flags */TIM_ClearFlag(TIM3, TIM_FLAG_Update);
/* Enable TIM3 Update interrupts */TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
}
Bước 2: Cấu hình ngắt NVIC cho TIMERvoid NVIC_Configuration(void){
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);}
Bước 3: Thực thi ngắt TIMER
void TIM3_IRQHandler(void){
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){
/* Clear TIM3 Capture compare interrupt pending bit */TIM_ClearITPendingBit(TIM3, TIM_IT_Trigger);
//code here
TIM_ClearFlag(TIM3,TIM_FLAG_Update);}
}
đầu tiên chúng ta tìm hiểu về timer của stm32f051r8t6 trên KIT.chức năng các timer :- timer 1,2,3,14,15,16,17 dùng cho các mục đích : counter, PWM, input capture, compare.- riêng timer6 dùng cho chức năng counter.
cấu trúc chung trừ timer6.- các timer có 4 đầu capture/compare.- có đầu ra dạng PWM hoặc compare được điều khiển bởi timer.
trong bài hướng dẫn này mình sẽ hướng dẫn cách sử dụng TIM6, cấu trúc cơ bản của timer6.- lấy xung clock từ "internal clock" - xung nội từ bộ dao động của chip.- xung nhịp có thể chia qua bộ PSC Prescaler.- giá trị counter được lưu trong thanh ghi "CNT COUNTER"- đầu ra khi đếm tràn sẽ làm cho UIF (cờ báo ngắt) của timer6 =1- khi sử dụng ngắt phải cho UI =1
khi xả ra ngắt:- UIF=1, nếu có thiết lập ngắt thì chip sẽ thực hiện hàm ngắt.
mình sử dụng timer6 để đảo mức logic pc8,pc9 trong mỗi 500ms.- giá trị counter= 50000uS- bộ chia tần Prescaler = 480 với xung nhịp của chip 48Mhz.freq = 48Mhz/480=0.1Mhz, T=10us .
hoặc Prescaler = SystemCoreClock/100000-1- giá trị counter 50000 sẽ tràn sau : 50000*10us = 500000us = 0.5s
các file C cần add:- stm32f0xx_tim.c - xử lý timer- stm32f0xx_misc.c - xử lí phần ngắt của timer- stm32f0xx_gpio.c - xử lý phần GPIO- stm32f0xx_rcc - xử lý clock
#include <stm32f0xx.h>#include <stm32f0xx_tim.h>unsigned char dem;
void gpio_setup(void) { // khai bao GPIO_InitStructure = GPIO_InitTypeDef // 2 cach viet la nhu nhau GPIO_InitTypeDef GPIO_InitStructure;
/* cap xung cho PC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
/* cau hinh PC9 and PC8 la dau ra, khong dung tro keo */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;// dung PC9,PC8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // che do uotput GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // reset pin khi uotput GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // clock 50Mhz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // khong dung tro keo
GPIO_Init(GPIOC, &GPIO_InitStructure); // khoi tao PC}
void timer_setup(void) { TIM_TimeBaseInitTypeDef timInit; NVIC_InitTypeDef NVIC_InitStructure;
//cau hinh tim6 //dau tien enable clock toi tim6 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
//delay 500ms timInit.TIM_Period = 50000 - 1; timInit.TIM_Prescaler = 48 * 10 - 1; //0.1MHz TIM_TimeBaseInit(TIM6, &timInit);
//khoi tao xong TIM_Cmd(TIM6, ENABLE);
//khoi tao ngat NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM6->DIER = 1; //cho phep ngat}
int main(void) { gpio_setup(); timer_setup(); while (1) { }}// hàm ngat timer6
void TIM6_DAC_IRQHandler(void) { if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM6, TIM_IT_Update); if (dem == 0) { //pc9,pc8 =1
GPIO_SetBits(GPIOC, GPIO_Pin_9 | GPIO_Pin_8); dem = 1; } else if (dem == 1) { // pc9,pc8 =0 GPIO_ResetBits(GPIOC, GPIO_Pin_9 | GPIO_Pin_8); dem = 0; } }}