Thông báo

Collapse
No announcement yet.

STM32 timer

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • STM32 timer

    Chào toàn thể anh em của diễn đàn.
    Mình đang bước đầu tìm hiểu về dòng ARM cotex M3 STM3210D thông qua board OPENCMX-STM3210D. Giờ mình muốn dùng timer 2 để tạo ra ngắt.Cứ mỗi khi ngắt xảy ra thì sẽ làm cho đèn led chớp tắt.Nhưng mình vẫn chưa biết được cách thiết lập để được giá trị timer mong muốn (200ms chẳng hạn ).Cụ thể ở đây là các giá trị cho TIM_Period ,TIM_Prescaler và TIM_ClockDivision.AE ở đây ai có kinh nghiệm về vấn đề này có thể giúp mình được ko.

    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 9999;
    TIM_TimeBaseStructure.TIM_Prescaler = 719;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  • #2
    Board OPENCMX-STM3210D sử dụng chip STM32F103RCT6, thuộc dòng Performance line của ST. Bạn nên đọc kĩ datasheet của con này và tham khảo thêm về thư viện CMSIS và bộ thư viện ngoại vi chuẩn tương thích với CMSIS của ST. Mình sẽ gửi cho bạn link 1 ví dụ sử dụng chip này làm PWM có sử dụng timer 2 biên dịch trên KEIL 4.
    Về cách thiết lập giá trị nạp vào Timer 2 bạn nên đọc kĩ datasheet, nó liên quan tới tốc độ tối đa của dòng performance line là 72MHz, MCU này có 3 bus chính đó là AHB (Advanced High performance Bus) APB1 (Low speed Advanced Peripheral Bus) APB2 (High speed Advanced Peripheral Bus) AHB và APB2 có thể đạt max speed là 72MHz, còn APB1 chỉ đạt tối đa 36MHz, do đó bạn chú ý set clock không được quá 36MHz vì Timer 2 được điều khiển bằng bus APB1.
    Về các giá trị TIM_Period, TIM_Prescaler, TIM_ClockDivision, bạn có thể set như sau để tạo ra tần số Timer 2 là 5Hz (T=200ms)
    Đầu tiên là phải set tần số của bus APB1:
    RCC_PCLK1Config(RCC_HCLK_Div16); /* PCLK1 = fAPB1, RCC_HCKL = 72MHz  fAPB1 = 72/16 = 4.5MHz, HCLK_Div16 biểu thị cho giá trị prescaler là 16. */
    Vì prescaler = 16 !=1 nên TIM2CLK=2*PCLK1 phần clock tree của tài liệu hướng dẫn sử dụng STM32 có nói rõ về điều này.
    Vậy ta có TIM2CLK=2*PCLK1=4.5*2=9MHz.
    Nếu chọn giá trị của TIM_Prescaler là 1800 thì ta sẽ có tần số Timer 2 counter clock là 9MHz/1800=5MHz.
    Giá trị của TIM_Period sẽ được nạp vào thanh ghi TIM2_ARR, với TIM_Period = 999 thì ta có tần số Timer 2 là fTIM2=Timer2 counter clock/(ARR+1) = 5MHz/(999+1) = 5Hz. 5Hz là tần số Timer 2 mà ta cần. Về TIM_ClockDivision mình chưa tìm hiểu nên chưa rõ, mình thấy để bằng 0 vẫn chạy ổn.
    Có thể dùng luôn chế độ Output Compare để điều chế độ rộng xung làm sáng tắt Led.
    Để hiểu rõ hơn mời bạn tải file project ứng dụng được trên board OPENCMX-STM32f10D
    stm32_pwm_demo.rar

    trên đây là những hiểu biết của mình về Timer STM32F103RCT6, vì mới tìm hiểu về ARM nên có thể còn nhiều thiếu sót, mọi người cứ góp ý sửa sai

    Comment


    • #3
      có bác nào biết ở Hà Nội có chỗ nào bán kit demo stm32 ko vậy?e thấy mỗi trang arm.vn bán nhưng tận HCM,

      Comment


      • #4
        bên arm.vn có thể ship ra HN cho bạn, chỉ thêm vài chục ngàn thôi.

        Comment


        • #5
          mình đã mua được rùi, cho mình hỏi code mình làm nháy led thế này, biên dịch và nạp ngon, nhưng đưa ra chân led chẳng thấy j, mình dùng kit stm32f103rdt6 của ...thinhel
          #include "stm32f10x.h"

          GPIO_InitTypeDef GPIO_InitStructure;

          /* Private function prototypes -----------------------------------------------*/
          void Delay(__IO uint32_t nCount);

          int main(void)
          {
          GPIO_InitTypeDef GPIO_InitStructure;

          /*!< At this stage the microcontroller clock setting is already configured,
          this is done through SystemInit() function which is called from startup
          file (startup_stm32f10x_xx.s) before to branch to application main.
          To reconfigure the default setting of SystemInit() function, refer to
          system_stm32f10x.c file
          */

          /* Enable GPIOB clocks */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

          /* Configure PB.1 as output push-pull */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_Init(GPIOB, &GPIO_InitStructure);

          while (1)
          {

          GPIO_SetBits( GPIOB, GPIO_Pin_1);
          /* Insert delay */
          Delay(5);
          GPIO_ResetBits( GPIOB, GPIO_Pin_1);
          /* Insert delay */
          Delay(5);
          }
          }

          /**
          * @brief Inserts a delay time with resolution is 10 milisecond..
          * @param nCount: specifies the delay time length.
          * @retval None
          */
          void Delay(__IO uint32_t num)
          {
          __IO uint32_t index = 0;

          /* default system clock is 72MHz */
          for(index = (720000 * num); index != 0; index--)
          {
          }

          Comment


          • #6
            sử dụng system tick để làm delay, chuẩn nhất!

            Comment

            Về tác giả

            Collapse

            mashima0905 Tìm hiểu thêm về mashima0905

            Bài viết mới nhất

            Collapse

            Đang tải...
            X