2014-12-23 23 views
8

Tôi có một ứng dụng mà tôi đang chuyển từ IDE Kiel để xây dựng với chuỗi công cụ GNU do các vấn đề về giấy phép. Tôi đã thành công có thể thiết lập, xây dựng, flash và chạy ứng dụng trên thiết bị.STM32 WWDG ngắt kích hoạt khi không được cấu hình

Ứng dụng trên phía GNU là vì một lý do nào đó bị kẹt trong trình xử lý IRQ được liên kết yếu cho WWDG, đó là vòng lặp vô hạn. Ứng dụng không bật WWDG và ứng dụng này bị vô hiệu hóa khi đặt lại theo mặc định. Tôi cũng đã xác minh rằng các thanh ghi cấu hình có giá trị khởi động mặc định của chúng.

Sự khác biệt duy nhất, ngoài trình biên dịch, là tệp liên kết và tệp khởi động. Tuy nhiên, cả tệp khởi động và tệp liên kết được sử dụng bởi cả hai chuỗi công cụ đều là mặc định được tạo bởi STM.

Bất kỳ ý tưởng nào có thể gây ra điều này? Tôi sắp kết thúc ở đây.

Sử dụng stm32f103XX, hãy cho tôi biết nếu có bất kỳ thông tin nào khác hữu ích.

EDIT: Sử dụng các nhận xét bên dưới Tôi đã có thể khẳng định rằng trên thực tế, HardFault_Handler đang được kích hoạt. Tôi có bao gồm sản lượng backtrace dưới đây nếu mà bạn có thể giúp đỡ

GDB BT:

0 HardFault_Handler()

1 (xử lý tín hiệu gọi là)

2 0x720a3de tại ??()

3 0x80005534 trong foo()

backtrace ngừng: khung trước giống với khung này

2 điều nổi bật với tôi, mặc dù im không có chuyên môn gdb (stack tham nhũng?). 1) foo không phải là hàm, nó là mảng const của ký tự và 2) 0x0720a3de không phải là địa chỉ bộ nhớ hợp lệ phạm vi địa chỉ flash bắt đầu tại 0x08000000

+1

Bạn có chắc chắn đó thực sự là WWDG không? Một 'while (1);' có thể đang chia sẻ mã đó do tối ưu hóa. Tệp bản đồ có chỉ hiển thị WWDG tại địa chỉ đó không? –

+0

Bạn có thể đang gặp phải điều gì đó. Có vẻ như trong tập tin .elf tất cả các ký hiệu irq mặc định trỏ đến cùng một địa chỉ, mà tôi cho rằng nó chỉ là trùng hợp ngẫu nhiên rằng tên WWDG_IRQ là ues trong trình gỡ lỗi. Tôi sẽ thêm các chức năng liên kết stong cho irq của vì vậy tôi có thể tìm ra cái nào chính xác là thủ phạm. – gettingSmarter

Trả lời

7

Vì vậy, nhờ vào đá trong quần của D Krueger. Tôi đã có thể đoán ra rằng HardFault_Handler là thứ thực sự được gọi. Vì vậy, bất kỳ ai tình cờ gặp bài đăng này, hãy xác minh xem IRQ nào thực sự được gọi bằng cách viết các hàm tạm thời để bao gồm các thủ phạm có thể có nghĩa là HardFault. Các vấn đề thực sự cho cuộc gọi IRQ là một truy cập bộ nhớ xấu bởi memcpy mà tôi đang trên con đường của tôi để giải quyết tiếp theo.

+0

Tôi khá chắc chắn rằng bạn sẽ thấy rằng truy cập bộ nhớ xấu không phải là "* bởi memcpy *", mà là * cuộc gọi của bạn * để ghi nhớ. – Clifford

+2

Thủ phạm cuối cùng hóa ra là lỗi của tôi liên kết với các tùy chọn chính xác mà tôi đã biên dịch. Tôi quên liên kết với các tùy chọn -mthumb và -mcpu = cortex-m3. Vì vậy, tôi đã liên kết với các thư viện c không chính xác. – gettingSmarter

4

Tôi đã có lỗi giống như OP (ngắt WWDG rõ ràng, nhưng thực sự bắn HardFault_Handler) khi chuyển một ví dụ cho bảng khám phá STM32F3 để biên dịch trong CooCox CoIDE 1.7.7 với thư viện STM32Cube F3 (v1.1.0). Các mã chạy tốt miễn là tôi đã không cố gắng sử dụng bất kỳ ngắt, nhưng ngay sau khi tôi bật bộ đếm thời gian SysTick ngắt, ngoại lệ HardFault vấp.

Vấn đề là tôi đã bỏ quên bao gồm các tệp stm32f3xx_it.h và stm32f3xx_it.c trong dự án. Sự vắng mặt của họ không gây ra bất kỳ cảnh báo/lỗi trình biên dịch nào. Khi chúng được biên dịch & được liên kết trong, mã có ngắt được chạy tốt.

0

Tôi gặp sự cố rất giống nhau khi hợp nhất hai dự án được tạo riêng bởi STM32CubeMX cho bộ xử lý STM32F2XX. Một dự án đang sử dụng Ethernet ngoại vi, trong khi dự án kia thì không. Bên cạnh đó một sự khác biệt, hai dự án sử dụng cùng một tập hợp các thiết bị ngoại vi.

Sau khi tích hợp hai dự án với nhau bằng cách sao chép thủ công tệp, ứng dụng sẽ kết thúc trong WWDG_IRQHandler sau khi bắt đầu tác vụ đầu tiên (khi lần đầu tiên được bật). Lần đầu tiên tôi xác nhận rằng bit WDGA của thanh ghi WWDG thực sự không được thiết lập và do đó, thiết bị ngoại vi WWDG đã bị tắt. Tiếp theo, tôi đã xác minh rằng bảng vectơ ngắt được khởi tạo chính xác. Cuối cùng, sau vài giờ đào, tôi nhận ra rằng tôi đã không định nghĩa hàm ETH_IRQHandler trong stm32f2xx_it.c, điều này đã kích hoạt ngắt Ethernet được xử lý bởi trình xử lý mặc định, tự che dấu là WWDG_IRQHandler - có khả năng do tối ưu hóa.

0

Tôi đã gặp sự cố này do nguyên nhân gốc giống như awilhite. Tôi đang sử dụng Atollic TrueStudio 8.0.0. Tôi đã sử dụng nó để bắt đầu một dự án cho STM32F030 và (có thể là thủ công) thêm thư viện thư viện với stm32f0xx.h, định nghĩa ADC1_IRQn (số kênh IRQ được sử dụng trong thiết lập NVIC).

Và tôi thực hiện ADC1_IRQHandler (void) trong main.c của tôi (như tôi đang sử dụng để và nó luôn luôn làm việc cho đến nay - x_IRQn -> x_IRQHandler)

Nhưng sau 2 ngày thất vọng, tôi phát hiện ra, rằng startup_stm32f0xx.s trong dự án của tôi định nghĩa ADC1_COMP_IRQHandler.

Vì vậy, cuối cùng, trình xử lý ngắt ADC của tôi không được xác định và khi ADC tạo ngắt, chương trình bị lỗi (ngắt WWDG).

Tôi hy vọng điều này sẽ giúp những người như tôi, những người nghĩ rằng họ đã thực hiện xử lý của họ, nhưng trên thực tế, họ không.

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