Bài 05: Lập trình Timer với STM32F1

posted in: Vi điều khiển | 0

1. Giới thiệu về Timer

Timer là một ngoại vi được tích hợp ở hầu hết các dòng vi điều khiển, cung cấp cho người dùng nhiều ứng dụng hữu ích như xác định chính xác một khoảng thời gian, đo – đếm xung đầu vào, điều khiển dạng sóng đầu ra, băm xung PWM,…

STM32f103C8 có tất cả 7 timer nhưng trong đó đã bao gồm 1 systick timer, 2 watchdog timer. Vậy chỉ còn lại 4 timer dùng cho các chức năng như ngắt, timer base, PWM, Encoder, Input capture…. كازينو عربي bao gồm:

  • Timer 1: Là bộ Advanced – control Timer hay là bộ Timer điều khiển nâng cao, có nhiều chức năng nhất
  • 3 bộ Timer chung là Timer 2,3,4 Có chức năng tương tự nhau và độc lập với nhau

Trong bài này chúng ta sẽ cấu hình Timer 2 chế độ Time-base unit để thay đổi trạng thái led trên Board Blue Pill.

Mô tả chức năng này như sau:

– Chế độ Timer-Base unit là chế độ chính của Timer bao gồm các chế độ đếm: lên, xuống hoặc cả lên lên và xuống

– Xung Clock được chia bởi bộ chia tần Prescaler để lấy thời gian thích hợp đếm 1 lần

– Các thanh ghi quản lý bao gồm:

  • Counter Register (TIMx_CNT):lưu giá trị đếm
  • Prescaler Register (TIMx_PSC): lưu giá trị chia từ tần số cơ sở cấp cho Timer để tạo ra tần số thích hợp
  • Auto-Reload Registor(TIMx_ARR): lưu giá trị đích đếm lên hoặc đếm xuống

– Thanh ghi Auto-Reload sẽ được nạp trước khi Timer hoạt động, và có thể nạp trong khi Timer hoạt động, trước khi một sự kiện cập nhật sảy ra (UEV).

– Chế độ đếm sẽ được hoạt động khi Bit CEN của thanh ghi TIMx_CR1 được bật

Prescaler là bộ chia tần số của timer. Bộ chia này có giá trị tối đa là 16 bit tương ứng với giá trị là 65535.

Auto Reload value là giá trị bộ đếm để nạp vào cho timer. Giá trị bộ đếm này được cài đặt tối đa là 16bit tương ứng với giá trị là 65535. Từ các thông số trên ta rút ra công thức cần tính cuối cùng đó là:

fTIMER= fsystem/[(PSC+1)(Period+1)]
  • Ftimer : là giá trị cuối cùng của bài toán, đơn vị là hz.
  • fsystem : tần số clock hệ thống được chia cho timer sử dụng, đơn vị là hz.
  • PSC : giá trị nạp vào cho bộ chia tần số của timer. Tối đa là 65535.
  • Period : giá trị bộ đếm nạp vào cho timer. Tối đa là 65535.




2. Lập trình với thư viện chuẩn của ST

Trong bài này, chúng ta sẽ dùng timer 2 đế nhấp nháy Led với chu kỳ 500ms

  • Chương trình cấu hình Timer 2 và ngắt tràn
void TIM2_Configuraion(void)
{
  /* khai bao bien*/
  TIM_TimeBaseInitTypeDef		TIM_TimeBaseStructure;
  TIM_OCInitTypeDef			TIM_OCInitStructure; 
   NVIC_InitTypeDef                     NVIC_InitStructure;
 /*Cap clock cho time 2*/
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 /* cau hinh timer base */
  TIM_TimeBaseStructure.TIM_Prescaler = 7199;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 4999;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_ClearFlag(TIM2,TIM_FLAG_Update);
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
 /* cho phep TIM2 hoat dong */
  TIM_Cmd(TIM2, ENABLE);
 /* Cau hình ngat NVIC */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

PSC = 7199, Period = 4999, clock cung cấp cho TIMER 2 là 72Mhz. Tính theo công thức ta sẽ được thời gian ngắt tràn là 500ms.

  • Chương trình cấu hình GPIO
void GPIO_configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 		
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	    		
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;			//LED0-->PC. طريقة المراهنات في كرة القدم 13 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 
  GPIO_Init(GPIOC, &GPIO_InitStructure);	
  GPIO_ResetBits( GPIOC, GPIO_Pin_13);
}
  • Chương trình phục vụ ngắt trong file stm32f10x_it.c
void TIM2_IRQHandler(void)
{

	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
	{
		if(ledstatus == 0)
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, 1);
                        ledstatus = 1;
		}
		else
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, 0);
                        ledstatus = 0;
		}

                 /* Xoa co tran */
		TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	}
}
  • Chương trình trong hàm main
int main(void)
{
  GPIO_configuration();
  TIM2_Configuraion();
  while (1)
  {
  }
}

Link code mẫu

Trả lời

Email của bạn sẽ không được hiển thị công khai.