답변:
그래 넌 할수있어. 나는 이것을 여러 번했다.
그러나 별도의 EEPROM을 사용하는 것과 관련하여 몇 가지 단점이 있습니다.
많은 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 제품군 외에 다른 많은 마이크로 컨트롤러는 플래시 메모리를 업데이트 할 수 있습니다. 대부분 구성 레지스터, 주소 포인터 및 작업을 수행하기위한 특수 명령의 조합을 사용합니다.