You are on page 1of 8

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 TIMER
void 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

TIM_FLAG_Update). TIM_IT_Update) == SET) { /* Clear TIM3 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM3.void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3. //code here TIM_ClearFlag(TIM3. } } . TIM_IT_Trigger).

có đầu ra dạng PWM hoặc compare được điều khiển bởi timer.2.3. compare.14. cấu trúc chung trừ timer6.16.riêng timer6 dùng cho chức năng counter. PWM. input capture.17 dùng cho các mục đích : counter. .các timer có 4 đầu capture/compare. chức năng các timer : .timer 1. . .15. .đầu tiên chúng ta tìm hiểu về timer của stm32f051r8t6 trên KIT.

xung nội từ bộ dao động của chip.lấy xung clock từ "internal clock" .khi sử dụng ngắt phải cho UI =1 .đầu ra khi đếm tràn sẽ làm cho UIF (cờ báo ngắt) của timer6 =1 .giá trị counter được lưu trong thanh ghi "CNT COUNTER" .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.xung nhịp có thể chia qua bộ PSC Prescaler. . .

.khi xả ra ngắt: . nếu có thiết lập ngắt thì chip sẽ thực hiện hàm ngắt.pc9 trong mỗi 500ms.giá trị counter= 50000uS .UIF=1. mình sử dụng timer6 để đảo mức logic pc8.

xử lý phần GPIO . T=10us . hoặc Prescaler = SystemCoreClock/100000-1 .stm32f0xx_tim.stm32f0xx_gpio.xử lí phần ngắt của timer .xử lý clock .5s các file C cần add: .xử lý timer .c . freq = 48Mhz/480=0.c .1Mhz.bộ chia tần Prescaler = 480 với xung nhịp của chip 48Mhz.giá trị counter 50000 sẽ tràn sau : 50000*10us = 500000us = 0.c .stm32f0xx_rcc ..stm32f0xx_misc.

khong dung tro keo */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL. &GPIO_InitStructure).PC8 GPIO_InitStructure. // che do uotput GPIO_InitStructure. NVIC_InitStructure. NVIC_InitStructure.GPIO_OType = GPIO_OType_PP.1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8.#include <stm32f0xx.1MHz TIM_TimeBaseInit(TIM6. ENABLE). // reset pin khi uotput GPIO_InitStructure.TIM_Prescaler = 48 * 10 .NVIC_IRQChannelPriority = 1. void gpio_setup(void) { // khai bao GPIO_InitStructure = GPIO_InitTypeDef // 2 cach viet la nhu nhau GPIO_InitTypeDef GPIO_InitStructure. if (dem == 0) { //pc9. while (1) { } } // hàm ngat timer6 void TIM6_DAC_IRQHandler(void) { if (TIM_GetITStatus(TIM6. TIM6->DIER = 1. //cau hinh tim6 //dau tien enable clock toi tim6 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6. //khoi tao xong TIM_Cmd(TIM6. timInit.GPIO_Mode = GPIO_Mode_OUT.h> unsigned char dem. &timInit).// dung PC9. /* cau hinh PC9 and PC8 la dau ra. //khoi tao ngat NVIC_InitStructure. // khoi tao PC } void timer_setup(void) { TIM_TimeBaseInitTypeDef timInit. NVIC_InitTypeDef NVIC_InitStructure. /* cap xung cho PC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC. //delay 500ms timInit.1.pc8 =1 . TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM6. NVIC_Init(&NVIC_InitStructure).NVIC_IRQChannelCmd = ENABLE. ENABLE). timer_setup(). // khong dung tro keo GPIO_Init(GPIOC. //cho phep ngat } int main(void) { gpio_setup().GPIO_Speed = GPIO_Speed_50MHz. ENABLE). //0.TIM_Period = 50000 . // clock 50Mhz GPIO_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn.h> #include <stm32f0xx_tim. TIM_IT_Update).

} } } . dem = 0. GPIO_SetBits(GPIOC. GPIO_Pin_9 | GPIO_Pin_8).pc8 =0 GPIO_ResetBits(GPIOC. dem = 1. } else if (dem == 1) { // pc9. GPIO_Pin_9 | GPIO_Pin_8).