STM32F1 พื้นฐานครับ

Started by tha, September 16, 2020, 08:12:25 AM

Previous topic - Next topic

tha

https://www.st.com/resource/en/programming_manual/cd00228163-stm32f10xxx20xxx21xxxl1xxxx-cortexm3-programming-manual-stmicroelectronics.pdf



เอามาลงประเดิมก่อน คุณ dec คงจะแน่น ช่วยอธิบายหน่อย ตาผมไปทำต้อกระจกมา ไม่อยากเพ่งดูคอมนานๆครับ

tha

ทำงานกันใช่มั๊ย ไม่เป็นไร เดี๋ยวผมจะลองไล่ register ใน  Processor core registers ของ STM32F1 ARM COrtex-M3 ดู มี register อะไรบ้าง

General-purpose registers
R0-R12 เป็น 32-bit general-purpose registers สำหรับ data operations

Stack pointer
The Stack Pointer (SP) คือ register R13. ใน Thread mode, bit[1] ของ the CONTROL register แสดง the stack pointer ที่ใช้:
• 0 = Main Stack Pointer (MSP). เป็นค่าตอนรีเซ็ต
• 1 = Process Stack Pointer (PSP).
ตอน reset, the processor จะโหลด MSP ด้วยค่าจาก address 0x00000000.

Link register
The Link Register (LR) คือ register R14. มันจะเก็บข้อมูลคืนกลับ(return information) สำหรับ subroutines, การเรียกใช้งาน function,  exceptions(โปรแกรมย่อยอินเตอร์รับท์). ตอน reset, the processor จะโหลด the LR ด้วยค่า 0xFFFFFFFF.

Program counter
The Program Counter (PC) คือ register R15. มันจะเก็บ the current program address. Bit[0] เป็น 0 เสมอเพราะว่า instruction fetches ต้องเป็นการวางแนวแบบ halfword. ตอน reset, the processor จะโหลด the PC ด้วยค่าของ reset vector, ซึ่งอยู่ที่ address 0x00000004.

tha

อ่านเอากันก็ได้ใช่ไหม แปลมันก็งั้นๆไม่ค่อยจะเคลียร์เหมือนกัน ค่อยๆหัดแปลกันเอานะ เดี๋ยวก็ชำนาญไปเองครับ



tha


tha


tha

memory map ผมก็ยังไม่ชัดนะ ขอคุณ dec มาอธิบายหน่อยนะครับถ้าว่างแล้ว

tha

ไปช้าๆเอานะ ของอะไรมันต้องใช้เวลา

dec

รูปในโพสแรกคือ Register ของ CPU ครับ ปกติเราจะไม่ค่อยได้มายุ่งในส่วนนี้
ถ้าเราไม่ได้เขียน assembly หรือเขียน OS

รายละเอียดก็ตามที่คุณ tha ลงมาในโพสที่ 2 เลยครับ แต่จะเห็นว่ามันมีส่วนแปลกๆ อยู่
เช่น Stack pointer มันมี 2 ตัว ตรงนี้ arm ทำมาเพื่อรองรับการทำงานของ OS ครับ
โดยปกติ CPU จะใช้ MSP เป็น Stack pointer ตัวหลักในการทำงานทั้งหมด แต่เราสามารถ
แยกให้การทำงานปกติใช้ PSP และเวลาอยู่ใน Interrupt จะใช้ MSP ได้ครับ เป็นการแยก
ให้การทำงาน 2 ส่วนใช้ stack memory คนละส่วน โดยเฉพาะพวก RTOS ที่แต่ละ Task
เราจะแบ่ง Stack Memory ไว้ให้แต่ละ Task ไม่เยอะ แล้วระหว่างนั้นถ้ามี Interrupt เกิดขึ้น
มันจะได้ไม่ไปแย่ง Stack Memory ของ Task มาใช้ใน Interrupt

Link Register ถ้าอธิบายง่ายๆ ก็คือเวลา code มีการ Call Function มันก็จะเอา Address
ที่ต้อง Return กลับไปฝากไว้ใน Link Register ถ้ามีการ Call Function ใน Function อีกที
มันก็จะเก็บค่า Address ที่อยู่ใน Link Register ลง Stack Memory ก่อนแล้วค่อยฝาก Address ใหม่ทับลงไป

PSR หรือ Program Status Registers ตัวนี้ประหลาดดี ตรงมี Register จริงๆ ตัวเดียว แต่เวลาเรียกใช้จะแยกเป็น 3 ตัวตือ
- APSR - Application Program Status Registers ตัวนี้เหมือนเป็น Flags เวลาเราบวกลบคูณหารเลข
มันจะมี Bit คอยบอกว่าผลลัพทํมีค่าติดลบนะ ผลลัพท์มีค่าเป้น 0 ผลลัพท์มีการทดเลข ผลลัพท์ Overflow อะไรพวกนี้
- IPSR - Interrupt Program Status Registers ตัวนี้จะบอกว่า Interrupt ที่รันอยู่นี่คือ Interrupt อะไร
มันจะมีค่าเป็นเลข Number ของ Interrupt อยู่
- EPSR - Execution Program Status Registers อันนี้ไม่เคยใช้ครับ ไม่รู้เหมือนกัน ;D

PRIMASK คือ Interrupt mask register มีให้เซ็ตแค่บิตเดียว ถ้าเซ็ตคือ Block Interrupt ทั้งหมดยกเว้น
NMI กับพวก fault Handler ทั้งหลาย

FAULTMASK เหมือน PRIMASK แต่เอาไว้ Block พวก NMI กับพวก fault Handler ทั้งหลาย

BASEPRI มันนี้พิเศษหน่อย คือให้เรา Block Interrupt โดยการระบุ Priority เช่น Interrupt จะมี
Priority ได้ตั้งแต่ 15 - 0 (0 คือสูงที่สุด) ถ้าเซ็ต BASEPRI = 5 Interrupt ที่มี Priority ตั้งแต่ 15 ถึง 5 จะถูก Block
แต่ถ้า BASEPRI = 0 จะหมายถึงการเลิกใช้งาน BASEPRI เพราะฉะนั้น BASEPRI จะใช้ Block Interrupt ที่มี Priority 0 ไม่ได้

สุดท้ายคือ CONTROL Register อันนี้เอาไว้คุม Stack pointer ว่าจะให้ใช้ MSP หรือ PSP นั่นแหละครับ
แล้วก็ยังกำหนดให้ Thread ทำงานแบบ Privileged หรือ Unprivileged ได้ด้วย (แทรกนิดนึง ปกติเวลา
CPU ทำงานใน function main เราจะเรียกว่ามันทำงานใน Thread mode ส่วนเวลาที่ทำงานอยู่ใน Interrupt
เราจะเรียกว่า Handler mode ครับ) ปกติ CPU จะรัน Thread แบบ Privileged คือเข้าถึง Register หรือ
Config ค่า Register ได้ทุกอย่าง แต่ถ้าเราปรับเป็นแบบ Unprivileged จะทำให้ Thread เข้าถึง Register
บางตัวไม่ได้ มีปะรโยชน์คือเป็นการจำกัดสิทธิ์ของโปรแกรมที่ทำงานใน MCU ครับ ถ้าเราซีเรียสเรื่องความปลอดภัยมากๆ

ปล. เอาแค่นี้ก่อน ช่วงนี้ผมไม่ค่อยว่างเท่าไหร่ครับ ถ้าสนใจเรื่องสถาปัตยกรรมของ ARM Cortex M ผมแนะนำหนังสือ
The Definitive Guide to ARM® Cortex®-M3 and Cortex®-M4 Processors ของ โจเซฟ ยู ครับ เขียนได้ละเอียดดีครับ