Keil uVision MDK-Lite, STM32F072B- 발견 보드 및 플래시 API


10

STMicroelectronics STM32F072B-Disco "Discovery"보드와 함께 MDK-Lite 버전 5.23을 사용하고 있으며 Discovery 샘플에서 제공하는 Flash 예제를 사용하려고합니다.

이 보드와 툴체인을 다른 예제로 사용했으며 SPI 및 GPIO 작업을 코딩했습니다. IDE는 챔피언처럼 작동합니다. 그러나이 특정 프로젝트의 경우 재설정 버튼을 다운로드하여 사용하여 코드를 빌드하고 실행할 수 있습니다. HAL_FLASHEx_Erase () 루틴을 사용하자마자 프로젝트에서 디버거를 사용할 수 없습니다. 해당 루틴을 실행하면 IDE에 "대상에 액세스 할 수 없습니다. 디버그 세션 종료"대화 상자가 나타납니다.

가치가있는 것은 코드를 다운로드 한 다음 재설정 버튼을 눌러 코드를 실행하면 작동하기 때문에 프로그래밍 오류가 아니라는 것을 알고 있습니다. TI 보드와 동일한 디버거를 사용했으며 플래시를 프로그래밍하고 플래시 루틴을 실행할 수도있었습니다. 코드가 저장된 플래시 부분을 지우지 않을 것이라고 확신합니다. 그렇지 않습니다.

main.c 에서이 줄을 넘어 서면

if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)

그런 다음 디버그 세션을 삭제합니다. 대신 같은 줄로 들어간 다음 플래시 지우기 루틴의 각 호출을 단계별로 실행하면 작동하고 결국 루틴에서 빠져 나와 나머지 코드를 디버깅 할 수 있습니다.


확실하지 않지만 CMSIS-DAP의 USB쪽에 전원이 공급되었을 수 있습니다. 이 보드는 외부 디버그 구성 요소를 위해 상당히 복잡한 전원 분배를합니다. 대상에 액세스 할 수없는 것은 DAP에 대한 직렬 직렬 연결이 끊 겼음을 의미합니다.
Sean Houlihane

온보드 ST-LINK / V2를 디버거로 사용하고 있습니까?
Bence Kaulics 2007 년

코드 이미지를 공유 할 수 있으면 다른 사람이 확인하여 하드웨어 문제를 배제 할 수 있습니다. M7 보드 만 있습니다.
Sean Houlihane

stm32f072B- 디스코 보드에 내장 된 디버거 인 Bence Kaulics. ST-LINK / V2 인 Keil ULINK2 디버거가 아닌 ST-Link 디버거입니다. Keil USB 연결 디버거 중 하나가 있지만 리본 케이블로 보드에 연결됩니다. 리본 케이블 커넥터가 아닌 보드의 미니 USB ST- 링크 커넥터를 사용하고 있습니다. 보드는 별도의 전원 공급 장치가 아닌 미니 USB 커넥터에서 전원을 끌어옵니다.
netskink

1
코드 샘플에 대하여. 샘플은 STMicro의 감지 저장소에 의해 제공됩니다. ST 저장소의 프로젝트 경로는 Projects / STM32F072B-Discovery / Examples / FLASH / FLASH_EraseProgram입니다. 해당 디렉토리에서 MDK-ARM 프로젝트를 사용하고 있습니다. 108 행에서 실패하여 HAL_FLASHEx_Erase ()를 수행합니다.
netskink

답변:


7

내 생각에 이것은 어떤 수준의 전원 공급 장치와 관련이 있습니다. 외부 전원 공급 장치 또는 파워 레일의 온보드 스위칭입니다.

시나리오를 명확히하기 위해 하드웨어 재설정 후 디버그가 제대로 작동하지만 대상이 플래시 블록을 지울 때 디버그 연결이 끊어 집니까?

디버그는 코드가 올바르게 실행되는 것을 신경 쓰지 않습니다. 잠금 상태 일 수 있으며 디버그를 중지해도 여전히 작동합니다. CPU 측에서 디버그를 잠그는 유일한 것은 교착 상태 AHB 액세스입니다. 이것은 문제가 STM32F7과 온보드 USB-SWD 인터페이스 칩 (STM32라고도 함) 사이의 SWD 인터페이스에 문제가 있음을 의미합니다. 이 장치에는 보드를 처음 사용할 때 혼동되는 온보드 전원 레일 전환 기능이 있습니다.

플래시 소거는 장치의 전류 소모를 증가시킬 것입니다. 외부 PSU가 작업에 달려 있습니까?

편집 : 문제의 코드를 단계별로 실행하면 디버거가 중단되는 피드백을 기반으로 한 단계 씩 수행하지 않지만 문제는이 질문 과 관련이 있다고 생각합니다 .

스텝 오버는 중단 점 (및 정지 상태 폴링)을 사용하여 구현되는 반면 단일 단계는 하드웨어에서 지원됩니다. 이것은 여전히 ​​디버거가 혼란스러워 보이는 이유를 설명하지는 않지만 플래시 컨트롤러가 활성화되어있는 동안 디버거가 (플래시에서) 코드에 액세스하려고 할 수 있습니다.

이러한 관찰을 바탕으로 지우기 후에 중단 점을 설정 하고이 시나리오를 트리거하지 않도록하십시오.


올바르게 작동하지만 블록을 지우면 디버거에 대한 USB 연결이 끊어집니다. 전원이 공급되지 않는 USB 허브를 사용하고 있었기 때문에 논리적으로 보였습니다. 그러나 컴퓨터에 직접 연결하고 다른 허브를 사용하면 동일한 결과가 나타납니다.
netskink

플래시 액세스를 수행하는 동안 코드를 실행하는 경우 AHB를 교착 상태에있게됩니다. 이 시나리오에서 스테핑이 어려울 수 있습니다. stackoverflow.com/questions/3445598 더 있습니다.
Sean Houlihane 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.