toilet

Chia sẻ - STM32_Study: #01-LED module

Thảo luận trong 'Họ ARM'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. Đăng 28/6/14 #1

    dungvt VIP

    Số bài viết: 571
    Đã được thích: 888
    Lâu rồi mình chưa viết bài nào, hôm bữa có ad hỏi nhờ viết bài về STM32's I2C nên nhận tiện mình lục lại và sắp xếp lại những bài tập mình đã học khi bắt đầu với STM32F103RCT6 và sử dụng thư viện của ST. Mình không viết lại từ đầu nữa vì trong diễn đàn có nhiều bạn đã viết, các bạn search thì ra rất nhiều, thay vào đó mình sắp xếp và hệ thống theo dạng module (hoặc drivers). Viết theo dạng này có cái lợi là tính kế thừa dự án, và rất dễ sử dụng, khi dùng chỉ cần add file vào; và nếu có thay đổi IO thì chỉ cần mở file .h ra configure lại mà thôi.

    Lấy ví dụ sau: Có 4 led nối lần lượt vào PA0, PA1, PA2, PA3. Viết chương trình khi bật nguồn thì
    · LED1, LED3 sáng
    · LED2, LED4 tắt
    P3.


    Ở ví dụ này ta sử dụng chức năng GPIO của STM32:
    1. GPIO (General purpose input/outputs) là thuật ngữ rất phổ biến khi làm việc với VDK. Ta biết mỗi pin của VDK có rất nhiều chức năng và tùy theo cách configure mà mỗi pin sẽ làm một và chỉ một chức năng chuyên biệt.
    Với 89xx hay AVR thì là ta có PORTA.0, PORTA.1 ... (chân số 0 của PORTA; chân số 1 của PORTA), còn với STM32F103RCT6 thì PORTA tương ứng GPIOA, chân số 0 tương ứng GPIO_Pin_0
    P2.

    Như vậy muốn sử dụng GPIO, chúng ta phải khai báo (configure và mở bus tương ứng). Cách khai báo và sử dụng như sau:
    P4.


    2. LED module
    LED module sử dụng GPIO của STM32, LED module gồm 2 file LED.c và LED.h

    P1.
    • LED.h chứa khai báo các pin mà ta sẽ kết nối với LED, và các macro cho phép các module khác, kể cả hàm main.c sử dụng nó.
    Mã:
    #define LED1_ON    GPIO_ResetBits(GPIO_LED1, LED1)
    ...
    
    • LED.c chứa hàm khai báo GPIO, configure 4 pin PA0, PA1, PA2, PA3 là output:
    Mã:
    void LED_Configuration(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;
    
      /*   LED1  */         
      RCC_APB2PeriphClockCmd(RCC_LED1 , ENABLE);            
      GPIO_InitStructure.GPIO_Pin = LED1;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIO_LED1, &GPIO_InitStructure);
    
      /*   LED2  */           
      RCC_APB2PeriphClockCmd(RCC_LED2 , ENABLE);            
      GPIO_InitStructure.GPIO_Pin = LED2;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIO_LED2, &GPIO_InitStructure);
    
      /*   LED3  */         
      RCC_APB2PeriphClockCmd(RCC_LED3 , ENABLE);            
      GPIO_InitStructure.GPIO_Pin = LED3;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIO_LED3, &GPIO_InitStructure);
     
       /*   LED4  */           
      RCC_APB2PeriphClockCmd(RCC_LED4 , ENABLE);            
      GPIO_InitStructure.GPIO_Pin = LED4;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIO_LED4, &GPIO_InitStructure);
    }
    
    3. Sử dụng LED module
    Việc sử dụng đơn giản là include file "LED.h":
    Mã:
    #include "LED.h"
    ...
    int main(void)
    {
       LED_Configuration();
       /* Example1:
         •   LED1, LED3 ON
         •   LED2, LED4 OFF
       */ 
      LED1_ON;
       LED3_ON;
       LED2_OFF;
       LED4_OFF;
       while (1)
      {
         /* do nothing */
      }
    }
    
    Tới đây mình kết thúc phần giới thiệu LED module, để các bạn tiện sử dụng, mình attach lên đây cả project nhé. Nhưng khi sử dụng cho các project của các bạn thì chỉ cần add 2 file LED.c và LED.h, sau đó cấu hình lại chân cho khớp với project của các bạn.
    Những module sau mình sẽ tổng hợp và viết bài giới thiệu tiếp theo :D
    Note: trong file đính kèm mình đã modified thư viện để build với Visual C++ 2008 Express, build được nhưng không ra .hex file đâu nhé (mình dùng Visual C++ 2008 Express làm IDE, còn Keil thì build ra file .hex)

    Các file đính kèm:

    ngocson, badboy2805, phunghe13 others thích bài này.
    #1
  2. Đăng 28/6/14 #2

    NgoHungCuong http://ngohungcuong.com

    Số bài viết: 3,925
    Đã được thích: 9,013
    Yahoo Messenger
    Skype
    Facebook Profile
    Thanks anh.
    Lâu quá mới thấy anh viết bài.
    Em rất thích phong cách viết code của anh. :)
    #2
  3. Đăng 28/6/14 #3

    anhduongbk52 Học sinh phổ thông

    Số bài viết: 21
    Đã được thích: 19
    Ủa bạn viết trên visual C++ được ha, nếu thế có thể hướng dẫn sơ qua được không, vì trên visual có Visual AssistX code rất tiện
    NgoHungCuong thích bài này.
    #3
  4. Đăng 29/6/14 #4

    dungvt VIP

    Số bài viết: 571
    Đã được thích: 888
    Cái này bạn phải modify tại toàn bộ thư viện của ST để nó hỗ trợ cho Visual C++. Khi dùng cho Visual C++ thì thêm
    Preprocessor _VISUAL_C_PC_ trong Properties.
    Chủ ý mình dùng Visual C++ để debug từng dòng lên trên PC cho dễ, cũng như xem cách hoạt động của các thanh ghi. Debug thì cũng được 50-60%. Trong các ví dụ của mình đều dùng thư viện hỗ trợ Visual C++.
    thuyvy3110, anhduongbk52NgoHungCuong thích bài này.
    #4
  5. Đăng 29/6/14 #5

    anhhaipro Học sinh phổ thông

    Số bài viết: 1
    Đã được thích: 0
    hay day, heheh
    #5
  6. Đăng 1/7/14 #6

    caibang9x Học sinh trung cấp

    Số bài viết: 48
    Đã được thích: 6
    a ơi sao e k complier được a?a giúp e với, e mới tìm hiêu a
    Build target 'STM32F103_Study V1.0'
    compiling LED.c...
    LED.c: error: C3903U: Argument 'DCM' not permitted for option 'device'.
    Target not created
    kea thích bài này.
    #6
  7. Đăng 10/7/14 #7

    hienclubvn Học sinh phổ thông

    Số bài viết: 5
    Đã được thích: 1
    Xem bài viết xong .... cảm thấy phải đăng nhập bằng được vào để LIKE.
    01 Phong cách viết rất chuẩn, rất dễ hiểu, rất khoa học và rất LOgic.
    Cảm ơn A nhiều :v
    #7
  8. Đăng 10/7/14 #8

    hienclubvn Học sinh phổ thông

    Số bài viết: 5
    Đã được thích: 1
    To: anhduongbk52 Mình nghĩ chức năng Visual AssistX trong Visual mình dùng cho code ARM thì cũng chủ yếu là gợi ý code. Từ bản Keil ARM v4.72a là đã có rồi :v Thế nên chắc cũng ko cần phải chuyển C++ để dùng Visual AssistX nữa :D
    #8
  9. Đăng 27/7/14 #9

    binhlv2607 Học sinh phổ thông

    Số bài viết: 1
    Đã được thích: 0
    cho em hỏi là. trong bài code trên thì em không thấy có đoạn nào để định nghĩa chân nào của chip vào led thì làm sao để led có thể tắt sáng đúng ý được
    #9
  10. Đăng 7/8/14 #10

    itanium7000 Học sinh phổ thông

    Số bài viết: 2
    Đã được thích: 1
    Theo mình, việc lặp lại nhiều lần thao tác cấp xung ngoại vi bằng lệnh RCC_APB2PeriphClockCmd không phải là một ý hay. GPIO_Init cũng tương tự nhất là khi các LED đều cùng nối vào GPIOA.
    #10

Chia sẻ trang này