สอบถามเรื่องเขียนการเขียน flash memory บน stm32F4 คับ

Started by joems, September 24, 2015, 07:35:28 PM

Previous topic - Next topic

joems

ผมจะทดลองเขียนข้อมูล ลงหมด Flash memory คับ ตอนนี้ผมใช้ Keil compiler เปิดดู config
มันเขียนว่า Flash เริ่มที่ 0x8000000  size: 0x100000 (1M)

ผมเปิด datasheet มันแบ่งเป็นแบบ sector ถ้าจะเขียน sector ไหน ต้อง erase ทั้ง sector ก่อนเขียนใหม่
มีคำถามว่า  Code image ที่เรา compiled มา จะดูยังไงคับ ว่าอยู่ตรงไหน  ผมจะได้ write flash ถูก

รบกวนผู้รู้ด้วย ชี้แนะด้วยคับ ขอบคุณคับ

diywizard

Quote from: joems on September 24, 2015, 07:35:28 PM
ผมเปิด datasheet มันแบ่งเป็นแบบ sector ถ้าจะเขียน sector ไหน ต้อง erase ทั้ง sector ก่อนเขียนใหม่

ไม่ต้องลบก่อนเขียนก็ได้ครับถ้า size ของการเขียนนั้นมีขนาดใหญ่กว่าหรือเท่ากับ sector size เพราะยังไงก็ต้องเขียนทับจริงไหมครับ?
ให้ไปลบเอา tail sector ดีกว่า (ไม่ต้องลบหมดนะในความคิดผม) แต่ถ้าชอบง่ายๆก็ลบก่อนเขียนก็ได้ครับไม่ต้องคิดมากดี

Quote from: joems on September 24, 2015, 07:35:28 PM
มีคำถามว่า  Code image ที่เรา compiled มา จะดูยังไงคับ ว่าอยู่ตรงไหน  ผมจะได้ write flash ถูก

อันนี้ยากแฮะ ถ้าหมายถึงต้องการรู้ว่า code เรา locate ที่ไหนตอน runtime ต้องสร้าง function ขึ้นมาตรวจสอบวนลูปเช็คแต่ละ sector ว่าว่างหรือเปล่าไล่มาจากทาง interrupt vector table ก่อนก็ได้ครับ (0x80000000) ถ้าเจอ sector อันแรกมีแต่ zero bytes ก็น่าจะสันนิษฐานได้ว่า sector นั้นเป็น sector ว่างครับ อันนี้ผมอาจจะผิดก็ได้ลองไปคิดอีกทีครับ

แต่ถ้าหมายถึงตอนที่ไม่ได้ run mcu อยู่ก็มี utility อยู่ตัวหนึ่่่่่่่งที่ชื่อว่า stm32 st-link utility เอาไว้ใช้ดู flash memory content ได้ครับ

joems

ขอบคุณมากคับ เดี๋ยวผมไปจัดตามนั้นดูคับ ^^    แต่ว่า Flash mem นี่มัน เขียนลยได้ เท่าพวก EEPROM เปล่าคับ


ruch

Quote from: diywizard on September 24, 2015, 11:37:46 PM
Quote from: joems on September 24, 2015, 07:35:28 PM
ผมเปิด datasheet มันแบ่งเป็นแบบ sector ถ้าจะเขียน sector ไหน ต้อง erase ทั้ง sector ก่อนเขียนใหม่

ไม่ต้องลบก่อนเขียนก็ได้ครับถ้า size ของการเขียนนั้นมีขนาดใหญ่กว่าหรือเท่ากับ sector size เพราะยังไงก็ต้องเขียนทับจริงไหมครับ?
ให้ไปลบเอา tail sector ดีกว่า (ไม่ต้องลบหมดนะในความคิดผม) แต่ถ้าชอบง่ายๆก็ลบก่อนเขียนก็ได้ครับไม่ต้องคิดมากดี

Quote from: joems on September 24, 2015, 07:35:28 PM
มีคำถามว่า  Code image ที่เรา compiled มา จะดูยังไงคับ ว่าอยู่ตรงไหน  ผมจะได้ write flash ถูก

อันนี้ยากแฮะ ถ้าหมายถึงต้องการรู้ว่า code เรา locate ที่ไหนตอน runtime ต้องสร้าง function ขึ้นมาตรวจสอบวนลูปเช็คแต่ละ sector ว่าว่างหรือเปล่าไล่มาจากทาง interrupt vector table ก่อนก็ได้ครับ (0x80000000) ถ้าเจอ sector อันแรกมีแต่ zero bytes ก็น่าจะสันนิษฐานได้ว่า sector นั้นเป็น sector ว่างครับ อันนี้ผมอาจจะผิดก็ได้ลองไปคิดอีกทีครับ

แต่ถ้าหมายถึงตอนที่ไม่ได้ run mcu อยู่ก็มี utility อยู่ตัวหนึ่่่่่่่งที่ชื่อว่า stm32 st-link utility เอาไว้ใช้ดู flash memory content ได้ครับ
ผมว่า flash ใน mcu ไม่สามารถเขียนทับเลยโดยตรงได้นะครับต้องลบก่อนเสมอ พอลบมันจะกลายเป็น 0xff ในแต่ละ byte เวลาเขียนมันจะเขียนบิทศูนย์ลงไปแทนบิทหนึ่ง แต่ถ้าของเดิมเป็นบิทศูนย์อยู่จะไม่สามารถเขียนบิทหนึ่งทับลงไปได้ สังเกตุดูว่าเวลาเราburnโปรแกรมลง mcu ทำไมต้องลบข้อมูลเดิมก่อนหรือทำ blankcheck(ลบให้เป็นหนึ่งทั้งหมด) ส่วนจะดูว่า code อยู่ตรงตำแหน่งไหนลองดูใน map file ครับ จะมีบอกหมดว่า function ไหนอยู่ที่ address ไหนและใช้พื้นที่ code กี่ byte