- Đăng vào
Cài đặt và tạo project lập trình STM32F103 bằng Keil MDK-ARM 5.22
Giới thiệu
Bài viết này sẽ hướng dẫn các bạn cài đặt Keil MDK-ARM phiên bản 5.22 và tạo một project để lập trình STM32F103. Đầu tiên các bạn download phần mềm và pack thư viện cho STM32F103
Ở project đầu tiên này sẽ hướng dẫ các bạn sử dụng các chân GPIO của con STM32F10 để đọc tín hiệu nút nhấn và xuất led. GPIO (General Purpose Input Output) trên STM32F103 có 4 chế độ (mode) đó là: input mode, output mode, analog input mode, alternate function mode. Để đọc tín hiệu từ nút nhấn chúng ta cần cài đặt chân GPIO gắn với nút nhất ở digital input mode Khi một chân GPIO của STM32F103 ở digital input mode thì nó có thể hoạt động ở một trong 3 trạng thái: input with internal pull-up, input with internal pull-down, and input floating. Điện áp logic của chip STM32F103 là 3.3V nên các chân GPIO cũng có mức điện áp ra là 3.3V, tuy nhiên một số chân có thể có mức điện áp tối đa tới 5V
Đặc tính của chân I/O khi hoạt động ở chế độ input
- The output buffer is disabled.
- The schmitt trigger input is activated.
- The weak pull-up and pull-down resistors are activated or not depending on input configuration (pull-up, pull-down or floating).
- The data present on the I/O pin is sampled into the input data register every APB2 clock cycle.
- A read access to the input data register obtains the I/O state.
Sơ đồ nguyên lý
Nút nhấn nối với chân PA1 ở chế độ input với internal pull-up (điện trở nội kéo lên) vì vậy khi nút được nhấn thì chân PA1 ở mức logic '0' và ngược lại. Đèn led nối với chân PA0
Code lập trình
Chương trình này sẽ lập trình để khi nút được nhấn thì đèn led sáng, không nhấn thì đèn led tăt
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
GPIO_InitTypeDef GPIO_InitStruct;
int main(void)
{
// Enable clock for GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Cofigure PA0 as open-drain output
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// Cofigure PA1 as input with internal pull-up resistor
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1)
{
// If button on PA1 is pressed (button circuit is active low)
if (!(GPIO_ReadInputData(GPIOA) & GPIO_Pin_1))
{
// Turn on LED on PA0 (LED circuit is active low)
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
else
{
// Turn off LED on PA0
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
}
}