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;

LẬP TRÌNH TIMER CHO STM32

  • Upload
    picbmt

  • View
    975

  • Download
    13

Embed Size (px)

Citation preview

Page 1: LẬP TRÌNH TIMER CHO STM32

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

Page 2: LẬP TRÌNH TIMER CHO STM32

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);}

}

Page 3: LẬP TRÌNH TIMER CHO STM32

đầ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.

Page 4: LẬP TRÌNH TIMER CHO STM32

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

Page 5: LẬP TRÌNH TIMER CHO STM32

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 .

Page 6: LẬP TRÌNH TIMER CHO STM32

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

Page 7: LẬP TRÌNH TIMER CHO STM32

#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

Page 8: LẬP TRÌNH TIMER CHO STM32

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; } }}