Untitled Document

EXTERNAL INTERRUPT với STM32F303CC

  1. Giới thiệu sơ lược về EXTI.
  2. GPIO_EXTI thực ra là ngắt ngoài trong thư viện chuẩn. Lưu ý là mỗi PORT(16 chân GPIO) chỉ có 6 vector:

    • Từ chân Px0 -> Px4 : mỗi chân 1 line ngắt.
    • Chân Px5 -> Px9 : chung 1 line ngắt.
    • Chân Px10 -> Px15 : chung 1 line ngắt.

    Mức ưu tiên ngắt được chia làm cấu hình bao gồm 2 thông số là PreemptionPriority và SubPriority với tổng số bit là 4. PreemptionPriority được ưu tiên số 1, càng nhỏ càng ưu tiên hơn, nếu PreemptionPriority bằng nhau thì xét đến SubPriority, SubPriority càng cao càng ưu tiên hơn.

  3. Tạo project với MXCUBE.
    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.
    2. Chọn loại MCU, Double click vào tên MCU được tìm thấy hoặc bấm vào Start project để bắt đầu quá trình cài đặt. Lưu project lại rồi bắt đầu cấu hình. Cấu hình thạch anh, chuẩn nạp trước tiên. Bài này sử dụng 1 button(mình sử dụng chân PB8, cấu hình GPIO_EXTI) và 1 led (sử dụng chân PB9, output). Click chuột trái để chọn chức năng cho ngoại vi.Click chuột phải để tạo nhãn cho chân ngoại vi cho dễ nhìn.
    3. Cấu hình clock ở tab clock configuration. Tùy thuộc vào thạch anh sử dụng và các ứng dụng khác nhau mà chỉnh tốc độ clock ở các mode khác nhau. Ở đây mình đã sử dụng thạch anh 8Mhz nên có thể điều chỉnh tốc độ tối đa của HCLK là 72Mhz. Những chỗ nào mà chương trình cho phép thay đổi giá trị thì chỗ đó được phép thay đổi clock. Chúng ta có thể quan sát được đầu ra của tất cả các ngoại vi. Khá rõ ràng đúng không.
    4. Tab configuration . Chúng ta sử dụng GPIO và ngắt nên quan tâm đến tab GPIO và NVIC trong mục System. Các thông số như sau:
      1. Tab GPIO:
        • Chân LED PB9: Cấu hình chân LED này mình đã đề cập ở bài 02 nên phần này mình sẽ không đề cập nữa.
        • Chân Button ngắt PB8:
          • GPIO mode: Ở đây cấu hình là ngắt input nên sẽ có nhiều mode để lựa chọn đó là ngắt cạnh lên, cạnh xuống, cả cạnh lên và xuống, ngắt kết hợp với sự kiện ngoài.
          • GPIO pull up/ pull down: có điện trở kéo lên nguồn +3V3 hay xuống GND không.
          • User label: sử dụng nhãn để dễ dàng quản lí.
      2. Tab NVIC:
        • Priority group : chọn số bit ưu tiên của pre-emption và subpriority . tổng số bit của 2 chế độ này là 4 bit.
        • Bảng interrupt table cho phép lựa chọn các ngắt xảy ra và mức ưu tiên, các ngắt hệ thộng mặc định được chọn ở trên và không thay đổi được.
        • Tab code generate -> NVIC: cho phép cấu hình sinh ra chương trình con cho phép ngắt, cấu hình ưu tiên ngắt riêng hay chung.
        • Generate IRQ handle: Có được sinh ra chương trình con ngắt trong file stm32f3xx_it.c hay không.
    5. Cài đặt file xuất ra cho project : vào Project -> settings.
      1. Tab project :
        • Projetc name : chứa tên gọi của project.
        • Project location : chứa nơi lưa trữ project.
        • Toolchain /IDE : chọn trình biên dịch mà mình mong muốn.
      2. Tab code generate :
        • STM32Cube firmware library package : chọn Copy only the nesscessary library files … để chỉ add những file thư viện cần thiết.
        • Các thư mục khác để mặc định chưa cần quan tâm đến.
      3. Tab Advanced Settings : để các thông số mặc định.
    6. Xuất code sau khi cài đặt : Project -> code generate hoặc click vào biểu tượng. Sau khi code được sinh ra click vào open project để mở project đó lên.
  4. Chỉnh sửa code trên keil C.
  5. Yêu cầu: mỗi lần nhấn nút ở chân PB8(dùng ngắt ạnh xuống), led ở chân PB9 sẽ đảo trạng thái, trạng thái ban đầu là tắt. Để chạy được chương trình ở lần đầu tiên, cần chọn reset and run trong options of target.

    Vì có ngắt xảy ra nên chúng ta sẽ thêm code thực thi khi có ngắt xảy ra trong file stm32f3xx_it.c . Tìm đến chương trình ngắt ngoài và thêm code sau:

    HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); : đảo trạng thái led ở chân PB9 mỗi khi có sự kiện ngắt xảy ra.

    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8); : chương trình thực thi ngắt bao gồm xóa cờ ngắt, reset các trạng thái… chương trình  này mặc định được MXCUBE sinh ra.

    Lưu ý : nhớ thêm code vào giữa phần begin và end để không mất code khi generate code lần 2.

  6. Bài tập
    1. Cấu hình chân button chân PB8 ở chế độ ngắt cả cạnh lên và cạnh xuống, quan sát hiện tượng xảy ra.
    2. Sử dụng button ở 2 chân PB8, PB7 ngắt cạnh xuống để thay đổi trạng thái led ở chân PB9 . Lưu ý: trường hợp cả 2 chân này cùng 1 line ngắt, đòi hỏi cần phải xử lý thêm trong chương trình ngắt.


Link tải ví dụ demo exti