• About
  • Policy
  • Contact

STMVN HOME

  • Home
  • Danh mục
    • Tự học STM32
    • Tải về
  • Translate
Trang chủ » Tự Học STM32 » Tự học STM32 - Bài 1 - GPIO các cổng của vi điều khiển

Tự học STM32 - Bài 1 - GPIO các cổng của vi điều khiển

Crazy Football | Livestream football Nhãn: Tự Học STM32 5 Comments 22:53
Lập trình  GPIO :

- Tùy các dòng vi điều khiển ST do nhà  sản xuất  phát hành có  những Port(GPIO)  tương ứng  mỗi Port  đối với dòng vi điều khiển  STM  có 16 pin 


I.cấp clock cho GPIO :

GPIOA, GPIOB, GPIOC... sử dụng clock cấp ở Bus APB2 có tầm số xung nhịp 72Mhz ,nhưng thực các chân chức năng I/O sử dụng tốc độ clock tối đa 50Mhz

- Cấp clock GPIO thông qua thanh ghi RCC_APB2ENR:








Các  bit 2,3,4,5,6,7,8, là các bít sử dụng để cấu hình chép phép clock trên các GPIOA,B,C,D,...G khi set các bit  tương ứng lên 1, nếu reset bit tương ứng về 0  thì GPIO tương ứng sẽ bị vô hiệu hóa

VD. cho phép sử dụng GPIOA,GPIOB tương ứng bit 2,3 của thanh ghi RCC->APB2ENR :




GPIOA->APB2ENR=(1<<2)|(1<<3);


- Ở đây giá trị của thanh ghi = ta dịch trái giá trị  giá trị 1 đi 2 bit rôi OR từng bit của nó với giá trị  1 dịch trái đi 3 bit = 0b1100 (gt nhi phân ) tương ứng bit 2,bit 3 có giá  trị là  1

cách khác ta có thể gắn giá trị trực tiếp cho thanh ghi =0b1100 (giá trị nhị phân bít 2,bit 3 có giá trị là  1) =12 giá trị thập phân =0x0c (hệ hex)  :



 GPIOA->APB2ENR=0x0c;
Hoặc :



 GPIOA->APB2ENR=12;

Chú ý ta quy ước ở đây : set có trị là 1, Reset có giá trị =0, và bit trong chuỗi được tính  từ  bit 0 đến bít ... theo thứ tự từ trái qua phải . 
VD 0b1001  vị trí bít sẽ được tính từ bit 0 ,1 ,2, 3  theo thứ tự từ trái qua phải

II. Cấu hình các mode GPIO:


GPIO có các  mode :
















- Input floating: chế độ thả  nổi 2 khóa VDD, VSS đều mở  dữ liệu đầu vào sẽ được đã thăng vào trigger mode 
    này sử dụng để phát hiện sườn clock  (chân nhận dữ liệu USART, SPI ... )

- Input pull up : chân được kéo lên cao nếu chân không nối với  với mức điện áp thấp GND thì điện áp đọc được
  chân sẽ là mức điện áp cao(3,3V) hay giá trị 1 

- Input pull down : chế độ chân kéo xuống mức điện áp thâp khóa VDD mở , VSS đóng chân ở mode này luôn ở 
  mức điện áp thấp nếu không nối chân với nguồn điện áp cao

-Input analog sử dụng để đọc tín hiệu tương tự như cảm biết nhiệt độ, biến trở ...

- Output push-pull: mode chân đẩy điện áp từ vi điều khiển ra bên ngoài : chân vi điều khiển nối với tải tiêu thụ và nối với GND

- Output open - drain: mode chân điều khiển mở và nhận điện áp từ nguồn điện áp  bên ngoài

- Alternate push pull: mode chân vi điều khiển xuất dẫn xung dao động vi điều khiển luân phiên va bên ngoài chân, mode này được sư 
   dụng như nguồn clock giữ nhịp hoặc chân truyền sữ liệu tốc độ cao (SPI, UART ...)

2. Thanh ghi cấu hinh mode và tốc độ của  chân tương ứng GPIO

- Có 2 thanh ghi 32 bit  GPIOx->CRL, GPIOx->CRH (GPIOx=GPIOA,GPIOB,...):
 trong đó GPIOx_CRL sử dụng cấu hình chân từ 0 đến 7 của GPIO tương ứng, GPIOx>CRH cấu 

Chú ý : thanh ghi GPIOx->CRL  4 bit sẽ sử dụng để cấu hình 1 chân có 32 bit tương ứng cấu hình 8 chân:


















- Tương tự đối với thanh ghi GPIOx ->CRH Từ  bit 0 đến bit 3 cấu hinh chân số 8, từ bit 4 đến bit 7 cấu hình chân số 9, ...
-Vì 2 thanh ghi có chức năng cấu hình như nhau nên ở  đây mình sẽ cấu hình mẫu với thanh ghi  GPIOx->CRL 

























 VD. Cấu hình Chân 0 GPIOA hay chân PA0 ở chế độ ouput push -pull  max speed 50Mhz, :

-  bit 0 và bít 1 chọn chế độ input hoặc output  speed bít 2,bit 3 chọn chế dộ chân vd  cấu hình chân PA0 ouput max speed 50Mhz và chế độ chân output push - pull  thì birt 0 
    và bit 1 có giá trị 11 bít 2 và bit 3 có giá trị 00 vậy 4 bit cấu hình chân có giá trị 0011 =3 giá trị thập phân:




GPIOA->CRL=(3<<0) ;// giá trị 3=0011(nhị phân) dịch trái 3 bit


- Cấu hinh chân PB1,PB0,PB2,PB3 output push-pull max speed 50 Mhz:


GPIOB->CRL=(3<<0)|(3<<4)|(3<<8)|(3<<12); //chân PB0,PB1,PB2,PB3 output push-pull


-Cấu hình chân PA0,PA1,PA2 input floating: giá trị 4 nhị phân tương ứng của mỗi chân  là 0b0100 =4 hệ thập phân 



GPIOA->CRL =(4<<0)|(4<<4)|(4<<8);


-  Cấu hinh chân PA0,PA1,PA2 input pull down, 4 bit nhị phân tương ứng với chân là  0b1000=8 hệ thập phân


GPIOA->CRL=(8<<0)|(8<<4)|(8<<8);


 - Cấu hinh chân PA0,PA1,PA2 input pull up, 4 bit nhị phân tương ứng với chân là  0b1000=8 hệ thập phân 


GPIOA->CRL=(8<<0)|(8<<4)|(8<<8);

GPIOA->ODR=(1<<0)|(1<<1)|(1<<2);

3 .Thanh ghi cấp phục vụ cho chế độ input và out put :

 a. Thanh ghi xuất dữ liêu( điện áp ra ngoài chân tương ứng )
   
   -GPIOx->ODR (x=A,B,C,D,..G) : thanh ghi 32 bit từ 31 đến bit 16 dự trữ không sử dụng bit 0 đến bit 15 sử dụng cấu hình chân từ 0 đến 15






- Bit  tương ưng set lên 1 chân sẽ xuất dữ liệu hay mức điện áp cáo từ chân vi điều khiển ra bên ngoài:
  mức 0 chân sẽ ở mức điện áp thâp (0v)

VD. chân từ 7,8,9 của GPIOC  được cấu hình ouput push pull giờ mình sẽ xuất ra chân tương ứng mức điện áp cao(3.3V):



GPIOC->ODR=(1<<7)|(1<<8)|(1<<9);

- Để đưa chân tương ứng về mức điện ấp thâp( 0V):



GPIOC->CRL &=~((8<<0)|(8<<4)|(8<<8));

thanh ghi : GPIOx->BSRR : thanh ghi 32 bit các bit 0 đến đến 15 sẽ để set các bit 0 đến 15 của thanh ghi GPIOx->ODR lên 1 các bit 16 đến 31 sử dụng 
để reset các bit 0 đến 15 thanh ghi GPIOx->ODR về 0 khi ghi giá trị 1 vào bit tương ưng thanh ghi GPIOx->BSRR nếu ghi giá trị 0 vào bit thanh ghi GPIOx->BSRR thì sẽ không có hiệu lực:

VD. chân từ 7,8,9 của GPIOC  được cấu hình ouput push pull giờ mình sẽ xuất ra chân tương ứng mức điện áp cao(3.3V):



GPIOC->BSRR=(1<<7)|(1<<8)|(1<<9);

 Để đưa chân tương ứng về mức điện ấp thâp( 0V):


GPIOC->BSRR =(1<<23)|(8<<24)|(8<<25);

2. Đọc trạng thái điện áp của 1 chân input ,thanh ghi GPIOx->IDR(x=A,B,C,...):

 - Thanh ghi 32 bit từ bit 31 đến bit 16 dự trư không sử dụng,
   từ bit 0 đến 15 sử dụng để đọc điện áp  chân cấu hình input từ 0 đên 15 nếu đọc bit có giá trị 1 thi điện áp đầu vào chân có mức điện áp cao
    nếu là 0 thi điện áp đầu vào chân là mưc thấp :





- Thanh ghi này chỉ có chức năng đọc chứng ta không thể ghi giá trị vào thanh ghi này :
  
Giả sử đọc trang thái chân PB5 và giá trị đọc được luu vào biến a:(a có giá trị 1 nếu chân tương ưng có mức điện áp cao còn a=0 thi ngược lại)




uint8_t a;

  a=((GPIOB->IDR&(1<<5))>>4);

Giả sử đọc trang thái chân PA6 và giá trị đọc được luu vào biến a:




uint8_t a;

  a=((GPIOA->IDR&(1<<6))>>5);


III. Code lập trình mẫu :

 Bài 1 : lập trình  nhấp nháy 3 led chân PB7,PB8PB9 sử  dụng mode output push -pull 50Mhz: 

B1. Cấp clock cho phep GPIOB
B2. Cấu hình chân tương ứng ở mode output push -pull 50Mhz
B3. Cấp điện áp chân tương ứng:




- Code STM32F103C8T6 :




#include "Device/Include/stm32f10x.h"   // Device header

 void gpio_init(void)
 {

    RCC->APB2ENR=(1<<3);//GPIOB clock enable
    GPIOB->CRL=(3<<28);//PB7 ouput push-pull 50Mhz
    GPIOB->CRH=(3<<0)|(3<<4);////PB8,PB9 ouput push-pull 50Mhz

 }

 void delay(volatile uint32_t a )
 {

    a=a*4000;
    while(a--);

 }

 int main(void)
 {

    gpio_init();

    while(1)
    {
       GPIOB->ODR=(1<<7)|(1<<8)|(1<<9);//cấp điện áp chân 7,8,9 lên mức cao
       delay(500);
       GPIOB->ODR&=~((1<<7)|(1<<8)|(1<<9));//Đưa điện áp chân 7,8,9 về 0
       delay(500);

    }
 }





Bai 2: sáng dần 8 led từ chân PB5 ,PB6,PB7,PB8,PB7,PB10,PB11,PB12 :





 #include "Device/Include/stm32f10x.h"   // Device header

 void gpio_init(void)
 {

   RCC->APB2ENR=(1<<3);//GPIOB clock enable

   GPIOB->CRL=(3<<20)|(3<<24)|(3<<28);//PB5,Pb6,P7 ouput push-pull 50Mhz

   GPIOB->CRH=(3<<0)|(3<<4)|(3<<8)|(3<<12);////PB8,PB9,PB10,PB11,PB12 ouput push-pull 50Mhz

 }

 void delay(volatile uint32_t a )
 {

    a=a*4000;
    while(a--);

 }

 int main(void)
 {

    gpio_init();

    while(1)
    {

      uint8_t i=0;

      for(i=5;i<=12;i++)
       {

       GPIOB->ODR=(1<<i);//Đưa điện áp chân 5,67,8,9,10,11,12  lên cao
       delay(500);
       GPIOB->ODR&=~(1<<i);//Đưa điện áp chân 5,67,8,9,10,11,12 về 0
       delay(500);

     }
 }

Bài viết liên quan

5 nhận xét

avatar
Unknown
lúc 23:47 4 tháng 11, 2018 ✖

Làm thêm bài hướng dẫn đi bạn ơi hay quá

Trả lời
avatar
Rocking24
lúc 20:34 11 tháng 3, 2019 ✖

Bài viết rất hay! Khắc phục lỗi chính tả nữa thì tuyệt vời. Cám ơn các bạn!

Trả lời
avatar
Unknown
lúc 21:44 9 tháng 10, 2019 ✖

Rất hay, dễ hiểu.

Trả lời
avatar
Unknown
lúc 04:34 8 tháng 4, 2020 ✖

Làm bài nữa đi bạn ơi. Bài viết hay ạ

Trả lời
avatar
Unknown
lúc 05:28 18 tháng 5, 2020 ✖

hay qua ban oiii

Trả lời

← Bài đăng mới hơn Trang chủ

Chuyên mục

Bài đăng phổ biến

  • Tự học STM32 - Bài 1 - GPIO các cổng của vi điều khiển
    Tự học STM32 - Bài 1 - GPIO các cổng của vi điều khiển
    Lập trình  GPIO : - Tùy các dòng vi điều khiển ST do nhà  sản xuất  phát hành có  những Port(GPIO)  tương ứng  mỗi Port  đối với dòng v...
  • STM32 - Phần mềm lập trình
    STM32 - Phần mềm lập trình
    STM32 STM8 Flash Load Demo  Phần mềm nạp Code vào Vi Điều khiển Embitz 0.40.2  Phần mềm viết code Driver  Driver Data Sheet  Data...
Được tạo bởi Blogger.
Support: Facebook | Twitter | Google+ | Giới thiệu
Copyright © 2015 • STMVN HOME • All Right Reserved