QC

Cấu Hình GPIO AVR

 AVR I/O Register Configuration

  Trong hướng dẫn này, chúng ta sẽ thảo luận về cấu hình cổng của bộ điều khiển AVR / Atmel hay nói chung là họ Atmega. Trong hướng dẫn này, chúng tôi sẽ sử dụng Atmega32 làm tài liệu tham khảo, điều tương tự sẽ được áp dụng cho các bộ điều khiển dòng Atmega khác.
     Ở phần cuối của hướng dẫn này, bạn sẽ làm quen với Atmel GPIO và các thanh ghi liên quan để cấu hình và truy cập GPIO.


GPIO Registers


   Tính năng cơ bản và quan trọng của bất kỳ bộ điều khiển nào là số lượng gpio có sẵn để kết nối các thiết bị ngoại vi. Atmega32 có 32-gpio được nhóm thành bốn cổng 8-bit cụ thể là PORTA-PORTD như thể hiện trong hình dưới đây.

  Như trong hình trên, nhiều chân I / O có 2-3 chức năng. Nếu một pin được sử dụng cho chức năng khác thì nó có thể không được sử dụng như một gpio.

Mặc dù các chân gpio được nhóm thành các cổng 8 bit, chúng vẫn có thể được định cấu hình và truy cập riêng lẻ.
Mỗi Port được liên kết với 3 thanh ghi để cấu hình hướng (Input / Output), hoạt động đọc và ghi.

Mô tả

DDRx Được sử dụng để cấu hình PORT tương ứng làm đầu ra / đầu vào
PORTx Được sử dụng để ghi dữ liệu vào các chân Cổng
PINx Được sử dụng để đọc dữ liệu từ các chân cổng

Lưu ý: Ở đây 'x' có thể là A, B, C, D tùy thuộc vào số lượng cổng được hỗ trợ bởi bộ điều khiển.

DDRx: Đăng ký hướng dữ liệu
Trước khi đọc hoặc ghi dữ liệu từ các cổng, hướng của chúng cần được thiết lập. Trừ khi PORT được cấu hình làm đầu ra, dữ liệu từ các thanh ghi sẽ không đi đến các chân của bộ điều khiển.
Thanh ghi này được sử dụng để cấu hình các chân PORT làm Đầu vào hoặc Đầu ra. Ghi 1 vào DDRx sẽ tạo ra các chân PORTx tương ứng làm đầu ra. Tương tự, ghi số 0 vào DDRx sẽ làm cho các chân PORTx tương ứng làm Đầu vào.

  1. DDRB = 0xff; // Configure PORTB as Output.
  2.  
  3. DDRC = 0x00; // Configure PORTC as Input.
  4.  
  5. DDRD = 0x0F; // Configure lower nibble of PORTD as Output and higher nibble as Input
  6.  
  7. DDRD = (1<<PD0) | (1<PD3) | (1<<PD6); // Configure PD0,PD3,PD6 as Output and others as Input


Giải Thích Code:

- DDRB = 0xFF tương đường với  DDRB =0b 1111 1111 
Có nghĩa là Nguyên PORTB làm Outputs.
Bạn muốn PORTB.1 làm outputs thì làm như sau : DDRB.1=0b1.


- DDRC=0x00 Tương đương với DDRC =0b 0000 0000 Tất cả PORTC Làm nhận giữ liệu.

- DDRD =(1<<PD0) : có nghĩa là PORTD.0 =1 là OUPUTS.


PORTx:

Thanh ghi này được sử dụng để gửi dữ liệu đến các chân cổng. Ghi 1 vào PORTx sẽ làm cho các chân PORTx tương ứng là CAO. Tương tự, ghi số 0 vào PORTx sẽ làm cho các chân PORTx tương ứng là THẤP.

  1. PORTB = 0xff; // Make all PORTB pins HIGH.
  2.  
  3. PORTC = 0x00; // Make all PORTC pins LOW..
  4.  
  5. PORTD = 0x0F; // Make lower nibble of PORTD as HIGH and higher nibble as LOW
  6.  
  7. PORTD = (1<<PD0) | (1<PD3) | (1<<PD6); // Make PD0,PD3,PD6 HIGH,


PINx:Thanh ghi đầu vào PORT
Thanh ghi này được sử dụng để đọc dữ liệu từ các chân cổng. Trước khi đọc dữ liệu từ các chân cổng, các cổng cần được cấu hình làm Đầu vào.
  1. DDRB = 0x00; // Configure the PORTB as Input.
  2. value = PINB; // Read the data from PORTB.
  3.  
  4.  
  5. DDRB = 0x00; // Configure PORTB as Input
  6. DDRD = 0xff; // Configure PORTD as Output
  7. PORTD = PINB; // Read the data from PORTB and send it to PORTD.

Enabling Internal Pull Up Resistors: (Kích hoạt điện trở kéo lên bên trong).
Đặt các bit DDRx thành 0 sẽ cấu hình PORTx làm Đầu vào. Bây giờ các bit tương ứng trong thanh ghi PORTx có thể được sử dụng để bật / tắt điện trở kéo lên được liên kết với chân đó. Để bật điện trở kéo lên, hãy đặt bit trong PORTx thành 1 và để tắt, hãy đặt nó thành 0.
  1. DDRB = 0x00; // Configure the PORTB as Input.PORT B DÙNG INPUTS
  2. PORTB = 0xFF; // Enable the internal Pull Up resistor of PORTB.kích
  3. hoạt điện trở kéo lên PORTB
  4.  
  5. DDRD = 0xff; // Configure PORTD as Output , PORT D DÙNG OUPUTS
  6. PORTD = PINB; // Read the data from PORTB and send it to PORTD.
  7. DỮ LIỆU PORTD = PORTB


Led Blinking Example ( VD: Blink Led ).


Sau khi biết cách cấu hình các cổng GPIO, đã đến lúc viết một chương trình đơn giản để nhấp nháy các Led.Các điểm dưới đây cần được xem xét cho ví dụ này.

TRONG CHƯƠNG TRÌNH NÀY:
PORTC: DÙNG LÀM OUTPUTS. KẾT NỐI VỚI LED.

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    DDRC = 0xff;           // Configure PORTC as output

    while(1)
    {
        PORTC = 0xff;        // Turn ON all the Leds connected to PORTC
        _delay_ms(100);      // Wait for some time
        PORTC = 0x00;        // Turn OFF all the Leds connected to PORTC
        _delay_ms(100);      // Wait for some time
    }
    return 0;
}






Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...