Skip to content

2 Tạo mẫu dự án

Cài đặt gói thiết bị

Có hai phương thức: cài đặt trực tuyến và cài đặt ngoại tuyến

Cài đặt trực tuyến

Trước tiên, mở Keil uVision và nhấp vào biểu tượng xanh lá.

Keil Pack Manager mở lần đầu

Đóng cửa sổ bật lên.

Cửa sổ chính của Pack Manager

Bạn sẽ thấy danh sách, chọn STM → STM32F407VEx.

Chọn thiết bị STM32F407VEx

Đang chờ cài đặt........

Nếu xuất hiện lỗi, khả năng cao là do vấn đề về mạng, bạn có thể chuyển sang cài đặt ngoại tuyến trực tiếp.

img

Nút xuất hiện thông báo này có nghĩa là đã cài đặt thành công, bạn có thể đóng cửa sổ rồi.

img

Cài đặt ngoại tuyến

Địa chỉ tải xuống chính thức: https://www.keil.arm.com/packs/stm32f4xx_dfp-keil/boards/

Chúng tôi nhấn vào để tải xuống này.

img

Chờ đợi quá trình tải xuống hoàn tất, sau đó nhấp đúp để cài đặt.

img

Chúng ta tiếp tục nhấn Next để tiếp tục bước tiếp theo.

img

Nhấp tiếp theo một cách máy móc, chờ quá trình cài đặt hoàn tất.

Sau khi cài đặt xong, sẽ có một thư mục STM32F4xx_DFP nằm trong thư mục cài đặt của phần mềm Keil:

Lưu ý rằng thư mục packs này là do tôi tự thiết lập khi cài đặt Keil, chúng ta không cần quan tâm đến các phần khác, chỉ cần sử dụng chức năng tìm kiếm để tìm thư mục này là chứng tỏ đã cài đặt thành công.

img

Lấy thư viện firmware chuẩn

Địa chỉ tải xuống chính thức: https://www.st.com/zh/embedded-software/stsw-stm32065.html

img

Nếu bạn chưa có tài khoản, có thể đăng ký một cái.

Giới thiệu thư mục thư viện firmware chuẩn

Giới thiệu thư mục

Mở thư viện tiêu chuẩn firmware STM32F4xx đã tải xuống, bên trong thư mục như hình minh họa.

img

  • Libraries:Thư mục này chứa 3 thư mục con, gồm CMSIS và thư viện thiết bị tiêu chuẩn, chứa các hàm thư viện do chính thức đóng gói, giúp người dùng phát triển dễ dàng hơn.
  • Project:Thư mục này là thư mục mẫu dự án và mã ví dụ do chính thức biên soạn, liên quan đến phần lớn các chức năng của chip.
  • Utilities:Thư mục này chứa một số thành phần bên thứ ba và các tệp dành cho bảng phát triển kèm STM32.

Dự án mẫu

Examples thư mục, nội dung như hình đã hiển thị.

img

img

Từ hình trên có thể thấy, thư mục này chứa các ví dụ về các thiết bị ngoại vi khác nhau, mỗi thư mục còn có các ví dụ chức năng chi tiết hơn, rất có giá trị tham khảo cho việc phát triển của chúng ta. Chúng ta nhất định phải xem nhiều, đọc nhiều, sử dụng nhiều.

Thư viện

Sau khi mở thư mục Libraries, nội dung hiển thị như hình.

img

  • CMSIS:Tiêu chuẩn Giao diện Phần mềm Bộ điều khiển Vi xử lý (CMSIS:Cortex Microcontroller Software Interface Standard) là tầng trừu tượng phần cứng độc lập dành cho dòng vi xử lý Cortex-M.
  • STM32F4xx_StdPeriph_Driver: Nhìn từ tên gọi cũng rõ, đây là thư viện ngoại vi tiêu chuẩn của dòng STM32F4, chứa các hàm đóng gói đăng ký, phần mềm phát triển của chúng tôi dựa vào thư viện này để phát triển, bao phủ phần lớn các chức năng của vi xử lý STM32F4, bao gồm ADC, CAN, SDIO, SPI, v.v.

Tiện ích

Đây là thư mục thành phần bên thứ ba, chúng tôi không cần quá quan tâm.

Tạo mẫu thư viện firmware chuẩn

Gợi ý tải trực tiếp mẫu thiết kế sẵn dưới đây:

Mẫu dự án trống

Điều kiện tiên quyết

  • Đã cài đặt phần mềm Keil
  • Đã cài đặt gói Pack của STM32F4xx
  • Đã tải về thư viện firmware tiêu chuẩn STM32F4xx

Tạo thư mục dự án mới

Tạo thư mục mới, đặt tên là STM32F407_ProjectTemplate, để lưu dự án mới.

Sau đó, trong thư mục này, tạo 6 thư mục con, đặt tên là:

  • project:Chứa các tập tin dự án (hiện chỉ hỗ trợ MDK5).
  • libraries:Chứa các thư viện khác nhau, CMSIS, thư viện firmware chip, thư viện hệ thống tệp, thư viện mạng, v.v.
  • board:Chứa các tập tin khởi tạo và liên kết của bo mạch.
  • app:Chứa ứng dụng, do người dùng viết và chứa hàm main.
  • bsp:Chứa gói hỗ trợ liên quan đến phần nền tảng.
  • module:Chủ yếu chứa các module phần mềm khác nhau, như bộ định thời phần mềm, PID, FIFO, máy trạng thái, v.v.

img

Sau đó, tạo một thư mục mới trong thư mục project: MDK(V5)

img

Trong thư mục STM32F407_ProjectTemplate, tạo một tệp mới README.md như hình mô tả.

img

Sao chép các tập tin dự án

Tìm thư mục tải xuống của kho firmware của chúng tôi, sao chép toàn bộ nội dung trong thư mục STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries vào thư mục libraries mới tạo.

img

Tìm trong thư mục \STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Project\STM32F4xx_StdPeriph_Templates

  • file stm32f4xx_conf.h
  • file stm32f4xx_it.c
  • file stm32f4xx_it.h

Sao chép vào thư mục module

img

Chúng tôi tải xuống và kéo thư mục board vào thư mục STM32F407_ProjectTemplate để thay thế.

Tải xuống thư mục board

📌 Trung tâm tải xuống (bấm để chuyển hướng)

📌 Trong Tthư mục tài nguyên có file STM32F407_ProjectTemplate.zip nằm trong đó.

Trong file nén có thư mục board, sau khi tải xuống có thể sử dụng ngay!!!

Tạo dự án Keil mới

Trong thư mục project đã tạo ở trên, tạo một thư mục MDK(V5) để chứa các tệp dự án của keil MDK ARM V5. Mở Keil uVision5 và tạo dự án mới: Nhấn ->Project ->New uVision Project -> Chọn loại chip STM32F407VETx.

img

Tạo nhóm và thêm file nguồn

Nhấn chuột phải vào Target-> Nhấp vào Quản lý các mục dự án như hình dưới đây để thiết kế nhóm (nhấp đôi để chỉnh sửa tên):

img

img

Thêm tập tin startup_stm32f40xx.s trong thư mục \libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm vào nhóm STARTUP (Lưu ý cuối cùng phải nhấp vào nút OK góc dưới bên trái của hộp thoại để thay đổi có hiệu lực)

Tập tin khởi động được viết bằng hợp ngữ, là đoạn mã thực thi đầu tiên sau khi bật nguồn hoặc reset:

  1. Cấu hình kích thước bộ nhớ đệm và con trỏ PC.
  2. Cấu hình bảng vector ngắt: thiết lập vị trí của bảng vector ngắt để CPU có thể tìm thấy chương trình dịch vụ ngắt phù hợp khi xảy ra ngắt.
  3. Định nghĩa hàm xử lý mặc định cho dịch vụ ngắt: thường sẽ định nghĩa một hàm xử lý ngắt mặc định, khi không có hàm xử lý ngắt cụ thể, sẽ gọi hàm này. Trong một số tập tin khởi động, các hàm xử lý ngắt này được định nghĩa yếu (weak), cho phép chúng ta ghi đè lại trong mã C của mình.
  4. Khởi tạo đồng hồ hệ thống.
  5. Chuyển hướng tới hàm main trong ngôn ngữ C.

img

Thêm tệp system_stm32f4xx.c từ thư mục \STM32F407_ProjectTemplate\libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates vào nhóm Ứng dụng:

img

Thêm tất cả các tệp trong thư mục \STM32F407_ProjectTemplate\libraries\STM32F4xx_StdPeriph_Driver\src vào nhóm Driver:

img

Thêm tệp \board trong thư mục board.c vào thư mục Board

img

Thêm README.md vào thư mục DOC. (Lưu ý: Phải chọn loại tệp là All files để có thể thấy các tệp có đuôi .md)

img

Sau đó chúng ta tạo một file main.c mới và thêm vào thư mục APP.

img

Thêm đường dẫn tệp tiêu đề

img

img

Cấu hình dự án

Nhấp vào đũa phép để mở trang

img

  • Chọn Create HEX File
  • Sử dụng thư viện nhỏ
  • Thêm định nghĩa macro toàn cục:
c
USE_STDPERIPH_DRIVER,STM32F40_41xxx,

Ngôn ngữ C sử dụng tiêu chuẩn C99

img

img

img

Chỉnh sửa dự án

Sửa mã cần chúng ta gỡ bỏ quyền đọc ghi của thư viện tiêu chuẩn

Có biểu tượng chìa khóa nhỏ biểu thị chỉ đọc

img

img

img

Lúc này chúng ta phát hiện biểu tượng chìa khóa nhỏ đã biến mất:

img

Trời sao có một vòng đeo tay tích hợp một bộ dao động thạch anh ngoài có độ chính xác cao 8M, chúng tôi thiết lập sử dụng bộ dao động ngoài, chỉnh sửa dòng 137 trong tệp stm32f4xx.h thành: 8000000

img

Chỉnh sửa file system_stm32f4xx.c:

  • Hàng 364
  • Hàng 394
  • Hàng 396

Thay số trong hình:

img

Xóa một số dòng trong tập tin stm32f4xx.h được khoanh ở bên dưới

img

Chúng tôi sẽ loại bỏ tệp stm32f4xx_fmc.c khỏi nhóm

img

Biên dịch và kiểm thử

Thay thế mã trong main.c bằng:

c
/*
 Phần mềm và phần cứng của bo mạch phát triển Lichuang và các bo mở rộng liên quan đều được mã nguồn mở hoàn toàn trên trang web chính thức
 *Trang web chính thức của bo mạch phát triển: www.lckfb.com
Hỗ trợ kỹ thuật thường trực trên diễn đàn, hoan nghênh trao đổi và học hỏi mọi vấn đề kỹ thuật bất kỳ lúc nào
 *Diễn đàn Lichuang: club.szlcsc.com
 *Theo dõi tài khoản bilibili: 【立创开发板】để cập nhật những thông tin mới nhất của chúng tôi!
 *Không kiếm tiền từ việc bán bo mạch, mà lấy việc đào tạo kỹ sư Trung Quốc làm sứ mệnh.
 */
#include "board.h"

int main(void)
{

        board_init();

        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        while(1)
        {
                GPIO_SetBits(GPIOB, GPIO_Pin_2);
                delay_ms(500);

                GPIO_ResetBits(GPIOB, GPIO_Pin_2);
                delay_ms(500);
        }


}

Chúng tôi nhấp vào biên dịch

img

Phát hiện 0 lỗi, 0 cảnh báo, như vậy mẫu dự án của chúng ta đã hoàn thành!

img