Professional Documents
Culture Documents
Vào ra căn bản GPIO STM32
Vào ra căn bản GPIO STM32
Vào ra căn bản GPIO STM32
- 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
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
Đă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