Hình ảnh
Để led sáng thì tín hiệu xuất ra ở pin vi điều khiển phải ở mức thấp vì led được kéo lên nguồn +3.3V. Điều này sẽ đảm bảo đủ dòng điện chạy qua led, như vậy led sẽ sáng hơn. Tuy nhiên, vi điều khiển STM32 với khả năng cấp dòng lên đến 25mA trên mỗi pin, do đó chúng ta cũng có thể kết nối trực tiếp với led, qua một điện trở hạn dòng và xuống GND.
Pin điều khiển Led tương ứng
PortC, pin 0 Led 1
PortC, pin 1 Led 2
PortC, pin 2 Led 3
PortC, pin 3 Led 4
PortC, pin 4 Led 52. Kiến thức cần thiết

Điều khiển cổng GPIO của STM32F103RC

STM32F103RC có 3 cổng GPIO 16 pin là: Port A, Port B, Port C và 1 Port D (chỉ có 3 pin PD0, PD1, PD2). Để điều khiển các cổng GPIO chúng ta có 2 thanh ghi cấu hình 32-bit (GPIOx_CRL, GPIOx_CRH), 2 thanh ghi dữ liệu 32-bit( GPIOx_IDR, GPIOx_ODR), một thanh ghi set/reset 32-bit(GPIOx_BSRR), một thanh ghi reset 16-bit(GPIOx_BRR) và cuối cùng là một thanh ghi khóa 32-bit( GPIOx_LCKR). 
Các cổng GPIO có nhiều chế độ hoạt động như: 
+ Input floating
+ Input pull-up
+ Input pull-down
+ Analog
+ Output open-drain
+ Output push-pull
+ Alternate function push-pull
+ Alternate function open-drain
Ở board  STM32F103  để điều khiển led, port C được cấu hình Output push-pull. 
Để cấu hình chế độ hoạt động các pin của STM32F103, sử dụng 2 thanh ghi GPIOx_CRL và GPIOx_CRH. GPIOx_CRL sẽ điều khiển cấu hình của các pin từ 0→7 và GPIOx_CRH điều khiển các pin từ 8→15. 

MODEy[1:0]: Chế độ hoạt động của Port x (y= 0 .. 7)
00: Input mode (reset state)
01: Output mode, max speed 10 MHz.
10: Output mode, max speed 2 MHz.
11: Output mode, max speed 50 MHz.
CNFy[1:0]: Cấu hình Port x (y= 0 .. 7)
Ở chế độ input (khi MODE[1:0]=00):
00: Analog input mode
01: Floating input (reset state)
10: Input with pull-up / pull-down
11: Reserved
Ở chế độ output (khi MODE[1:0] > 00):
00: General purpose output push-pull
01: General purpose output Open-drain
10: Alternate function output Push-pull
11: Alternate function output Open-drain
Như vậy, đầu tiên để cấu hình chế độ hoạt động của các pin, chúng ta phải sử dụng GPIOx_CRL hoặc CPIOx_CRH và các bits điều khiển tương ứng trên các thanh ghi đó. 
Một khi đã cấu hình các pin nối với led ở chế độ Output push-pull rồi, chúng ta truy xuất dữ liệu thông qua các thanh ghi dữ liệu GPIOx_ODR vì lúc này pin hoạt động ở chế độ output. 

3. Mã nguồn
STM32 được hỗ trợ tích cực bởi bộ thư viện chuẩn để truy xuất các thiết bị ngoại vi, đồng thời tương thích với chuẩn CMSIS do hãng ARM đề xuất nhằm rút ngắn thời gian tìm hiểu để lập trình, đơn giản hóa code, tăng khả năng tái sử dụng mã nguồn. Bộ thư viện chuẩn cấu hình các thiết bị ngoại vi thông qua các macro gợi nhớ chức năng, vì vậy rất dễ sử dụng và rõ ràng.

Cấu hình pin của Port C

Sử dụng kiểu cấu trúc GPIO_InitTypeDef, khai báo biến GPIO_InitStructure

GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN | LED2_GPIO_PIN | LED3_GPIO_PIN | LED4_GPIO_PIN | LED5_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure được dùng như biến lưu trữ cấu hình của một PortX_GPIO chuẩn. Ở đoạn code trên, chúng ta muốn cấu hình các pin 0,1,2,3 và 4 hoạt động ở chế độ Output Push-Pull dưới xung nhịp 50MHz. 

#define LED_GPIO_CLK RCC_APB2Periph_GPIOC

#define LED_GPIO_PORT GPIOC

void stm32_gem31_led_init(GPIO_InitTypeDef* GPIO_InitStructure)

{

/* Enable the GPIO_LED Clock */

RCC_APB2PeriphClockCmd(LED_GPIO_CLK , ENABLE);

GPIO_Init(LED_GPIO_PORT, GPIO_InitStructure);

}

Hàm stm32_gem31_led_init nhận cấu trúc GPIO_InitTypeDef như là biến cấu hình đầu vào. Ta thấy có 2 hàm được gọi từ bộ thư viện truy cập phần cứng chuẩn của STM32 là:

+ RCC_APB2PeriphClockCmd(): Hàm này kích hoạt xung nhịp cho thiết bị ngoại vi, ở đây ta kích cho Port C hoạt động.

+ Hàm GPIO_Init(): khởi tạo cấu hình cho cổng GPIO theo cấu hình được lưu trong cấu trúc GPIO_InitTypeDef.

Điều khiển Port C và nhấp nháy led

Nhấp nháy đèn led bằng cách đọc dữ liệu ở các pin tương ứng và đảo ngược giá trị.

void stm32_gem31_led_toggle(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

uint16_t outData;

/* XOR output data port with LED pin */

outData = GPIO_ReadOutputData(GPIOx);

outData ^= GPIO_Pin;

/* out put data */

GPIO_Write(GPIOx, outData);

}

Sử dụng vòng lặp để duy trì 

/* Infinite loop */

while (1)

/* Toggle all LED */

stm32_gem31_led_toggle(LED_GPIO_PORT, LED1_GPIO_PIN );

delay(LED_DELAY);

stm32_gem31_led_toggle(LED_GPIO_PORT, LED1_GPIO_PIN );

stm32_gem31_led_toggle(LED_GPIO_PORT, LED2_GPIO_PIN );

delay(LED_DELAY);

stm32_gem31_led_toggle(LED_GPIO_PORT, LED2_GPIO_PIN );

stm32_gem31_led_toggle(LED_GPIO_PORT, LED3_GPIO_PIN );

delay(LED_DELAY);

stm32_gem31_led_toggle(LED_GPIO_PORT, LED3_GPIO_PIN );

stm32_gem31_led_toggle(LED_GPIO_PORT, LED4_GPIO_PIN );

delay(LED_DELAY);

stm32_gem31_led_toggle(LED_GPIO_PORT, LED4_GPIO_PIN );

stm32_gem31_led_toggle(LED_GPIO_PORT, LED5_GPIO_PIN );

delay(LED_DELAY);

stm32_gem31_led_toggle(LED_GPIO_PORT, LED5_GPIO_PIN );

}

4. Trình diễn

Trước khi nạp vào board để chạy, chúng ta nên kiểm tra trước bằng cách chạy Debug ở chế độ Simulink. Mở bảng theo dõi ngoại vi GPIOC để thấy giá trị ở các chân điều khiển led thay đổi

Các bạn có thể dùng stm32cube mx để dễ dàng hơn trong quá trình lập trình !

Các bạn có thể mua 1 kít STM32F103C8T6 +Mạch nạp st-link v02 là có thể lập trình ARM

Phần mền :kiel 4.7 hoặc cao hơn

Phần mền stm32cube mx để biên dịch code

 

LAP TRINH DON GIAN GPIO STM32

Bình luận

Bình luận