TUT STM32F103xx

demon52

Kỹ sư
#1
Hi all,
Mọi người cùng bắt tay code nào. Bài tập siêu kinh điển : toggle led:D
P/s: soft KeilC mọi người phải tự down và cài thư viện STM32 CMSIS như bên mục document mình post nhé, và cách tạo 1 project với Keil C nữa.
Thân
 

demon52

Kỹ sư
#3
Hi, mình để thời gian để nếu có ai thì cùng làm mà :)
B1: đọc mấy cái file stm32f10x.h để xem bọn STM nó cấu hình các thanh ghi các bit như nào. Mình cũng chưa xem hết.
B2: Các kiến thức cơ bản cần nắm
Điều khiển cổng GPIO của STM32F103C8T6
STM32F103RC có 2 cổng GPIO chính 16 pin là: Port A, Port B, còn Port C (chỉ có 3 pin PC13, PC14, PC15) và PortD ( chỉ có 2 pin PD1 PD0 chính là 2 chân OSC_In_Out). Để đ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
Để 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.
B3: Như mạch Stm32f103c8t6 Development Kit For Newbie | Cộng đồng Cơ điện tử Việt Nam

mình đã design, các port led chưa nối, giả sử nối vào 1 bên PortB, nó sẽ connect tới các chân PB1 PB3 ... PB15.
Và chúng ta cùng viết code:
-Đầu tiên cấu hình cho port B
Mã:
/* Enable GPIOB clocks */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Write(GPIOB,0x0000);
-Cấu hình các chân PB1, PB3, ...,PB15.
Mã:
/* Configure PB.1, PB.3, PB.5, PB.7, PB.9, PB.11, PB.13 and PB.15 as output push-pull */
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1  | GPIO_Pin_3  | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_9 |  GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-Code toggle led các pin đã chọn:
Mã:
while (1)
    {
        /* Toggle pins */
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_3)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_9)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_13)));
   
        GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_15)));
 
        /* Insert delay */
        Delay(3);
    }
-Và 1 hàm delay như đã viết ở trên:
Mã:
void Delay(__IO uint32_t num)
{
    __IO uint32_t index = 0;
 
    /* default system clock is 72MHz */
    for(index = (720000 * num); index != 0; index--)
    {
    }
}
Cuối cùng là sản phẩm ( debug trên keil C vì chưa có mạch thật )

Figure1: Led on​
Figure2: Led off​
Tham khảo bài viết của anh Vũ bên armvn
 

demon52

Kỹ sư
#4
Đã có mạch rồi nha anh em, chuẩn bị xõa tut nào :)
 

robotden

Sinh viên đại học
#5
mới chỉ có demon52 đang vọc dòng này à, diễn đàn mình ít người quan tâm mục này nhỉ
 

demon52

Kỹ sư
#7
OK let's go :) tớ vẫn là con số 0 tròn trĩnh mà :)
 

demon52

Kỹ sư
#9
Mai sẽ mượn được kit arm nhé :) Từ mai xõa dòng này nhé anh em :)
 

Quảng cáo Google