Vào ra căn bản GPIO STM32

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

2/11/2018 Vào ra căn bản GPIO - Microcontroller

M i c r ocontrolle r Search this site

Home Home > ARM-Cortex M3 > Lam-quen ARM >


ARM-Cortex M3
Thư Viện CMSIS
Vào ra căn bản GPIO
Lam-quen ARM
Cong cu
Trong bài
Memory-Bus
Architecture này, ta sẽ làm quen với cách lập trình chức năng vào ra cơ bản trên dòng
Huong dan tao có sử dụng thư viện ngoại vi chuẩn (Standard Peripheral Library).
Project voi keil C
Giao tiếp USART Trước tiên, dưới đây là một số tài liệu cơ bản và quan trọng mà các b
Vào ra căn bản - Datasheet của MCU: giới thiệu các khối chức năng được trang bị tr
GPIO
General Purpose
- STM32F10x Reference Manual: bao gồm các giới thiệu chi tiết về
Timer: Part 1 - thuộc dòng STM32F10x ( Lưu ý: các module chức năng có thể có ho
Time-base Unit
Contact Xem datasheet để biết thông tin rõ hơn cho từng loại).
Sitemap - STM32F10x Programming Manual: cung cấp một số thông tin như
(MPU), NVIC, ...

- Tài liệu của thư viện Standard Peripheral Library: là bản hướng dẫn sử

Mục đích của bải này là giúp làm quen với việc lập trình cho module GP
cách để thực hiện một chức năng nhỏ đó là bật tắt một LED theo một chu

I) Giới thiệu sơ lược về GPIO trên STM32


Trước khi lập trình GPIO, ta
tìm hiểu một chút về các đặc điểm hoạt động của module này.
Mỗi bit trong từng cổng GPIO có thể được lập trình một cách riêng r
- Input floating
- Input pull-up
- Input pull-down
- Output open-drain
- Output push-pull
- Analog
- Alternate function open-drain
- Alternate function push-pull
Trong ví dụ này, để nháy LED, ta chỉ cần sử dụng chế độ output push-
pull. Các chế độ còn lại bạn đọc reference manual và datasheet để tìm hi
rõ thêm. Sau khi reset hệ thống, mặc định các chân GPIO được chuyển
PA15, PB4) ở
chế độ input pull-up/pull-down. Một số thông tin trên tạm thời đủ để
chúng ta thực hiện việc lập trình chức năng vào ra cơ bản.
Dịch
https://sites.google.com/a/edabk.org/microcontroller/home/arm-cortex-m3/lam-quen-arm/vao-ra-can-ban-i-o 1/4
2/11/2018 Vào ra căn bản GPIO - Microcontroller

II) Sử dụng GPIO để nháy LED

Bước đầu tiên là tạo một project mới theo hướng dẫn trong bài Khởi
nguồn do bạn viết để bắt đầu lập trình.
Đầu tiên, để lập trình cho dòng MCU STM32F10x, bạn phải include
#include "stm32f10x.h"
int main(void)
{
}

File header này chứa tất cả định nghĩa cho các thanh ghi của các module
macro để truy cập vào các thanh ghi, ... Dù chúng ta có sử dụng thư viện
này vào mã nguồn. File header này còn cho phép chúng ta lựa chọn dòng
density, medium density,. hoặc lựa chọn mã nguồn của mình có sử dụng
hiểu rõ thêm về các define, các macro trong đó.

Bắt đầu
lập trình. Đầu tiên, chúng ta phải chọn dòng MCU mà mình sử dụng cho
Ngoài ra, ta cũng cần thông báo rằng chúng ta sẽ sử dụng thư viện stand
file stm32f10x.h. Từ dòng 65 đến dòng 73 là các định nghĩa các dòng M
comment.
/* #define STM32F10X_LD */ /*!
< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!
< STM32F10X_LD_VL: STM32 Low density Value Line devices */
/* #define STM32F10X_MD */ /*!
< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_MD_VL */ /*!
< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
/* #define STM32F10X_HD */ /*!
< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!
< STM32F10X_HD_VL: STM32 High density value line devices */
/* #define STM32F10X_XL */ /*!
< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!
< STM32F10X_CL: STM32 Connectivity line devices */
Project của bạn sử dụng chip thuộc vào dòng nào thì bạn chỉ cần bỏ
/*#define USE_STDPERIPH_DRIVER*/
Bạn bỏ comment ở dòng này để thông báo rằng mình có sử dụng thư
không sử dụng thư viện này là bạn sẽ phải truy cập trực tiếp đến các than
trong file stm32f10x.h, còn nếu có sử dụng thư viện thì bạn có thể dùng
viết code ở một mức trừu tượng cao hơn, không cần phải nhớ tên và vị tr
Với Keil uVision, có một cách khác để làm được hai việc trên mà không
bấm vào nút Target Options, chọn tab C/C++, ở ô Define, bạn chỉ cần nh
STM32F10X_HD, USE_STDPERIPH_DRIVER
Khi sử dụng thư viện SPL, ta cần sử dụng các file header của thư việ
cứng trong MCU. Để sử dụng thư viện cho module ngoại vi nào, ta cần i

https://sites.google.com/a/edabk.org/microcontroller/home/arm-cortex-m3/lam-quen-arm/vao-ra-can-ban-i-o 2/4
2/11/2018 Vào ra căn bản GPIO - Microcontroller

mở file stm32f10x_conf.h lên. Ngay ở phần đầu file bạn có thể thấy một
header nào thì chỉ cần bỏ comment cho khai báo include file đó. Trong v
và stm32f10x_gpio.h. File thứ nhất là thư viện các hàm cho module Rese
cho toàn bộ hệ thống; file thứ 2 chính là thư viện cho module GPIO.
Tiếp theo, trong hàm main, ta khai báo một biến kiểu dữ liệu GPIO_
int main(void)
{
GPIO_InitTypedef GPIO_InitStruct;
}
Dưới đây là định nghĩa cấu trúc dữ liệu GPIO_InitTypedef trong file
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
Để module GPIO hoạt động, ta cần cấp clock cho nó, cụ thể là cho từ
15 trên GPIO Port D. Ta dùng câu lệnh sau để enable clock cho GPIO po
// Enalbe clock for GPIO Port D
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
Bạn cần lưu ý, các ngoại vi trong hệ thống được kết nối qua 2 loại bus A
đúng câu lệnh để enable clock:

Sau khi đã enable clock cho GPIO port D, ta cấu hình cho pin 15 của
pull, tốc độ 2Mhz để điều khiển LED:
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
https://sites.google.com/a/edabk.org/microcontroller/home/arm-cortex-m3/lam-quen-arm/vao-ra-can-ban-i-o 3/4
2/11/2018 Vào ra căn bản GPIO - Microcontroller

GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_ResetBits(GPIOD, GPIO_Pin_15);
Bạn có thể dễ dàng hiểu được ý nghĩa của các lệnh trên. Lệnh GPIO_
thời điểm ban đầu.
Tiếp theo, ta điều khiển LED bật tắt theo một chu kỳ nhất định theo
chưa cần quan tâm đến khoảng thời gian delay này vì mục đích của bài n
volatile uint32_t delay;
Trong vòng while vô hạn ta tắt LED bằng cách set pin của MCU nối
reset pin nối với LED về 0 (giả sử ta dùng loại LED nối anot chung)
while(1){
GPIO_SetBits(GPIOD, GPIO_Pin_15);
for (delay=0; delay<0xFFFFF; delay++);
GPIO_ResetBits(GPIOD, GPIO_Pin_15);
for (delay=0; delay<0xFFFFF; delay++);
}
Dưới đây là toàn bộ mã nguồn của file main.c:
#include "stm32f10x.h"
int main(void)
{
volatile uint32_t delay;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_ResetBits(GPIOD, GPIO_Pin_15);
while(1){
GPIO_SetBits(GPIOD, GPIO_Pin_15);
for (delay=0; delay<0xFFFFF; delay++);
GPIO_ResetBits(GPIOD, GPIO_Pin_15);
for (delay=0; delay<0xFFFFF; delay++);
}
}
Biên dịch, chạy mô phỏng trên uVision hoặc nạp xuống phần cứng và qu

Manh.NT

Č
ċ GPIO-LedBlink.rar (76… Van-Dieu Bui, Aug 20… v.1 ď

Nhận xét

Bạn không có quyền thêm nhận xét.

Đăng nhập | Hoạt động gâǹ đây của trang web | Báo cáo lạm dụng | Trang in | Được cung câp
́ bởi Google Sites

https://sites.google.com/a/edabk.org/microcontroller/home/arm-cortex-m3/lam-quen-arm/vao-ra-can-ban-i-o 4/4

You might also like