toilet

Hướng dẫn - bài 4 - Đọc Phím với STM32F0 Dicovery board

Thảo luận trong 'Tutorial với KIT STM32F0 Discovery'

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

  1. Đăng 23/9/13 #1

    tiennam191 Kỹ sư

    Số bài viết: 279
    Đã được thích: 425
    trên kit "STM32F0 Dicovery board" đã có sẵn 1 phím nhấn, phím này nối vào chân PA0.
    [​IMG]
    bình thường thì chân này ở mức logic 0, vì nó nối với trở kéo xuống mass. khi nhấn nút nó làm cho mức logic trên chân PA0 =1.
    - thư viện cần add : stm32f0xx_rcc.h và stm32f0xx_gpio.h

    Mã:
    #include <stm32f0xx.h>                    // thu vien cho dong stm32f0xx
    #include <stm32f0xx_rcc.h>            // thu vien cau hinh xung clock
    #include <stm32f0xx_gpio.h>            // thu vien cau hinh gpio
    // hàm delay
    int dem;
    void delay(void)
        {
            int time;
            for(time=0;time<4000000;time++);// tre khoang 4000000 lenh
        }
    void gpio_setup(void)
        {
        // khai bao GPIO_InitStructure = GPIO_InitTypeDef
        // 2 cach viet la nhu nhau
        GPIO_InitTypeDef        GPIO_InitStructure;
            /* cap xung cho PC */
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
     
      /* cau hinh PC9 and PC8 la dau ra, khong dung tro keo */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;// dung PC9,PC8
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;// che do uotput
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// reset pin khi uotput
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// clock 50Mhz
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;// khong dung tro keo
      GPIO_Init(GPIOC, &GPIO_InitStructure);// khoi tao PC
       
        // cau hinh cho PA0
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
     
      /* cau hinh PA0 dau vao,tro keo PuPd_DOWN */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// dung PA0
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;// che do uotput
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// reset pin khi uotput
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// clock 50Mhz
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;// khong dung tro keo
      GPIO_Init(GPIOA, &GPIO_InitStructure);// khoi tao PA
        }
    int main(void)
    {
        gpio_setup();
        GPIOC->ODR=0x0000; //PC8=0; Pc9=0
    while(1)
        {
        if((GPIOA->IDR&0x01)==1) // nếu PA0=1
            {
            while((GPIOA->IDR&0x01)==1);// khi chưa nhả phím, không làm gì cả
                dem++;
                if(dem==2) dem=0;
                if(dem==0) GPIOC->ODR=0x0100;//pc8=1 pc9 =0
                else if(dem==1) GPIOC->ODR=0x0200;//pc8=0 pc9 =1
            }
        }
    }
    
    #1
  2. Đăng 23/9/13 #2

    dungvt VIP

    Số bài viết: 572
    Đã được thích: 894
    Theo ý mình thì khi code ta nên optimize ngay từ đầu sẽ tốt hơn.
    Ví dụ biến "dem": có giá trị 0, 1, và chỉ nằm trong hàm main.
    Vậy chỉ cần khai báo biến "dem" là unsigned char trong hàm main (và xem "dem" là 1 số boolean) là tốt nhất.
    PHP:
    int main(void)
    {
      
    unsigned char dem 0x00;
      
    gpio_setup();
      
    GPIOC->ODR=0x0000//PC8=0; Pc9=0
      
    while(1)
      {
        if((
    GPIOA->IDR&0x01)==1// n?u PA0=1
        
    {
          while((
    GPIOA->IDR&0x01)==1);// khi chua nh? phím, không làm gì c?
          
    if (dem == 0)
          {
            
    GPIOC->ODR=0x0100//pc8=1 pc9 =0
            
    dem 1;
          }
          else
          {
            
    GPIOC->ODR=0x0200;//pc8=0 pc9 =1
            
    dem 0;
          }
        }
      }
    }
    Mình nghĩ như thế này sẽ tốt và rõ ràng hơn, không biết ý bạn sao?
    dsonbg, thanhtuongtiennam191 thích bài này.
    #2
  3. Đăng 23/9/13 #3

    tiennam191 Kỹ sư

    Số bài viết: 279
    Đã được thích: 425
    theo cách hiểu của bạn thì không sai. nhưng tính chất của RAM của vi điều khiển thường có giá tri 0 khi reset. vì thế có thể gán giá trị 0x00 cho biến hoặc là chỉ cần khai báo và sử dụng.
    còn độ lớn của biến thì mình dùng int là hơi thừa,có thể chuyển xuống "unsigned char"
    #3
  4. Đăng 23/9/13 #4

    dungvt VIP

    Số bài viết: 572
    Đã được thích: 894
    nếu code chơi chơi thì chỉ cần khai báo và sử dụng là được. Nhưng cố gắng code C cũng phải theo chuẩn bạn ơi, vì nếu code cho các dự án lớn, người ta có phần mềm kiểm tra rule C xem bạn có theo chuẩn quốc tế khi viết code không nữa. Nếu không viết đúng ngay từ đầu thì mai mốt cũng phải sửa lại mệt hơn.
    Không tin, bạn có thể tìm hiểu qua về MISAR: MISRA C - Wikipedia, the free encyclopedia
    thuyvy3110, thanhtuong, mta_cdt2 others thích bài này.
    #4
  5. Đăng 23/9/13 #5

    demon52 Kỹ sư

    Số bài viết: 873
    Đã được thích: 1,207
    Các bác vẫn thích sài thanh ghi giống dòng 8bit nhỉ :) tư duy code STM khác hẳn dòng 8bit, các project nhỏ OK, nhưng càng lớn càng nhiều file càng nhiều project càng khó, tính kế thừa ko có, ko làm việc team được... ST đã hỗ trợ thư viện thì tại sao lại ko dùng đó là qui chuẩn? Thứ 2 về cách quản lý các file code của mọi người vẫn có gì đó kì kì, như mình, file main chỉ có mỗi 1 chút khai báo và hàm main, tất tần tật các hàm khác các bác ném qua 1 file khác và extern đi, sau này muốn dùng lại chỉ cần copy, mạch em vẽ cũng thế, vì vậy giờ vẽ sch có khá nhiều cái kế thừa nên thực hiện project sẽ nhanh và chính xác hơn ( vì các project nhỏ đã được kiểm chứng trước đó ).
    thanhtuong, dungvttiennam191 thích bài này.
    #5
  6. Đăng 23/9/13 #6

    dungvt VIP

    Số bài viết: 572
    Đã được thích: 894
    Mình cũng thường viết kiểu như vậy, viết thành dạng module. Truy xuất module cũng hay dùng dạng put, get. Ít dùng extern lắm vì cũng không cần thiết. Put-get cũng đủ rồi
    demon52 thích bài này.
    #6
  7. Đăng 23/9/13 #6

    tiennam191 Kỹ sư

    Số bài viết: 279
    Đã được thích: 425
    có lẽ e vẫn chưa thoát hẳn tư duy của mấy dòng chip trước. chỉ có phần IO là em dùng thanh ghi cho nó nhanh. vì lệnh của stdlib nó dài ngoằng, trong khi đó 1 dòng lệnh là đã thay thế cả 1 cụm. với những ứng dụng khác thì nên dùng hàm có sẵn trong thư viện.
    #6
  8. Đăng 23/9/13 #7

    ngominhtrint Học sinh phổ thông

    Số bài viết: 9
    Đã được thích: 1
    Các bạn cho mình hỏi dòng "GPIOC - > ODR" có ý nghĩa gì vậy..
    tiennam191 thích bài này.
    #7
  9. Đăng 23/9/13 #8

    tiennam191 Kỹ sư

    Số bài viết: 279
    Đã được thích: 425
    GPIOC->ODR tương đương với thanh ghi GPIOC_ODR .
    nó là thanh ghi uotput GPIO->ODR, vị trí bit tương ứng với vị trí chân trên chip.
    ví dụ muốn cho PC8=1 PC9 =0 : GPIOC->ODR=0x0100;
    [​IMG]
    ngominhtrint thích bài này.
    #8
  10. Đăng 27/9/13 #10

    UITsteven Sinh viên đại học

    Số bài viết: 81
    Đã được thích: 55
    Cám ơn Anh đã chia sẻ
    Em đã test thử code này nhưng nó bị dội, nó không ổn định so với code của anh #tiennam1991
    tiennam191 thích bài này.
    #10

Chia sẻ trang này