마이크로 컨트롤러 프로그램 플래시 메모리를 사용하여 사용자 구성을 저장할 수 있습니까?


9

PIC18F 와 같은 많은 마이크로 컨트롤러 에는 플래시 프로그램 메모리가 있습니다. "플래시 프로그램 메모리는 정상 작동 중에 읽고 쓸 수 있습니다." 이것은 프로그램 메모리에 일부 사용자 구성을 저장할 수 있음을 의미합니까?

답변:


12

그래 넌 할수있어. 나는 이것을 여러 번했다.

그러나 별도의 EEPROM을 사용하는 것과 관련하여 몇 가지 단점이 있습니다.

  1. 프로그램 플래시 메모리에 대한 수명 쓰기 횟수는 데이터 EEPROM보다 훨씬 적습니다.

  2. 프로세서는 지우기 및 쓰기 시간 동안 점심을 먹습니다.

  3. 프로그램 플래시가 블록 단위로 지워집니다. 단일 바이트 만 업데이트 할 수는 없습니다. 나는 보통 이것을 처리하기 위해 블록 캐싱 구성표를 사용합니다.


완벽하게, 당신은 어떻게 든 내 질문이 "프로그램과 사용자 데이터 모두에 프로그램 메모리를 사용할 수있는 동안 왜 EEPROM이 필요한지"라는 것을 아는 것 같습니다. :)
student1

Olin, 새 버전의 펌웨어를 PIC에 구울 때 모든 플래시가 지워 집니까? 펌웨어 다운로드 중에 플래시의 사용자 구성 (또는 교정 데이터)이 지워지는 것을 방지 할 수있는 좋은 방법이 있습니까? 이것은 펌웨어 개발 중 편의에 관한 것입니다. 사용자 구성이 가장 마지막 블록 또는 플래시에 저장 될 것이라고 생각합니다.
Nick Alexeev

6
@Nick : 사용중인 PIC 프로그래머에게 달려 있습니다. 내 모든 것을 포함하여 많은 사람들이 대량 지우기를 수행하므로 교정 데이터가 지워집니다. 캘리브레이션 데이터를 읽고 대량 지우기를 한 다음 캘리브레이션 데이터를 일반 프로그래밍 프로세스의 일부로 다시 작성하는 특수 프로그래밍 앱을 작성하는 경우가 있습니다. 일부 Microchip 프로그래머는 프로그램 메모리의 일부만 업데이트 할 수 있습니다. 코드 보호를 설정 한 경우 프로그래머가 대량 지우기를 수행해야합니다.
Olin Lathrop 2014

하버드가 아닌 프로세서 (MSP430을 생각하고 있음)에서는 코드를 RAM으로 복사하고 RAM으로 점프하여 플래시 쓰기 / 삭제가 실행되는 동안 실행할 수 있습니다. 나는 이것을 라디오에서 새로운 데이터를 동시에 쓰고 수신하기 위해 부트 로더에 사용했습니다.
markrages

@mark : 그렇습니다. 이것은 PIC32에서도 작동하며 RAM에서도 실행할 수 있습니다. 실제로는 더 빠릅니다.
Olin Lathrop

6

많은 PIC18에는 최대 1K 크기의 EEPROM 메모리가 있습니다. 불행히도 참조하는 PIC18F46J50은 그렇지 않습니다. EEPROM을 사용할 수있는 경우 EEPROM에 최소 1,000,000 회의 지우기 / 쓰기주기가 있고 플래시는 10,000 개이므로 데이터에 충분한 크기를 사용하는 것이 훨씬 좋습니다.

PIC18은 다른 대부분의 마이크로 컨트롤러와 마찬가지로 하버드 아키텍처 (Harvard architecture)를 사용합니다. 즉, 프로그램과 데이터에 대해 물리적으로 별도의 주소 지정 가능 영역이 있습니다 (즉, 프로그램 주소 4와 데이터 주소 4를 가질 수 있으며 동일하지 않음). 따라서 C 또는 어셈블리 언어의 일반적인 방법으로는 플래시 메모리를 읽거나 쓸 수 없습니다.

대신 PIC18 제품군에서 TBLPTR이라는 22 비트 레지스터에 시작 주소를 설정합니다. 플래시에서 바이트를 읽으려면 TBLRD 명령어를 사용합니다. 읽은 후 수동으로 수행하지 않아도 주소를 자동으로 늘리거나 줄일 수있는 옵션이 있습니다.

플래시 메모리에 쓰려면 먼저 덮어 쓸 하나 이상의 64 바이트 플래시 메모리 블록을 지워야합니다. TBLPTR에서 시작 주소를 다시 설정 한 후 지우기 작업을 초기화하기 위해 일부 다른 레지스터의 값을 설정 한 후에는 인터럽트가 비활성화되고 0x55 다음에 0xAA를 레지스터에 기록해야합니다. 이는 지우기 명령을 잠금 해제하며 잘못된 코드가 실수로 메모리를 지우는 것을 방지하는 데 필요합니다. 마지막으로 실제로 지우기를 수행하는 명령이 실행 된 다음 인터럽트를 다시 활성화합니다.

플래시 메모리에 쓰는 것은 지우는 것과 비슷하지만 블록 크기가 더 작습니다. 실제로 쓰기는 TBLWT 명령어를 사용하여 실행되며 TBLRD 명령어와 같은 자동 증분 / 감소도 가능합니다.

구성 데이터를 저장하는 것 외에도 플래시 메모리에 쓰면 "공기의 펌웨어"를 사용하여 현장에서 펌웨어를 업데이트 할 수 있습니다. 일반적으로 프로그램 메모리 시작시 Bluetooth 모듈, Wi-Fi, 셀룰러 모듈 또는 유선 연결에서 업데이트를 수신하고 특정 지점 이상으로 플래시를 업데이트 할 수있는 고정 된 펌웨어 블록이 있어야합니다. 새 코드가있는 프로그램 (예 : "울타리") 업데이트가 완료되면 재설정이 시작되고 새 코드가 사용됩니다.

PIC 제품군 외에 다른 많은 마이크로 컨트롤러는 플래시 메모리를 업데이트 할 수 있습니다. 대부분 구성 레지스터, 주소 포인터 및 작업을 수행하기위한 특수 명령의 조합을 사용합니다.


"공중의 펌웨어"방법은 매우 흥미로워 보입니다. 시스템 프로그래밍 (ISP)이 필요하지 않습니까?
student1

@ student1 업데이트를 나중에 처리 할 수 ​​있으려면 칩에 펌웨어를 설치해야하므로 ISP 인터페이스를 통해 칩을 처음 프로그래밍 할 필요가 없습니다. Arduino 보드에 사용 된 ATmega 마이크로 컨트롤러에는 Bootloader라고하는 이러한 유형의 펌웨어가 이미 있습니다. 따라서 ISP 인터페이스를 사용하여 Arduino에 스케치를 다운로드 할 필요가 없습니다. 그러나 부트 로더 자체를 업데이트하려면 ISP 인터페이스가 필요합니다. 이 부트 로더는 USB를 통한 업데이트 만 처리하므로 실제로 "무선 펌웨어"는 아닙니다.
tcrosley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.