Lập trình Timer STM32F746

0
1083

Khái niệm cơ bản về Timer

Timer là một phần cứng đặc biệt bên trong nhiều bộ vi điều khiển. Chức năng của nó rất đơn giản: đếm (lên hoặc xuống, tùy thuộc vào cấu hình – chúng ta sẽ giả định ngay bây giờ). Ví dụ: một bộ định thời 8 bit sẽ đếm từ 0 đến 255. Hầu hết các bộ định thời sẽ reset lại giá trị ban đầu khi chúng đạt đến giá trị tối đa. Vì vậy, Timer 32 bit sẽ bắt đầu lại từ 0 khi nó đạt đến 2^32.

Bạn có thể áp dụng nhiều cài đặt khác nhau cho hầu hết các bộ hẹn giờ để thay đổi cách chúng hoạt động. Các cài đặt này thường được áp dụng thông qua các thanh ghi chức năng đặc biệt khác bên trong vi điều khiển. Ví dụ: thay vì đếm tối đa là 2^32, bạn có thể cho Timer biết rằng bạn muốn Timer đếm đến 1000. Ngoài ra, bạn thường có thể kết nối phần cứng hoặc thiết bị ngoại vi khác bên trong bộ vi điều khiển với Timer, chẳng hạn như tự động chuyển đổi một pin cụ thể khi bộ hẹn giờ kết thúc.

Dưới đây là một số chức năng phần cứng phổ biến của Timer:

•           So sánh đầu ra (OC): chuyển đổi một chân khi bộ đếm thời gian đạt đến một giá trị nhất định

•           Chụp đầu vào (IC): đo số lần đếm của Timer giữa các sự kiện trên một pin vi điều khiển

•           Điều chế độ rộng xung (PWM): đảo trạng thái một pin khi Timer đạt đến một giá trị nhất định.

Prescaler

Timer chạy nhanh như thế nào? Điều đó phụ thuộc vào tốc độ bạn yêu cầu chúng chạy. Tất cả các bộ Timer đều yêu cầu một loại đồng hồ nào đó. Hầu hết sẽ được kết nối với xung nhịp CPU chính của vi điều khiển (những loại khác, như đồng hồ thời gian thực, có nguồn xung nhịp riêng). Một Timer sẽ đánh dấu (tăng dần một) mỗi khi nó nhận được một xung Clock.

Nội dung Project:

Hướng dẫn tạo hàm Delay 1µs sử dụng Timer6.

Cấu hình trên STM32CubeMX

Bước 1: Mở STM32CubeMX và tạo dự án mới

Bước 2: Gõ tên tìm kiếm loại MCU cần lập trình và click đúp vào tên của nó

Bước 3: Cấu hình chế độ Debug cho chip là Serial Wire

Bước 4: Trong tab Clock Configuration, cấu hình tần số hoạt động cho chip là 216Mhz (max)

Bước 5: Cấu hình cho chân PB6 là GPIO output để đo xung ra

Bước 6: Cấu hình Timer6

Trong mục Timers chọn TIM6, do clock cấp cho TIM6 là từ bus APB1 là 108Mhz nên để tạo 1 bộ đếm 1µS, chọn hệ số chia đầu vào là 6 => timer chạy ở 18Mhz nên ta có:

Ttimer = 1/ 18.10^6 (s)

=>1µS =10^-6/Ttimer =18.

Trong mục Counter Period để là 17 vì Timer cần 1 chu kỳ để Reset lại bộ đếm.

Bước 7: Trong tab Project Manager, đặt tên cho Project, chọn đường dẫn lưu thư mục, chọn trình biên dịch là Keilc (MDK-ARM) và chọn phiên bản sử dụng

Bước 8: Trong mục Code Generator tích chọn Generate peripheral initialization.. Sau đó tiến hành GENERATE CODE.

Dưới đây là nội dung hàm main sau khi GENERATE CODE từ STM32CubeMX, gọi hàm HAL_TIM_Base_Start_IT(&htim6); để cho phép ngắt Timer6.

int main(void)

{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration——————————————————–*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */

  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_TIM6_Init();

  /* USER CODE BEGIN 2 */

            HAL_TIM_Base_Start_IT(&htim6); //khoi dong timer va cho phep ngat

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

Nội dung chương trình ngắt được viết trong hàm void HAL_TIM_PeriodElapsedCallback

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

            if(htim->Instance==htim6.Instance) HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_6);

}

Trong cây thư mục Project, click đúp vào file stm32f7xx_it.c, đây là file chứa tất cả các chương trình ngắt của STM, tìm đến hàm xử lý ngắt trên TIM6 và gọi hàm void TIM6_DAC_IRQHandler

void EXTI0_IRQHandler(void)

{

  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */

  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

  /* USER CODE BEGIN EXTI0_IRQn 1 */

  /* USER CODE END EXTI0_IRQn 1 */

}

Sau khi hoàn thiện code, nhấn F7 hoặc click vào biểu tượng như hình dưới để biên dịch chương trình

Kết nối các chân trên header JTAG của KIT và mạch nạp ST-link V2 tương ứng như hình dưới

* Các chân nạp code cho STM32 của St-Link:

[1] 3.3V

[2] GND

[3] SWDIO

[4] SWCLK

nối tương ứng các chân này với các chân tương ứng trên KIT STM32F746I

Trước khi nạp chương trình cho KIT qua mạch nạp ST-LINK V2, chúng ta cần cấu hình một số chức năng. Thực hiện các bước như hình dưới để vào giao diện cài đặt mạch nạp.

Sau khi nhấn Setting, cửa sổ cấu hình mạch nạp hiện ra, Trong SW Device, ID CODE hiện ra có nghĩa mạch nạp đã kết nối với KIT thành công, chúng ta cấu hình tốc độ nạp ở mục Max Clock là tần số cao nhất, ở như hình là 4Mhz, Tick vào các mục Verify Code Download để Verify lại chương trình sau khi nạp và Tick vào Download to Flash để nạp chương trình vào bộ nhớ Flash chip.

Trong tab Flash Download tích chọn Reset and Run để chương trình chạy ngay sau khi nạp code xong, sau đó click OK để kết thúc cài đặt.

Click vào biểu tượng LOAD để tiến hành nạp code cho chip.

Chúc các bạn thành công!

Biên dịch: Mai Văn Ba

Để cập nhật tin tức công nghệ mới nhất và các sản phẩm của công ty AIoT JSC, vui lòng truy cập link: http://aiots.vn hoặc linhkienaiot.com

0 0 Phiếu bầu
Article Rating
Subscribe
Notify of
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả các bình luận