2015-09-11 27 views
6

tôi có một chương trình 3.x ChibiOS trên một vi điều khiển STM32F4 nơi tôi sử dụng các cơ quan giám sát IWDG để reset MCU về lỗi như thế này:Vô hiệu hóa STM32 IWDG trong gỡ lỗi

int main() { 
    iwdgInit(); 
    iwdgStart(&IWDGD, &wd_cfg); 
    while(true) { 
     // ... do stuff 
    } 
} 

Nếu bây giờ tôi đính kèm debugger của tôi và , tại bất kỳ thời điểm nào, dừng chương trình (thủ công hoặc qua điểm ngắt), vi điều khiển sẽ đặt lại sau khi hết thời gian chờ do cấu hình cơ quan giám sát xác định (và do đó gây ra sự cố trong quá trình gỡ lỗi của tôi)

Làm cách nào để tắt hành vi này làm thế nào tôi có thể vô hiệu hóa IWDG trong khi lõi được dừng lại do trình gỡ lỗi?

Tôi đã thử vô hiệu hóa hoàn toàn, tuy nhiên, tôi cần phải để nó chạy để bắt đặt lại IWDG không mong muốn.

+0

Các IWDG bị tắt theo mặc định, vì vậy bạn chỉ có thể để nó tàn tật cho đến khi bạn bắt đầu thử nghiệm các mã cuối cùng. Nếu bạn muốn làm các hướng dẫn cho STM, bạn sẽ tốt hơn nhiều ở wiki STM32. Stack tràn là một Q & A, không phải là một trang web hướng dẫn. – Olaf

+0

@Olaf a) Hãy yên tâm rằng các hướng dẫn của tôi trông hoàn toàn khác với điều này. Đây là một câu hỏi cụ thể với một câu trả lời cụ thể, nói cách khác là một Giải Đáp. Bạn có ý nghĩa gì về STM32 wiki? b) Giả định của bạn là sai. Mặc dù trong giai đoạn phát triển ban đầu, điều này có thể hoạt động Tôi có khá nhiều giai đoạn mà tôi cần * IWDG để đặt lại nếu bộ hẹn giờ WDG hết, ví dụ: để thu thập dữ liệu về hành vi (hành vi sai) trong hoạt động mạng có tải trọng cao (liệu cơ quan giám sát có được đặt lại không?). Chờ đợi cho đến khi sản xuất với điều này sẽ là ngu ngốc. Ngoài ra câu trả lời cho điều này là khá quan trọng đối với thử nghiệm sản xuất. –

+2

@Olaf Vì vậy, không có câu hỏi STM32 nào được hỏi * ở tất cả * vì tất cả đều nằm trong tài liệu? Tôi không thực sự nghĩ rằng lập luận này hoạt động. Nếu bạn nghĩ rằng đây là một câu hỏi không đủ nghiên cứu, downvote và/hoặc bỏ phiếu để đóng. Tôi cho rằng bạn đã làm điều đó. Trong khi bạn đang làm điều đó, tôi sẽ viết nhiều giải pháp hơn cho các vấn đề thực tế, xin lỗi ... –

Trả lời

6

MCU STM32 chứa một tính năng được gọi là gỡ lỗi đóng băng. Bạn có thể dừng một số thiết bị ngoại vi, bao gồm thời gian chờ I2C, RTC và, tất nhiên, cơ quan giám sát.

Trong STM32 reference manual, hãy tham khảo mục 38.16.4ff.

IWDG đang chạy trên xe buýt APB1. Vì vậy, bạn cần phải sửa đổi DBGMCU_APB1_FZ, đặc biệt nhất khẳng định bit DBG_IWDG_STOP trong thanh ghi đó.

Giá trị POR (= giá trị mặc định) cho thanh ghi này là 0x0, tức là nếu bạn không chủ động vô hiệu hóa nó, IWDG sẽ vẫn chạy.

int main() { 
    // Disable IWDG if core is halted 
    DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP; 
    // Now we can enable the IWDG 
    iwdgInit(); 
    iwdgStart(&IWDGD, &wd_cfg); 
    // [...] 
} 

Lưu ý rằng khi không tạo điều kiện cho các cơ quan giám sát trong phần mềm, nó vẫn có thể được kích hoạt trong phần cứng nếu các bit WDG_SW được thiết lập lại trong các byte tùy chọn đèn flash.

Nếu bạn đang sử dụng ST HAL (không nằm trong ChibiOS, xem STM32CubeF4), bạn cũng có thể sử dụng macro này:

__HAL_DBGMCU_FREEZE_IWDG() 

(mà về cơ bản không chính xác giống như chúng tôi đã làm ở trên)

Ngoài ra, bạn cần bật đồng hồ DBGMCU trên APB2.

__HAL_RCC_DBGMCU_CLK_ENABLE(); 
3

Khi sử dụng ST HAL, macro quyền sử dụng là:

__HAL_DBGMCU_FREEZE_IWDG() 
+0

Điểm tốt, cảm ơn bạn đã thêm điều này. Hầu hết thời gian tôi không sử dụng HAL ít nhất cho các công cụ đơn giản, tuy nhiên tôi cho rằng hầu hết mọi người thường sử dụng ST HAL vì vậy điều này có thể rất hữu ích cho họ. –

Các vấn đề liên quan