Thông báo

Collapse
No announcement yet.

Giới thiệu kit phát triển FRDM-KL46Z, một kit phát triên arm rất đáng để tìm hiểu.

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

  • #31
    Update.
    Fix bug bài trước. Giờ chuyển mode FEI-FEE-FBI thoải mái ko bị lock.

    Link code: https://drive.google.com/file/d/0B0Q...it?usp=sharing

    Thanks

    Comment


    • #32
      Chào bạn Hoasua,

      cảm ơn bạn đã chia sẽ các chế độ Clock của freescale.

      Bạn có thể cho mình 1 vài ứng dụng mà tuơng ứng với chế độ nào được ko hả bạn ?. Nếu được giải thích luôn để cho mọi người sáng tỏ.

      Nguyên văn bởi hoasua_2005 Xem bài viết
      Update.
      Fix bug bài trước. Giờ chuyển mode FEI-FEE-FBI thoải mái ko bị lock.
      Tại sao lại bị lock tại FBI vậy hả Hoasua, theo hình 24 thì từ FBI có thể đi các chế độ khác được mà. Bạn có thể giải thích cho mình hiểu rỏ hơn được ko ?

      Bạn đang sử dụng IDE nào vậy ? mình đang dùng Code warrior của freescale ?Mình đang học trên KL05Z,

      Rất vui khi được bạn chia sẽ.
      Nếu được thì bạn cho mình skype để cùng nhau trao đổi . ( Skype của mình : toinnhatminh)

      Thân chào,
      Minh.

      Comment


      • #33
        Nguyên văn bởi toinhatminh Xem bài viết
        Chào bạn Hoasua,

        cảm ơn bạn đã chia sẽ các chế độ Clock của freescale.

        Bạn có thể cho mình 1 vài ứng dụng mà tuơng ứng với chế độ nào được ko hả bạn ?. Nếu được giải thích luôn để cho mọi người sáng tỏ.


        Tại sao lại bị lock tại FBI vậy hả Hoasua, theo hình 24 thì từ FBI có thể đi các chế độ khác được mà. Bạn có thể giải thích cho mình hiểu rỏ hơn được ko ?

        Bạn đang sử dụng IDE nào vậy ? mình đang dùng Code warrior của freescale ?Mình đang học trên KL05Z,

        Rất vui khi được bạn chia sẽ.
        Nếu được thì bạn cho mình skype để cùng nhau trao đổi . ( Skype của mình : toinnhatminh)

        Thân chào,
        Minh.
        Không phải bị lock ở FBI mà lock ở uart. tại trước dùng clock từ FLL, mỗi lần chuyển mode tần số lại init lại uart. giờ dùng clock MCGIRCLK cố định.
        Mình dùng Keil. code warrior sau này sẽ không còn được hỗ trợ nữa. dần chuyển sang KDS.

        Comment


        • #34
          Nguyên văn bởi hoasua_2005 Xem bài viết
          Không phải bị lock ở FBI mà lock ở uart. tại trước dùng clock từ FLL, mỗi lần chuyển mode tần số lại init lại uart. giờ dùng clock MCGIRCLK cố định.
          Mình dùng Keil. code warrior sau này sẽ không còn được hỗ trợ nữa. dần chuyển sang KDS.
          Theo mình biết UART là module rieng mà bạn, khi nào sữ dụng thì cấu cho phep xung den UART trong SIM module, đâu có liên quan gì đến mode của MCG gì đâu mà khi "chuyển mode tần số lại init UART", mong bạn giúp giải thích cho mình rỏ hơn chổ này.
          Cảm ơn Hoa Sữa.

          Comment


          • #35
            Nguyên văn bởi toinhatminh Xem bài viết
            Theo mình biết UART là module rieng mà bạn, khi nào sữ dụng thì cấu cho phep xung den UART trong SIM module, đâu có liên quan gì đến mode của MCG gì đâu mà khi "chuyển mode tần số lại init UART", mong bạn giúp giải thích cho mình rỏ hơn chổ này.
            Cảm ơn Hoa Sữa.
            Hi. chắc bạn chưa xem kỹ code.
            Mỗi lần chuyển qua lại FEI-FBI-FEE thì MCGOUTCLK thay đổi tần số mà. Nếu không init lại uart theo tần số mới thì baudrate sẽ bị sai.
            Code fix mình dùng MCGIRCLK cho uart nên không bị ảnh hưởng nữa, init ban đầu là đc.

            Thanks

            Comment


            • #36
              Tiếp tục chủ để MCG

              Hãy quay lại hình 24-16. Các mode MCG transistion theo một trình tự nhất định như hình vẽ mô tả, để đến được target mode cần phải theo trình tự đó. Vấn đề đặt ra là chúng ta không thể gọi từng hàm transistion lần lượt một cách thủ công. vd muốn chuyển từ FEI đến PEE cách thủ công:
              Code:
              void FEI_TO_PEE()
              {
                  FEI_FBE();
                  FBE_PBE();
                  PBE_PEE();
              }
              Tất nhiên theo cách thủ công này vẫn đạt được mục đích. Tuy nhiên, mình muốn nói đến một phương pháp khác thuận tiện hơn. Hãy tưởng tượng các mode của MCG giống như các node mạng trong mạng máy tính và nhiệm vụ của chúng ta giống như các thuật toán tìm đường.

              Việc đầu tiên cần làm: lập ma trận các điểm đến:
              Code:
              static const uint8_t MCGTransitionMatrix[8][8] = {
              /* This matrix defines which mode is next in the MCG Mode state diagram in transitioning from the
                 current mode to a target mode
                    FEI            FBI              BLPI            BLPE         FEE             FBE            PBE            PEE
                      0              1                2              3            4               5              6              7
                    */
              {  MCG_MODE_FEI,  MCG_MODE_FBI,  MCG_MODE_FBI,  MCG_MODE_FBE,  MCG_MODE_FEE, MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_FBE}, /* FEI */
              {  MCG_MODE_FEI,  MCG_MODE_FBI,  MCG_MODE_BLPI,  MCG_MODE_FBE, MCG_MODE_FEE,  MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_FBE},/* FBI */
              {  MCG_MODE_FBI,  MCG_MODE_FBI,  MCG_MODE_BLPI,  MCG_MODE_FBI, MCG_MODE_FBI,  MCG_MODE_FBI,  MCG_MODE_FBI,  MCG_MODE_FBI},/* BLPI */
              {  MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_BLPE, MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_PBE,  MCG_MODE_PBE},/* BLPE */
              {  MCG_MODE_FEI,  MCG_MODE_FBI,  MCG_MODE_FBI,   MCG_MODE_FBE, MCG_MODE_FEE,  MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_FBE},/* FEE */
              {  MCG_MODE_FEI,  MCG_MODE_FBI,  MCG_MODE_FBI,  MCG_MODE_BLPE, MCG_MODE_FEE,  MCG_MODE_FBE,  MCG_MODE_PBE,  MCG_MODE_PBE},/* FBE */
              {  MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_BLPE, MCG_MODE_FBE,  MCG_MODE_FBE,  MCG_MODE_PBE,  MCG_MODE_PEE},/* PBE */
              {  MCG_MODE_PBE,  MCG_MODE_PBE,  MCG_MODE_PBE,  MCG_MODE_PBE,  MCG_MODE_PBE,  MCG_MODE_PBE,  MCG_MODE_PBE,  MCG_MODE_PEE} /* PEE */
              };
              Cách lập ma trận này như sau:
              Cột là current mode, hàng là target mode. Giao nhau của cột và hàng là vị trí đầu tiên cần đến. vd: muốn chuyển từ FEI đến PEE thì PBE là mode trung gian cuối cùng cần qua. Điền FBI vào vị trí giao nhau. Tương tự cho các mode khác.

              Đây là hàm tự động chuyển đổi qua lại giữa các mode khá hay và dễ hiểu, parameter là target mode.
              Code:
              static void Cpu_SetMCG(uint8_t TargetMCGMode)
              {
                uint8_t NextMCGMode;
              
                NextMCGMode = Cpu_GetCurrentMCGMode(); /* Identify the currently active MCG mode */
                do {
                  NextMCGMode = MCGTransitionMatrix[NextMCGMode][TargetMCGMode]; /* Get the next MCG mode on the path to the target MCG mode */
                  switch (NextMCGMode) {             /* Set the next MCG mode on the path to the target MCG mode */
                    case MCG_MODE_FEI:
                      MCG_FEI();
                      break;
                    case MCG_MODE_FBI:
                      MCG_FBI();
                      break;
                    case MCG_MODE_BLPI:
                      MCG_BLPI();
                      break;
                    case MCG_MODE_BLPE:
                      MCG_BLPE();
                      break;
                    case MCG_MODE_FBE:
                      MCG_FBE();
                      break;
                    case MCG_MODE_FEE:
                      MCG_FEE();
                      break;
                    case MCG_MODE_PBE:
                      MCG_PBE();
                      break;
                    case MCG_MODE_PEE:
                      MCG_PEE();
                      break;
                    default:
                      break;
                  }
                } while (TargetMCGMode != NextMCGMode); /* Loop until the target MCG mode is set */
              }
              Hàm return vị mode hiện tại.
              Code:
              uint8_t Cpu_GetCurrentMCGMode(void)
              {
                switch (MCG->C1  & MCG_C1_CLKS_MASK) 
                {
                  case  MCG_C1_CLKS(0): // PLL / FLL External
                    if(MCG->C6 & MCG_C6_PLLS_MASK)
                      return MCG_MODE_PEE;
                    else
                    {
                      if(MCG->C1 & MCG_C1_IREFS_MASK)
                          return MCG_MODE_FEI;
                      else
                          return MCG_MODE_FEE;
                    }
              
                  case MCG_C1_CLKS(1): // Internal Clock
                    if ((MCG->C2 & MCG_C2_LP_MASK) == MCG_C2_LP_MASK) 
                    {
                      /* Low power mode is enabled */
                      return MCG_MODE_BLPI;
                    } 
                    else 
                    {
                      /* Low power mode is disabled */
                      return MCG_MODE_FBI;
                    }
              
                  case MCG_C1_CLKS(2): // External Clock
                    if ((MCG->C2 & MCG_C2_LP_MASK) == MCG_C2_LP_MASK) 
                    {
                      /* Low power mode is enabled */
                      return MCG_MODE_BLPE;
                    } 
                    else 
                    {
                        if ((MCG->C6 & MCG_C6_PLLS_MASK) == MCG_C6_PLLS_MASK) 
                        {
                          /* PLL is selected */
                          return MCG_MODE_PBE;
                        } 
                        else 
                        {
                          /* FLL is selected */
                          return MCG_MODE_FBE;
                        }
                    }
                  default:
                    return 0x00U;
                }
              }
              Hàm Cpu_SetMCG, Cpu_GetCurrentMCGModeMCGTransitionMatrix tham khảo trong bsp_cm.c của hệ điều hành mqx dành riêng cho các chip Freescale, mọi người có thể tìm hiểu thêm về MQx ở Freescale MQX™ Software SolutionsMQX - Wikipedia, the free encyclopedia

              Lý thuyết để chuyển qua lại giữa các mode mọi người đọc RM để biết chi tiết nhé.

              Mình sửa lại hàm MCG_FEE chút. MCGOUTCLK = 8MHz, MCGFLLCLK = 20MHz
              Code:
              // switch to FEE 20MHz FLL
              void MCG_FEE(void)
              {
                  MCG->C2 |= MCG_C2_RANGE0(3) |// Very high frequency range selected for the crystal oscillator 
                             MCG_C2_EREFS0_MASK |
                             MCG_C2_HGO0_MASK ; 
                  
                  MCG->C1 &= ~MCG_C1_FRDIV_MASK;
                  MCG->C1 |= MCG_C1_FRDIV(3); // Divide Factor is 256. 8000 / 256 = 31.25kHz
              
                  MCG->C1 &= ~MCG_C1_IREFS_MASK; // External clock (8MHz) for FLL
                  
                  MCG->C4 &= ~MCG_C4_DRST_DRS_MASK;
                  MCG->C4 &= ~MCG_C4_DMX32_MASK;// 31.25 * 640 = 20000kHz
                  
                  MCG->C6 &= ~MCG_C6_PLLS_MASK;// select FLL
                  
                  MCG->C1 &= ~MCG_C1_CLKS_MASK; // Output of FLL is selected for MCGOUTCLK
                  
                  while((MCG->S & MCG_S_OSCINIT0_MASK) == 0); // wait for osc init
                  while((MCG->S & MCG_S_PLLST_MASK) != 0); // wait for FLL
                  while((MCG->S & MCG_S_IREFST_MASK) != 0); // wait for External clock is selected
                  while((MCG->S & MCG_S_CLKST_MASK) != 0); // wait for FLL is selected
              }
              Hàm MCG_FBI MCGOUTCLK = 4MHz
              Code:
              // switch to FBI 4MHz Internal clock
              void MCG_FBI(void)
              {
                  MCG->SC &= ~MCG_SC_FCRDIV_MASK; // Divide Factor is 1
                  
                  MCG->C1 &= ~MCG_C1_CLKS_MASK;
                  MCG->C1 |= MCG_C1_IREFS_MASK |// Enable MCGIRCLK for uart0
                             MCG_C1_IRCLKEN_MASK;
                  
                  MCG->C2 &= ~MCG_C2_LP_MASK;  // FLL or PLL is not disabled in bypass modes
                  MCG->C2 |= MCG_C2_IRCS_MASK; // Fast internal reference clock selected
              
                  MCG->C6 &= ~MCG_C6_PLLS_MASK;
              
                  MCG->C1 |= MCG_C1_CLKS(1);   // Internal reference clock is selected
                  
                  while((MCG->S & MCG_S_IRCST_MASK) == 0);
                  while((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(1)); // wait for Internal clock is selected
              }
              Hàm MCG_FBE MCGOUTCLK = 8MHz
              Code:
              // switch to FBE 8MHz External crystal
              void MCG_FBE(void)
              {
              	  MCG->C6 &= ~MCG_C6_CME0_MASK;
              
                  MCG->C2 |= MCG_C2_RANGE0(3) |// Very high frequency range selected for the crystal oscillator 
                             MCG_C2_EREFS0_MASK |
                             MCG_C2_HGO0_MASK ; 
              
                  MCG->C4 &= ~MCG_C4_DRST_DRS_MASK;
                  MCG->C4 &= ~MCG_C4_DMX32_MASK;
                  MCG->C4 |= MCG_C4_DRST_DRS(1);// 32.768 * 1280 = 41943.04kHz
                  
                  MCG->C6 &= ~MCG_C6_PLLS_MASK;// select FLL
                  
                  MCG->C1 &= ~MCG_C1_CLKS_MASK;
                  MCG->C1 |= MCG_C1_CLKS(2); // Output of FLL is selected for MCGOUTCLK
                  
                  while((MCG->S & MCG_S_OSCINIT0_MASK) == 0); // wait for osc init
                  while((MCG->S & MCG_S_PLLST_MASK) != 0); // wait for FLL
                  while((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2)); // wait for EXTAL is selected
              }
              Hàm MCG_PBE MCGOUTCLK = 8MHz
              Code:
              // switch to PBE 8MHz External crystal
              void MCG_PBE(void)
              {
              	  MCG->C6 &= ~MCG_C6_CME0_MASK;
              
                  MCG->C2 &= ~MCG_C2_LP_MASK;
                  MCG->C2 |= MCG_C2_RANGE0(3) |// Very high frequency range selected for the crystal oscillator 
                             MCG_C2_EREFS0_MASK |
                             MCG_C2_HGO0_MASK ; 
              
                  MCG->C5 &= ~MCG_C5_PRDIV0_MASK;
                  MCG->C5 |= MCG_C5_PRDIV0(4 - 1); // External clock div 4
                  
                  MCG->C6 &= ~MCG_C6_VDIV0_MASK;
                  MCG->C6 |= MCG_C6_VDIV0(24 - 24) | // Mul 24. 8 / 4 * 24 = 48MHz
                             MCG_C6_CME0_MASK |
                             MCG_C6_PLLS_MASK;
              
                  MCG->C1 &= ~MCG_C1_CLKS_MASK;
                  MCG->C1 |= MCG_C1_CLKS(2); // Output of ExTAL is selected for MCGOUTCLK
                  
                  while((MCG->S & MCG_S_OSCINIT0_MASK) == 0); // wait for osc init.
                  while((MCG->S & MCG_S_PLLST_MASK) != MCG_S_PLLST_MASK); // wait for PLL
                  while((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2)); // wait for EXTAL is selected
              }
              Hàm MCG_PEE MCGOUTCLK = 48MHz (Max 96MHz)
              Code:
              // switch to PEE 48MHz PLL
              void MCG_PEE(void)
              {
              	  MCG->C6 &= ~MCG_C6_CME0_MASK;
              
                  MCG->C2 &= ~MCG_C2_LP_MASK;
                  MCG->C2 |= MCG_C2_RANGE0(3) |// Very high frequency range selected for the crystal oscillator 
                             MCG_C2_EREFS0_MASK |
                             MCG_C2_HGO0_MASK ; 
              
                  MCG->C5 &= ~MCG_C5_PRDIV0_MASK;
                  MCG->C5 |= MCG_C5_PRDIV0(4 - 1); // External clock div 4
                  
                  MCG->C6 &= ~MCG_C6_VDIV0_MASK;
                  MCG->C6 |= MCG_C6_VDIV0(24 - 24) | // Mul 24. 8 / 4 * 24 = 48MHz
                             MCG_C6_CME0_MASK |
                             MCG_C6_PLLS_MASK;
              
                  MCG->C1 &= ~MCG_C1_CLKS_MASK; // Output of PLL is selected for MCGOUTCLK
                  
                  while((MCG->S & MCG_S_OSCINIT0_MASK) == 0); // wait for osc init.
                  while((MCG->S & MCG_S_PLLST_MASK) != MCG_S_PLLST_MASK); // wait for PLL
                  while((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(3)); // wait for PLL is selected
              }
              Còn đây là link gói code demo chuyển giữa các mode MCG. Khi chuyển qua các mode khác nhau led đỏ sẽ nháy nhanh chậm khác nhau thể hiện tần số MCGOUTCLK đã thay đổi. https://drive.google.com/file/d/0B0Q...it?usp=sharing

              Thanks
              Last edited by hoasua_2005; 12-06-2014, 23:53. Lý do: Sửa lại cách tạo ma trận chuyển mode

              Comment


              • #37
                Update code chuyển mode BLPI và BLPE

                BLPI
                Code:
                // switch to BLPI MCGOUTCLK = 4MHz Internal clock
                void MCG_BLPI(void)
                {
                    MCG->C6 &= ~MCG_C6_CME0_MASK;
                    MCG->C2 |= MCG_C2_IRCS_MASK; // select slow IRC
                    MCG->C1 &= ~MCG_C1_CLKS_MASK;
                    MCG->C1 |= MCG_C1_CLKS(1);
                    MCG->C2 |= MCG_C2_LP_MASK; // disable FLL/PLL in low power mode
                    while((MCG->S & MCG_S_IRCST_MASK) == 0);
                    while((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(1)); // wait for Internal clock is selected
                }
                BLPE
                Code:
                // switch to BLPE MCGOUTCLK = 8MHz External clock
                void MCG_BLPE(void)
                {
                    MCG->C6 &= ~MCG_C6_CME0_MASK;
                    MCG->C1 &= ~MCG_C1_CLKS_MASK;
                    MCG->C2 |= MCG_C2_RANGE0(3) |// Very high frequency range selected for the crystal oscillator 
                               MCG_C2_EREFS0_MASK |
                               MCG_C2_HGO0_MASK ;
                    MCG->C1 |= MCG_C1_CLKS(2);
                    MCG->C2 |= MCG_C2_LP_MASK; // disable FLL/PLL in low power mode
                    MCG->C6 |= MCG_C6_CME0_MASK; // enable CMEO
                    while((MCG->S & MCG_S_OSCINIT0_MASK) == 0); // wait for osc init.
                    while((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2)); // wait for EXTAL is selected
                }
                Link code DEMO MCG Full: https://drive.google.com/file/d/0B0Q...it?usp=sharing

                Thanks

                Comment


                • #38
                  Tiếp tục chương trình.
                  Hãy quay lại "Figure 5-1. Clocking diagram". MCG done, bài này về SIM nhé. Chi tiết về SIM xem trong Chapter 12: System integration module (SIM).
                  SIM có 3 chức năng chính:
                  - Bộ chia tần
                  - Bộ chọn clock
                  - Enable/disable clock
                  ngoài ra còn config Flash/RAM size và một số config cho các peripheral khác.

                  Chức năng là bộ chia tần thể hiện ở 2 khối OUTDIV1 và OUTDIV4 trên hình 5-1 Clock diagram. Output của OUTDIV1 là System/core clock <= 48MHz. Output của OUTDIV4 là bus/flash clock <= 24MHz.

                  Để set giá trị cho OUTDIV1 và OUTDIV4 thì ghi vào thanh ghi SIM_CLKDIV1 các giá trị OUTDIV1/OUTDIV4 phù hợp. ví dụ
                  Giả sử MCGOUTCLK = 48MHz thì
                  Code:
                      SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) |  // core/system clock = 48 / 1 = 48MHz
                                     SIM_CLKDIV1_OUTDIV4(1);             // flash/bus clock = 48 / 2 = 24MHz
                  
                  có thể viết như sau để dễ tính toán khi xem lại code
                      SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(1 - 1) |  // core/system clock = 48 / 1 = 48MHz
                                     SIM_CLKDIV1_OUTDIV4(2 - 1);             // flash/bus clock = 48 / 2 = 24MHz
                  Chức năng là bộ chọn clock chỉ hỗ trợ một số peripheral: UART0, USB, TPM. ví dụ đối với module UART0:
                  Nguồn clock cho UART0 có thể có:
                  - MCGFLLCLK clock or MCGPLLCLK/2 clock
                  - OSCERCLK clock
                  - MCGIRCLK clock

                  Xem thanh ghi SIM_SOPT2 Để chọn nguồn clock cho UART0. ví dụ chọn MCGIRCLK là clock cho UART0 thì làm như sau:
                  Code:
                  SIM->SOPT2 |= SIM_SOPT2_UART0SRC(3);
                  dòng code này nghĩa là bit 26 và 27 của thanh ghi SIM_SOPT2 có giá trị bằng 1.

                  Chức năng Enable/disable clock hỗ trợ tất cả các peripheral. Sau khi reset chip, tất cả các clock cho peripheral đều Disable. Dùng module nào phải Enable clock cho module đó.
                  ví dụ Enable GPIOA:
                  Code:
                  SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK
                  Set bit 9 của thanh ghi SIM_SCGC5 lên 1
                  Disable GPIOA
                  Code:
                  SIM->SCGC5 &= ~SIM_SCGC5_PORTA_MASK
                  Clear bit 9 của thanh ghi SIM_SCGC5 về 0
                  Thanks

                  Comment


                  • #39
                    Chào bạn Hoa sữa,

                    Bạn co thể viết bài chia sẽ cho mình về DMA của freescale được ko ah ? Thank nhiều
                    Minh

                    Comment


                    • #40
                      Click image for larger version

Name:	error.PNG
Views:	1
Size:	145.9 KB
ID:	1396603
                      Mình gặp lỗi này khi tạo project là sao nhi?

                      Comment


                      • #41
                        Hi em.
                        Lỗi đó anh nghĩ Debugger đang ở mode "MSD Flash Programmer", để download và debug được thì phải chuyển sang "OpenSDA Application".
                        Tài liệu để chuyển mode cho debugger: http://cache.freescale.com/files/32b...geType=product
                        Focus vào chương 2.

                        Thanks & Regard.

                        Comment


                        • #42
                          Vâng đúng là em đang để chế độ MSD Flash Programmer! Em cảm ơn a nhé! Để em thử làm lại!

                          Comment


                          • #43
                            Em đã chuyển sang chế độ "Open SDA Application" nhưng vẫn bị cái lỗi đó anh ah

                            Comment


                            • #44
                              Nguyên văn bởi nghianq93 Xem bài viết
                              Em đã chuyển sang chế độ "Open SDA Application" nhưng vẫn bị cái lỗi đó anh ah
                              nếu đã chuyển qua OpenSDA Application và download thành công các example trong "kinetis_kl46_sc" thì lỗi do project của em sai ở đâu đó. kiểm tra lại project option theo hướng dẫn anh post ở trên xem sao. hoặc có thể lấy example https://docs.google.com/file/d/0B0Qi...S0E/edit?pli=1 về build rồi debug xem đc ko?

                              Comment


                              • #45
                                Như vậy tạm ok phần MCG.
                                Hôm nay tiếp phần GPIO cho cơ bản nhé. [MENTION=52834]toinhatminh[/MENTION], DMA là phần nâng cao rùi, cao nhân nào cần dùng đến module đó chắc cũng đủ khả năng để tự đọc RM rùi.

                                Cần quan tâm "Chapter 11: Port Control and Interrupts (PORT)", "Chapter 42: General-Purpose Input/Output (GPIO)", "10.3.1 KL46 Signal Multiplexing and Pin Assignments", phần này cho biết mỗi pin có những chức năng gì (có thể dùng cho các module nào).
                                ví dụ PTE0 có 7 chức năng:
                                - LCD_P48
                                - PTE0
                                - SPI1_MISO
                                - UART1_TX
                                - RTC_CLKOUT
                                - CMP0_OUT
                                - I2C1_SDA

                                Phần này tương đối đơn giản, đọc code các bạn hiểu ngay
                                Hàm khởi tạo
                                Code:
                                void gpio_init(PORT_Type * port_address, GPIO_Type * gpio_address, uint32_t pin)
                                {
                                    port_address->PCR[pin] |= PORT_PCR_MUX(1);// Alternative 1 (GPIO)
                                    gpio_address->PSOR = GPIO_PSOR_PTSO(1<<pin);// Set PIN 1 logic 1
                                    gpio_address->PDDR = GPIO_PDDR_PDD(1<<pin);// set pin output
                                }
                                Hàm toggle pin
                                Code:
                                void gpio_pin_toggle(GPIO_Type * gpio_address, uint32_t pin)
                                {
                                    if(pin > 32)
                                        gpio_address->PTOR |= GPIO_PSOR_PTSO_MASK;// toggle all pin
                                    else
                                        gpio_address->PTOR |= GPIO_PSOR_PTSO(1 << pin);// toggle specified pin
                                }
                                Hàm set pin
                                Code:
                                void gpio_pin_set(GPIO_Type * gpio_address, uint32_t pin)
                                {
                                    if(pin > 32)
                                        gpio_address->PSOR |= GPIO_PSOR_PTSO_MASK;// set all pin
                                    else
                                        gpio_address->PSOR |= GPIO_PSOR_PTSO(1 << pin);// set specified pin
                                }
                                Hàm clear pin
                                Code:
                                void gpio_pin_clear(GPIO_Type * gpio_address, uint32_t pin)
                                {
                                    if(pin > 32)
                                        gpio_address->PCOR |= GPIO_PSOR_PTSO_MASK;// clear all pin
                                    else
                                        gpio_address->PCOR |= GPIO_PCOR_PTCO(1 << pin);// clear specified pin
                                }
                                Example code: https://drive.google.com/file/d/0B0Q...it?usp=sharing Project này mình tạo trên Keil 5, chưa test với Keil 4

                                Thanks & Regard.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X