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ỉ
 

NgoHungCuong

http://ngohungcuong.com
#6
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ỉ
ai bảo vậy chứ
ít ra còn có kid, kid đang đặt mua mấy con arm từ anh Vũ bên arm.vn
sắp tới kid tìm hiểu về arm mong mọi người giúp kid nhé
thân
 

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