1. Xin chào Khách ! Ban quản trị sẽ tiến hành nâng cấp diễn đàn từ ngày 11/8/2017 Mọi truy cập có thể bị dán đoạn, mong bạn thông cảm!
    Dismiss Notice

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. dungvt

    dungvt VIP

    Tham gia ngày:
    15/4/13
    Bài viết:
    582
    Đã được thích:
    903
    Điểm thành tích:
    93
    Giới tính:
    Nam
    Nơi ở:
    HCM
    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:

    Last edited: 28/6/14
    ngocson, badboy2805, phunghe13 others thích bài này.
  2. NgoHungCuong

    NgoHungCuong http://ngohungcuong.com

    Tham gia ngày:
    19/8/12
    Bài viết:
    4,000
    Đã được thích:
    9,098
    Điểm thành tích:
    69
    Giới tính:
    Nam
    Nghề nghiệp:
    Thất nghiệp
    Nơi ở:
    Lâm Thao - Phú Thọ
    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. :)
     
  3. anhduongbk52

    anhduongbk52 Học sinh phổ thông

    Tham gia ngày:
    28/10/13
    Bài viết:
    21
    Đã được thích:
    20
    Điểm thành tích:
    3
    Giới tính:
    Nam
    Ủ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
     
    Last edited: 28/6/14
    NgoHungCuong thích bài này.
  4. dungvt

    dungvt VIP

    Tham gia ngày:
    15/4/13
    Bài viết:
    582
    Đã được thích:
    903
    Điểm thành tích:
    93
    Giới tính:
    Nam
    Nơi ở:
    HCM
    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.
  5. anhhaipro

    anhhaipro Học sinh phổ thông

    Tham gia ngày:
    29/6/14
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    1
    Giới tính:
    Nam
    hay day, heheh
     
  6. caibang9x

    caibang9x Học sinh trung cấp

    Tham gia ngày:
    15/2/14
    Bài viết:
    48
    Đã được thích:
    7
    Điểm thành tích:
    8
    Giới tính:
    Nam
    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.
  7. hienclubvn

    hienclubvn Học sinh phổ thông

    Tham gia ngày:
    23/7/13
    Bài viết:
    5
    Đã được thích:
    1
    Điểm thành tích:
    3
    Giới tính:
    Nam
    Nơi ở:
    Hanoi, Vietnam
    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
     
  8. hienclubvn

    hienclubvn Học sinh phổ thông

    Tham gia ngày:
    23/7/13
    Bài viết:
    5
    Đã được thích:
    1
    Điểm thành tích:
    3
    Giới tính:
    Nam
    Nơi ở:
    Hanoi, Vietnam
    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
     
  9. binhlv2607

    binhlv2607 Học sinh phổ thông

    Tham gia ngày:
    30/6/14
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    1
    Giới tính:
    Nam
    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
     
  10. itanium7000

    itanium7000 Học sinh phổ thông

    Tham gia ngày:
    26/12/12
    Bài viết:
    2
    Đã được thích:
    1
    Điểm thành tích:
    3
    Giới tính:
    Nam
    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.
     

Chia sẻ trang này