BÀI 06 : TIMER BASE trong STM32F103.
- Sơ lược về lý thuyết.
- Timer clock.
- Prescaler
- Auto Reload Value.
- FCK_CNT: tần số sau bộ chia.
- fCK_PSC: tần số clock đầu vào cấp cho timer.
- PSC: chính là giá trị truyền vào được lập trình bằng phần mềm
- Ftimer : là giá trị cuối cùng của bài toán, đơn vị là hz.
- F system : 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.
- Cấu hình với thư viện chuẩn của ST.
- Chương trình con cấu hình TIM4 và ngắt tràn:
- Chương trình con thực thi ngắt trong file stm32f10x_it.c:
- Một số thanh ghi quan trọng.
- TIMx_CNT – counter register.
- TIMx_PSC – Prescaler register.
- TIMx_ARR – Auto-reload Register.
- TIMx_SR - Status register.
- CCxOF: vượt quá giá trị compare/capture.
- BIF: báo có ngắt đầu vào xảy ra.
- TIF: báo có ngắt do xung trigger.
- COMIF: báo có ngắt do tác động của COM.
- CCxIF: báo có ngắt do compare/capture.
- UIF: báo có ngắt do có sự cập nhật giá trị của bộ đếm timer.
- TIMx_CRx- Control register.
- CKD[1:0] : bit liên quan đến việc sinh ra thời gian dead-time và bộ lọc số(ở mode ETR,TIx).
- ARPE: có cho phép tự động load lại khi tràn hay không.
- CMS[1:0] : bit cài đặt mode center-aligned, tham khảo thêm trong reference manual.
- DIR : bit điều khiển timer đếm lên hay đếm xuống.
- OPM: bit sử dụng cho chế độ one-pulse.
- URS: bit này cho phép cập nhật bộ đếm timer theo chế độ điều khiển bằng tín hiệu bên ngoài hoặc bộ đếm bị tràn.
- UDIS: bit này cho phép hoặc không cho phép việc cập nhật timer.
- CEN: bit này cho phép hoặc không cho phép bộ đếm hoạt động.
- Bài tập.
- Cấu hình ngắt tràn TIM4 với tần số là 1Hz. Led trên chân PB9 sáng tắt với tốc độ là 1s sáng, 1s tắt. Lặp đi lặp lại quá trình này.
- Cấu hình ngắt tràn TIM1 với tần số là 2Hz. Led trên chân PB9 sáng tắt với tốc độ là 0.5s sáng, 0.5s tắt. Lặp đi lặp lại quá trình này.
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…. Trong đó TIM1 là Timer đặc biệt, chuyên dụng cho việc xuất xung với các mode xuất xung, các mode bảo vệ đầy đủ hơn so với các timer khác. TIM1 thuộc khối clock APB2, còn các TIM2,TIM3,TIM4 thuộc nhóm APB1.
Có 3 vấn đề cần phải tìm hiểu trong bài này đó là :
Khi không có cấu hình gì liên quan đến clock và đã gắn đúng thạch anh ngoài trên chân PD0(5) và PD1(6) thì clock tương ứng của TIM1,TIM2,TIM3,TIM4 đã là 72Mhz. Cần ghi nhớ là sử dụng timer nào thì cấp clock cho timer đó theo đúng nhánh clock.
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. Các giá trị này có thể được thay đổi và điều chỉnh bằng lập trình. Tần số sau bộ chia này sẽ được tính là:
fCK_CNT = fCK_PSC/(PSC+1).
Auto Reload value là giá trị bộ đếm tối đa có thể được điều chỉnh để 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)]
Ngắt timer: khi giá trị đếm của bộ đếm timer(thanh ghi CNT) vượt qua giá trị của Auto Reload Value thì cờ báo tràn sẽ được kích hoạt. Trình phục vụ ngắt tràn sẽ xảy ra nếu được cấu hình cho phép trước đó.
Đầu tiên là khai báo các định nghĩa cũng như cấp clock cho TIM4. 7199 tương ứng với giá trị PSC, 9999 tương ứng với Period. Clock cung cấp cho TIM4 là 72Mhz. Tính theo công thức ta sẽ được thời gian ngắt tràn là 1s. Cấu hình ngắt ở mức ưu tiên cao nhất.
Sau khi nhảy vào ngắt, Led ở chân PB9 sẽ được đảo trạng thái. Cờ báo tràn sẽ được xóa để tránh tình trạng đứng trong ngắt và để phục vụ cho lần ngắt tiếp theo.
Thanh ghi này chứa giá trị của bộ đếm timer. Giá trị tối đa là 65535.
Thanh ghi này chứa giá trị của bộ chia tần số của timer. Giá trị chia tần số phụ thuộc vào giá trị của thanh ghi.
Thanh ghi này chứa giá trị đích của bộ đếm. Giá trị này sẽ được so sánh với giá trị của thanh ghi CNT.
Thanh ghi này chứa các cờ biểu thị các trạng thái của timer.
cho em hỏi cấu hình TIM4 và ngắt trần có thể dùng để ngắt một ký tự được gửi lên máy tính chờ khi máy tính hiện thị trên hercules và truyền ngược lại
ReplyDeleteanh có thể cho em tham khảo chương trình mình gửi ký tự từ máy tính sang stm32 được không ạ
em cảm ơn anh
Mình chưa hiểu ý của bạn lắm. Ý của bạn có phải là "khi tràn TIM4 thì STM32 sẽ gửi 1 kí tự lên máy tính, máy tính nhận được thì gửi ngược lại STM32". Nếu ý của bạn là vậy thì khó, bởi vì khi gửi lên máy tính và hiển thị bằng hercules thì phần mềm hercules sẽ không có chế độ "nhận được cái nào gửi lại cái đó".
DeleteCòn chương trình gửi kí tự từ máy tính sang STM32 thì bạn tham khảo bài 08, Bài tập 1 nhé. Mình sử dụng ngắt UART để nhận kí tự từ máy tính.
Ad ơi cho em hỏi là Timer4 thuộc clock APB1, mà clock APB1 chỉ có tần số tối đa là 36Mhz, thì theo công thức thì thời gian tràn là 2s chứ sao lại là 1s ạ. Em cám ơn !!
ReplyDeleteBạn tìm trong từ khóa "clock tree" - figure 8 trong user manual sẽ thấy là clock tối đa của APB1 là 36Mhz tuy nhiên với các bộ Timer(ở dưới nhánh clock) thì sẽ có hệ số nhân là 1 hoặc 2 nha. Ở đây hệ số được nhân 2 sẽ là 72Mhz nhạ bạn. Cám ơn bạn!!
ReplyDeleteEm cám ơn ạ
DeleteA ơi cho e hỏi là khi chương trình ngắt thực hiện xong thì xóa cờ UIF chứ ạ, tại e thấy cờ UEV sau khi được set thì nó cũng tự reset luôn mà. E xem ở Figure 103 trong quyển Reference manual thì thấy vậy.
ReplyDeleteChào bạn.
DeleteTrong chương trình thực thi ngắt thì mình đã xóa cờ UIF bằng lệnh " TIM_ClearFlag(TIM4, TIM_FLAG_Update); //clear update flag
". Cờ này nằm trong là bit số 0 trong "status register - TIMx_SR".
A ơi e không thể xem được bài 5 nữa
ReplyDeleteMình đã update lại link rồi nha bạn. Cảm ơn bạn đã góp ý.
DeleteNếu em không dùng clock ngoại . Vậy tính theo bài này có được k ạ . Nếu được thì tần số bao nhiêu. Em cảm ơn
ReplyDeleteChào bạn, Nếu bạn không sử dụng thạch anh ngoài và chưa phân chia lại clock hệ thống cũng như chia clock cho bộ TIMER1 sử dụng thì mặc định clock hệ thống = 8Mhz, của bộ timer1 cũng là 8Mhz. Bạn có thể tải STM32CubeMX về, vào phần clock configuration hoặc trong Reference manual của loại MCU đang sử dụng để tham khảo thêm .
Deletea ơi, thế giờ muốn dùng tỉmer để tính thời gian của một thuật toán sắp xếp thì phải lm ntn ạ??? a cho e xin ý tưởng dc k ạ
ReplyDeleteChào bạn, tùy thuộc vào độ chính xác của khoảng thời gian mà bạn muốn đo (us, ms, s) mà bạn cấu hình timer cho phù hợp. Bạn có thể sử dụng lệnh "TIM_SetCounter" để reset counter tại thời điểm bắt đầu muốn đo và "TIM_GetCounter" để lấy giá trị thời gian tại thời điểm kết thúc, sau đó tính toán để ra được thời gian mà bạn mong muốn. Chú ý là kiểm tra cờ tràn của counter trong trường hợp bị tràn để lấy được giá trị thời gian chính xác.
Deletelink download code này là của bài 7 PWM thì phải
ReplyDeleteChào bạn, đúng là mình đã đưa nhầm link. Mình đã cập nhật lại. Cám ơn bạn đã góp ý.
Deleteanh ơi anh cho em hỏi là giới hạn của prescaler là 65535 thì làm thế nào có thể vừa cho ra tần số mong muốn mà vẫn trong khoảng prescaler cho phép vậy ạ
ReplyDelete