Electoday 4.0

ไมโครคอนโทรลเลอร์ => ARM Processors => Topic started by: tha on January 16, 2021, 06:11:52 am

Title: STM32F1 Programming Manual
Post by: tha on January 16, 2021, 06:11:52 am
PM0056
Programming manual
STM32F10xxx/20xxx/21xxx/L1xxxx
Cortex®-M3 programming manual


Introduction

programming manual นี้จัดให้มีข้อมูลสำหรับ application และ system-level software developers. มันให้คำอธิบายอย่างเต็มของ the STM32F10xxx/20xxx/21xxx/L1xxxx Cortex®-M3 processor programming model, instruction set และ core peripherals

The STM32F10xxx/20xxx/21xxx/L1xxxx Cortex®-M3 processor คือ a high performance 32-bit processor ถูกออกแบบมาสำหรับ the microcontroller market. มันเสนอประโยชน์อย่างมีนัยสำคัญแก่นักพัฒนา, ได้แก่
•    processing performance ที่โดดเด่นรวมกันกับ a fast interrupt handling
•    Enhanced system debug พร้อมด้วย extensive breakpoint และ trace capabilities
•    Efficient processor core, system and memories
•    Ultra-low-power consumption พร้อมด้วย integrated sleep modes
•    Platform security
Title: Re: STM32F1 Programming Manual
Post by: tha on August 04, 2022, 09:09:03 am
1.3 About the STM32 Cortex®-M3 processor and core peripherals

The Cortex-M3 processor ถูกสร้างขึ้นจาก a high-performance processor core, พร้อมด้วย a 3-stage pipeline Harvard architecture, ทำให้เหมาะอย่างยิ่งสำหรับ demanding embedded applications. The processor มอบ exceptional power efficiency ผ่านทาง an efficient instruction set และการออกแบบที่ได้รับการปรับแต่งอย่างครอบคลุม, จัดให้มี high-end processing hardware รวมถึง single-cycle 32x32 multiplication(คูณ) และ dedicated hardware division(หาร).
(https://i.imgur.com/OXSju8N.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 04, 2022, 09:34:53 am
เพื่ออำนวยความสะดวกในการออกแบบของ cost-sensitive devices, the Cortex-M3 processor จัดให้มีใช้ tightly-coupled system components ที่ลด processor area ในขณะที่ปรับปรุงให้ดีขึ้นอย่างมีนัยยะ interrupt handling and system debug capabilities. The Cortex-M3 processor จัดให้มีใช้ a version of the Thumb® instruction set, ทำให้แน่ใจว่า high code density และลด program memory requirements. The Cortex-M3 instruction set จัดให้มีประสิทธิภาพที่ยอดเยี่ยมตามที่คาดไว้ของ a modern 32-bit architecture, พร้อมด้วย the high code density of 8-bit and 16-bit microcontrollers.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 04, 2022, 10:17:50 am
The Cortex-M3 processor ผสานรวมอย่างใกล้ชิด a configurable nested interrupt controller (NVIC), เพื่อมอบ industry-leading interrupt performance. The NVIC ประกอบด้วย a non-maskable interrupt (NMI), และจัดให้มีสูงถึง 256 interrupt priority levels. การผสานรวมอย่างแน่นหนาของ the processor core และ NVIC ให้การดำเนินการที่รวดเร็วของ interrupt service routines (ISRs), ซึ่งช่วยลดเวลาแฝงของอินเตอร์รัปต์ลงได้อย่างมาก. นี้ถูกทำให้สำเร็จลงผ่านทาง the hardware stacking of registers, และมีความสามารถหยุดค้างไว้ load-multiple และ store-multiple operations. Interrupt handlers ไม่ต้องการ assembler stubs ใดๆ, เอาออก code overhead ใดๆจาก the ISRs. Tail-chaining optimization ลดอย่างมีนัยยะ the overhead อีกด้วยเมื่อสวิทชิ่งจาก ISR ตัวหนึ่งไปยังตัวอื่น.

เพื่อเพิ่มประสิทธิภาพ low-power designs, the NVIC จะทำงานร่วมกับ the sleep modes, ซึ่งรวมถึง a deep sleep function ที่สามารถทำให้ the STM32 เข้าสู่ STOP หรือ STDBY mode.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 07:31:06 am
1.3.1 System level interface

The Cortex-M3 processor จัดให้มีหลาย interfaces โดยใช้ AMBA® technology เพื่อจัดให้มี high speed, low latency memory accesses. มันรองรับ unaligned data accesses และจัดให้มีใช้ atomic bit manipulation ที่ทำให้สามารถ faster peripheral controls, system spinlocks และ thread-safe Boolean data handling.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 08:27:59 am
1.3.2 Integrated configurable debug

The Cortex-M3 processor จัดให้มีใช้ a complete hardware debug solution. นี้จัดให้มี high system visibility of the processor and memory ผ่านทางอย่างใดอย่างหนึ่ง a traditional JTAG port หรือ a 2-pin Serial Wire Debug (SWD) port ที่เหมาะสำหรับ small package devices.

For system trace the processor จะรวม an Instrumentation Trace Macrocell (ITM) ควบคู่ไปกับ data watchpoints และ a profiling unit. เพื่อให้สามารถโปรไฟล์ที่ง่ายและคุ้มค่าของ the system events เหล่านี้สร้างขึ้น, a Serial Wire Viewer (SWV) สามารถส่งออกสายหนึ่งของ software-generated messages, data trace, and profiling information ผ่านทาง a single pin.

The optional Embedded Trace Macrocell™ (ETM) ส่งมอบ unrivalled instruction trace capture ใน an area ที่เล็กกว่า traditional trace units มาก, ทำให้ many low cost MCUs สามารถจัดให้มีใช้ full instruction trace ได้เป็นครั้งแรก.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 09:02:01 am
1.3.3 Cortex®-M3 processor features and benefits summary

•   การผสานรวมของ system peripherals ลด area and development costs
•   Thumb instruction set รวม high code density เข้ากับ 32-bit performance
•   Code-patch ability สำหรับ ROM system updates
•   Power control optimization of system components
•   รวบรวม sleep modes สำหรับ low power consumption
•   Fast code execution ยอมให้ processor clock ช้าลงหรือเพิ่ม sleep mode time
•   Hardware division(หาร) and fast multiplier(ตัวคุณ)
•   Deterministic, high-performance interrupt handling สำหรับ time-critical applications
•   Extensive debug and trace capabilities:
     –   Serial Wire Debug and Serial Wire Trace ลด the number of pins ที่ต้องการสำหรับ debugging and tracing.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 09:23:35 am
1.3.4 Cortex®-M3 core peripherals

เหล่านี้คือ:

Nested vectored interrupt controller

The nested vectored interrupt controller (NVIC) คือ an embedded interrupt controller ที่รองรับ low latency interrupt processing.

System control block

The system control block (SCB) คือ the programmers model เชื่อมต่อถึง the processor. มันจัดให้มี system implementation information และ system control, รวมถึง configuration, control, และการรายงานของ system exceptions.

System timer

The system timer, SysTick, คือ a 24-bit count-down timer. ใช้สิ่งนี้เป็น a Real Time Operating System (RTOS) tick timer หรือเป็น a simple counter.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 01:36:21 pm
2   The Cortex®-M3 processor

2.1   Programmers model

หัวข้อนี้อธิบาย the Cortex-M3 programmers model. นอกเหนือจาก the individual core register descriptions, มันบรรจุข้อมูลข่าวสารเกี่ยวกับ the processor modes และ privilege levels สำหรับ software execution และ stacks.

2.1.1   Processor mode and privilege levels for software execution

     The processor modes คือ:

     Thread mode          ถูกใช้เพื่อปฏิบัติ application software. The processor เข้าสู่ Thread mode เมื่อมันออกจาก reset.

     Handler mode         ถูกใช้เพื่อจัดการ exceptions. The processor กลับคืนสู่ Thread mode เมื่อมันเสร็จสิ้น exception
                                       processing.

     The privilege levels สำหรับ software execution คือ:

     Unprivileged         The software:
                                      •   มีการจำกัดการเข้าถึง the MSR and MRS instructions, และไม่สามารถใช้ the CPS instruction
                                      •   ไม่สามารถเข้าถึง the system timer, NVIC, หรือ system control block
                                      •   อาจมีการจำกัดการเข้าถึง memory หรือ peripherals.
                                      Unprivileged software ปฏิบัติที่ the unprivileged level.

     Privileged              The software สามารถใช้ทุก the instructions และเข้าถึงได้ทุก resources.
                                      Privileged software ปฏิบัติที่ the privileged level.

ใน Thread mode, the CONTROL register ควบคุมว่า software execution เป็น privileged หรือ unprivileged, ดู CONTROL register บนหน้า 21. ใน Handler mode, software execution จะเป็น privileged เสมอ.

มีเพียง privileged software สามารถเขียนถึง the CONTROL register เพื่อเปลี่ยน the privilege level สำหรับ software execution ใน Thread mode. Unprivileged software สามารถใช้ the SVC instruction เพื่อทำ a supervisor call เพื่อส่งถ่ายการควบคุมไปยัง privileged software.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 03:13:35 pm
2.1.2 Stacks

The processor ใช้ a full descending stack. ซึ่งหมายความว่า the stack pointer ระบุ the last stacked item บน the stack memory. เมื่อ the processor ใส่ a new item ไปบน the stack, มันจะลด the stack pointer และจากนั้นเขียน the item ไปยัง the new memory location. The processor จัดให้มีใช้ two stacks, the main stack and the process stack, โดยมีสำเนาอิสระของ the stack pointer, ดู Stack pointer บนหน้า 15.

ใน Thread mode, the CONTROL register ควบคุมว่า the processor ใช้ the main stack หรือ the process stack, ดู CONTROL register บนหน้า 21. ใน Handler mode, the processor จะใช้ the main stack เสมอ. ตัวเลือกสำหรับ processor operations คือ:
(https://i.imgur.com/halIGEN.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 04:11:20 pm
(https://i.imgur.com/toKTi6r.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 05, 2022, 04:12:26 pm
(https://i.imgur.com/9cimfvm.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 06, 2022, 08:42:27 am
General-purpose registers

R0-R12 คือ 32-bit general-purpose registers สำหรับ data operations.

Stack pointer

The Stack Pointer (SP) คือ register R13. ใน Thread mode, bit[1] of the CONTROL register ระบุ the stack pointer ที่ใช้:
•   0 = Main Stack Pointer (MSP). นี้คือ the reset value.
•   1 = Process Stack Pointer (PSP).
เมื่อ reset, the processor จะโหลด the MSP ด้วย the value จาก address 0x00000000.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 06, 2022, 08:52:28 am
Link register

The Link Register (LR) คือ register R14. มันเก็บ the return information สำหรับ subroutines, function calls, and exceptions. เมื่อ reset, the processor จะโหลด the LR value 0xFFFFFFFF.

Program counter

The Program Counter (PC) คือ register R15. มันบรรจุ the current program address. Bit[0] เป็น 0 เสมอเพราะว่า instruction fetches ต้องเป็น halfword aligned. เมื่อ reset, the processor จะโหลด the PC ด้วย the value ของ the reset vector, ซึ่งคือที่ address 0x00000004.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 06, 2022, 09:52:28 am
Program status register

The Program Status Register (PSR) รวมกัน:
•   Application Program Status Register (APSR)
•   Interrupt Program Status Register (IPSR)
•   Execution Program Status Register (EPSR)

รีจิสเตอร์เหล่านี้เป็นบิตฟิลด์ที่ไม่เกิดร่วมกันใน the 32-bit PSR. The bit assignments เป็นดังแสดงใน Figure 3 and Figure 4.
(https://i.imgur.com/BXp7OcJ.png)
เข้าถึง registers เหล่านี้ทีละรายการหรือรวมกันของสองหรือทั้งหมดสาม registers, โดยใช้ the register name เป็น an argument ไปยัง the MSR or MRS instructions. ตัวอย่างเช่น:
•   อ่าน registers ทั้งหมดโดยใช้ PSR กับ the MRS instruction
•   เขียนถึง the APSR โดยใช้ APSR กับ the MSR instruction.
The PSR combinations and attributes คือ:
(https://i.imgur.com/WQqeHrj.png)
ดู the instruction descriptions MRS บนหน้า 100 และ MSR บนหน้า 101 สำหรับข้อมูลที่มากขึ้นเกี่ยวกับวิธีการเข้าถึง the program status registers.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 06, 2022, 10:25:16 am
Application program status register

The APSR บรรจุ the current state ของ the condition flags จาก previous instruction executions. ดู the register summary ใน Table 2 บนหน้า 15 สำหรับ attributes ของมัน. The bit assignments คือ:
(https://i.imgur.com/H1hhGGg.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 06, 2022, 10:39:23 am
Interrupt program status register

The IPSR บรรจุ the exception type number ของ the current Interrupt Service Routine (ISR). ดู the register summary ใน Table 2 บนหน้า 15 สำหรับ attributes ของมัน. The bit assignments คือ:
(https://i.imgur.com/4ovftbU.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 07, 2022, 07:32:24 am
Execution program status register

The EPSR บรรจุ the Thumb state bit, และ the execution state bits สำหรับอย่างใดอย่างหนึ่ง the:
•   If-Then (IT) instruction
•   Interruptible-Continuable Instruction (ICI) field สำหรับ an interrupted load multiple หรือ store multiple instruction.
ดู the register summary ใน Table 2 บนหน้า 15 สำหรับ the EPSR attributes. The bit assignments คือ:
(https://i.imgur.com/DoYejjh.png)
พยายามอ่าน the EPSR โดยตรงผ่านทาง application software โดยใช้ the MSR instruction จะส่งคืนกลับศูนย์เสมอ. พยายามเขียน the EPSR โดยใช้ the MSR instruction ใน application software จะถูกละเลย. Fault handlers สามารถตรวจสอบ EPSR value ใน the stacked PSR เพื่อระบุ the operation ว่าอยู่ที่ fault. ดู Section 2.3.7: Exception entry and return บนหน้า 37
Title: Re: STM32F1 Programming Manual
Post by: tha on August 07, 2022, 08:28:35 am
Interruptible-continuable instructions

เมื่อ an interrupt เกิดขึ้นในระหว่าง the execution of an LDM or STM instruction, the processor:
•   หยุด the load multiple หรือ store multiple instruction operation ไว้ชั่วคราว
•   เก็บ the next register operand ใน the multiple operation ไปยัง EPSR bits[15:12].
หลังจากการบริการ the interrupt, the processor:
•   กลับคืนไปยัง the register ที่ชี้ถึงโดย bits[15:12]
•   กลับมาทำงานต่อ execution of the multiple load or store instruction.
เมื่อ the EPSR ถือ ICI execution state, bits[26:25,11:10] จะเป็นศูนย์.

If-Then block

The If-Then block บรรจุสูงถึง four instructions ต่อจาก a 16-bit IT instruction. แต่ละ instruction ใน the block มีเงื่อนไข. เงื่อนไขสำหรับ the instructions เป็นอย่างใดอย่างหนึ่งเหมือนกันทั้งหมด, หรือบางคำสั่งอาจตรงกันข้ามกับคำสั่งอื่นๆ. ดู IT บนหน้า 94 สำหรับข้อมูลเพิ่มเติม.

Exception mask registers

The exception mask registers จะปิดใช้งาน the handling of exceptions โดย the processor. ปิดใช้งาน exceptions ที่ๆพวกมันอาจส่งผลกระทบต่อ timing critical tasks.

เพื่อเข้าถึง the exception mask registers จะใช้ the MSR and MRS instructions, หรือ the CPS instruction เพื่อเปลี่ยนค่าของ PRIMASK or FAULTMASK. ดู MRS บนหน้า 100, MSR บนหน้า 101, และ CPS บนหน้า 98 สำหรับข้อมูลเพิ่มเติม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 07, 2022, 08:49:25 am
Priority mask register

The PRIMASK register ป้องกัน activation of all exceptions ด้วย configurable priority. ดู the register summary ใน Table 2 บนหน้า 15 สำหรับ attributes ของมัน. Figure 5 แสดง the bit assignments.
(https://i.imgur.com/ZxpRJ4d.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 07, 2022, 09:18:09 am
Fault mask register

The FAULTMASK register ป้องกัน activation of all exceptions ยกเว้นสำหรับ Non-Maskable Interrupt (NMI). ดู the register summary ใน Table 2 บนหน้าe 15 สำหรับ attributes ของมัน. Figure 6 แสดง the bit assignments.
(https://i.imgur.com/qlVrOSS.png)
The processor จะเคลียร์ the FAULTMASK bit เป็น 0 เมื่อออกจาก exception handler ใดๆยกเว้น the NMI handler.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 09, 2022, 08:46:28 am
Base priority mask register

The BASEPRI register กำหนด the minimum priority สำหรับ exception processing. เมื่อ BASEPRI ถูกเซ็ตเป็น a nonzero value, มันจะป้องกัน the activation of all exceptions ที่มีระดับความสำคัญเท่ากันหรือต่ำกว่าค่า the BASEPRI value.  ดู the register summary ใน Table 2 บนหน้า 15 สำหรับ attributes ของมัน. Figure 7 แสดง the bit assignments.
(https://i.imgur.com/0h2JfBj.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 09, 2022, 09:09:09 am
CONTROL register

The CONTROL register ควบคุม the stack ที่ใช้และ the privilege level สำหรับ software execution เมื่อ the processor อยู่ใน Thread mode.  ดู the register summary ใน Table 2 บนหน้า 15 สำหรับ attributes ของมัน. Figure 8 แสดง the bit assignments.
(https://i.imgur.com/U8RouAb.png)
(https://i.imgur.com/t7JFTzC.png)
The Handler mode ใช้ the MSP เสมอ, ดังนั้น the processor จะละเว้นการเขียนที่ชัดเจนไปยัง the active stack pointer bit of the CONTROL register เมื่ออยู่ใน Handler mode. The exception entry และ return mechanisms จะอัฟเดต the CONTROL register.

ใน an OS environment, ขอแนะนำว่า threads ที่ทำงานใน Thread mode ใช้ the process stack และ the kernel and exception handlers ใช้ the main stack.

โดยเริ่มต้น, Thread mode ใช้ the MSP. เพื่อสลับ the stack pointer ที่ใช้ใน Thread mode ไปเป็น the PSP, ใช้ the MSR instruction เพื่อเซ็ต the Active stack pointer bit เป็น 1, ดู MSR บนหน้า 101.

เมื่อเปลี่ยน the stack pointer, software ต้องใช้ an ISB instruction ทันทีหลังจาก the MSR instruction. นี้เพื่อให้แน่ใจว่า instructions หลังจาก the ISB execute จะใช้ the new stack pointer. ดู ISB บนหน้า 100
Title: Re: STM32F1 Programming Manual
Post by: tha on August 09, 2022, 09:33:57 am
2.1.4 Exceptions and interrupts

The Cortex-M3 processor รองรับ interrupts and system exceptions. The processor และ the Nested Vectored Interrupt Controller (NVIC) จัดลำดับความสำคัญและจัดการ all exceptions. An exception เปลี่ยน the normal flow ของ software control. The processor ใช้ handler mode เพื่อจัดการ all exceptions ยกเว้นสำหรับ reset. ดู Exception entry บนหน้า 37 และ Exception return บนหน้า 38 สำหรับข้อมูลเพิ่มเติม.

The NVIC registers ควบคุม interrupt handling. ดู Memory protection unit (MPU) บนหน้า 105 สำหรับข้อมูลเพิ่มเติม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 09, 2022, 09:51:27 am
2.1.5 Data types

The processor:
•   รองรับ the following data types:
     –   32-bit words
     –   16-bit halfwords
     –   8-bit bytes
•   รองรับ 64-bit data transfer instructions.
•   จัดการ all memory accesses (data memory, instruction memory and Private Peripheral Bus (PPB)) เป็น                   
     little-endian. ดู Memory regions, types and attributes บนหน้า 25 สำหรับข้อมูลเพิ่มเติม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 09, 2022, 01:52:14 pm
2.1.6 The Cortex® microcontroller software interface standard (CMSIS)

สำหรับ a Cortex-M3 microcontroller system, the Cortex Microcontroller Software Interface Standard (CMSIS) กำหนด:
•   วิธีทั่วไปในการ:
     –   เข้าถึง peripheral registers
     –   กำหนด exception vectors
•   ชื่อของ:
     –   The registers of the core peripherals
     –   The core exception vectors
•   A device-independent interface สำหรับ RTOS kernels, รวมถึง a debug channel

The CMSIS รวม address definitions และ data structures สำหรับ the core peripherals ใน the Cortex-M3 processor. มันยังรวม optional interfaces สำหรับ middleware components ประกอบด้วย a TCP/IP stack และ a Flash file system.

CMSIS ช่วยลดความยุ่งยาก software development โดยทำให้สามารถใช้งานซ้ำ template code และการรวมของ CMSIS-compliant software components จาก various middleware vendors. Software vendors สามารถขยาย the CMSIS เพื่อรวม their peripheral definitions และเข้าถึง functions สำหรับ peripherals เหล่านั้น.

เอกสารนี้ประกอบด้วย the register names ที่กำหนดโดย the CMSIS, และให้ short descriptions ของ the CMSIS functions ที่ระบุที่อยู่ the processor core และ the core peripherals.

เอกสารนี้ใช้ the register short names ที่กำหนดโดย the CMSIS. ในน้อยกรณีชื่อเหล่านี้แตกต่างจาก the architectural short names ที่อาจถูกใช้ในเอกสารอื่นๆ

ส่วนต่อไปนี้ให้ข้อมูลเพิ่มเติมเกี่ยวกับ the CMSIS:
•   Section 2.5.4: Power management programming hints on page 43
•   Intrinsic functions on page 49
•   The CMSIS mapping of the Cortex®-M3 NVIC registers on page 119
•   NVIC programming hints on page 127
Title: Re: STM32F1 Programming Manual
Post by: tha on August 09, 2022, 02:14:15 pm
2.2 Memory model

ส่วนนี้อธิบาย the processor memory map(แผนผัง), ลักษณะการทำงานของ memory accesses, และ the bit-banding features. The processor มี a fixed memory map ที่จัดให้มีสูงถึง 4 GB ของ addressable memory.
(https://i.imgur.com/ZKAj9QL.png)
ขอบเขตสำหรับ SRAM และ peripherals รวมถึง bit-band regions. Bit-banding จัดให้มี atomic operations กับ bit data, ดู Section 2.2.5: Bit-banding บนหน้า 27.

The processor สงวนพื้นที่ของช่วงที่อยู่ the Private peripheral bus (PPB) สำหรับ core peripheral registers, ดู Section 4.1: About the STM32 core peripherals บนหน้า 105.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 10, 2022, 09:02:16 am
2.2.1 Memory regions, types and attributes

The memory map แบ่ง the memory map ลงใน regions. แต่ละ region มี a defined memory type, และบาง regions มี additional memory attributes. The memory type และ attributes กำหนดลักษณะการทำงานของการเข้าถึง the region.

The memory types คือ:
Normal                           The processor สามารถจัดลำดับ transactions ใหม่เพื่อประสิทธิภาพ, หรือดำเนินการ speculative
                                         reads.

Device                            The processor จะรักษา transaction order ที่เกี่ยวข้องกับ transactions อื่นไปยัง Device หรือ
                                        Strongly-ordered memory.

Strongly-ordered          The processor จะรักษา transaction order ที่เกี่ยวข้องกับ transactions อื่นทั้งหมด.

The different ordering requirements สำหรับ Device และ Strongly-ordered memory หมายความว่า the memory system สามารถบัฟเฟอร์การเขียนไปยัง Device memory, แต่ต้องไม่บัฟเฟอร์การเขียนไปยัง Strongly-ordered memory.

The additional memory attributes ประกอบด้วย:
Execute Never (XN)      วิธีที่ the processor ป้องกัน instruction accesses. ความพยายามใดๆเพื่อเฟรช an instruction จาก an
                                        XN region เป็นเหตุให้เกิด a memory management fault exception.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 10, 2022, 09:57:39 am
2.2.2 Memory system ordering of memory accesses

สำหรับ memory accesses ส่วนใหญ่ที่เกิดจาก explicit memory access instructions, the memory system จะไม่รับประกันว่าลำดับที่ the accesses complete ตรงกับ the program order ของ the instructions, การจัดให้มีที่ไม่ส่งผลกระทบลักษณะการทำงานของ the instruction sequence. โดยปกติ, ถ้า correct program execution ขึ้นอยู่กับ two memory accesses เสร็จสมบูรณ์ใน program order, software ต้องใส่ a memory barrier instruction ระหว่าง the memory access instructions, ดู Section 2.2.4: Software ordering of memory accesses บนหน้า 26.

อย่างไรก็ตาม, the memory system รับประกันบางการเรียงลำดับของการเข้าถึง Device and Strongly-ordered memory. สำหรับ two memory access instructions A1 and A2, ถ้า A1 เกิดขึ้นก่อน A2 ใน program order, ลำดับของ the memory accesses ที่เกิดจาก two instructions คือ:
(https://i.imgur.com/75wdftW.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 10, 2022, 10:19:04 am
2.2.3 Behavior of memory accesses

ลักษณะการทำงานของการเข้าถึงแต่ละ region ใน the memory map คือ:
(https://i.imgur.com/pgV5G6r.png)
The Code, SRAM, and external RAM regions สามารถเก็บ programs ได้. อย่างไรก็ตาม, ขอแนะนำให้ programs ใช้ the Code region เสมอ. นี้เนื่องจาก the processor มี separate buses ที่ทำให้สามารถ instruction fetches และ data accesses to เกิดขึ้นได้พร้อมกัน.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 10, 2022, 01:34:23 pm
2.2.4 Software ordering of memory accesses

The order of instructions ใน the program flow ไม่รับประกัน the order of the corresponding memory transactions เสมอ. นี้เนื่องจาก:
•   The processor สามารถจัดลำดับบาง memory accesses ใหม่เพื่อปรับปรุงประสิทธิภาพให้ดีขึ้น, การจัดให้มีสิ่งนี้ไม่ส่งผลกระทบ
     ลักษณะการทำงานของ the instruction sequence.
•   The processor มี multiple bus interfaces
•   Memory or devices ใน the memory map มี wait states ที่ต่างกัน
•   บาง memory accesses ถูกบัฟเฟอร์หรือ speculative.
Section 2.2.2: Memory system ordering of memory accesses on page 25 อธิบายกรณีที่ the memory system รับประกัน the order of memory accesses. มิฉะนั้น, ถ้า the order of memory accesses วิกฤต, software ต้องรวม memory barrier instructions เพื่อบังคับ ordering นั้น. The processor จัดให้มี the following memory barrier instructions:

DMB               The Data Memory Barrier (DMB) instruction ทำให้แน่ใจว่า outstanding memory transactions เสร็จ
                        สมบูรณ์ก่อน subsequent memory transactions. ดู DMB บนหน้า 99.
DSB                The Data Synchronization Barrier (DSB) instruction ทำให้แน่ใจว่า outstanding memory transactions เ
                       สร็จสมบูรณ์ก่อน subsequent instructions execute. ดู DSB บนหน้า 100.
ISB                 The Instruction Synchronization Barrier (ISB) ทำให้แน่ใจว่าผลของ all completed memory transactions
                       จะรับรู้ได้โดย subsequent instructions. ดู ISB บนหน้า 100.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 10, 2022, 02:07:17 pm
ใช้ memory barrier instructions ใน, ตัวอย่างเช่น:
•   Vector table. ถ้า the program เปลี่ยน an entry ใน the vector table, และจากนั้นเปิดใช้งาน the corresponding
     exception, ใช้ a DMB instruction ระหว่าง the operations. นี้ทำให้แน่ใจว่าถ้า the exception ถูกได้รับทันที่หลังจากกำลังถูก
     เปิดใช้งาน the processor จะใช้ the new exception vector.
•   Self-modifying code. ถ้า a program บรรจุ self-modifying code, ใช้ an ISB instruction ทันที่หลังจาก the code
     modification ใน the program. นี้ทำให้แน่ใจว่า subsequent instruction execution จะใช้ the updated program
•   Memory map switching. ถ้า the system บรรจุ a memory map switching mechanism, ใช้ a DSB instruction
     หลังจากการสลับ the memory map ใน the program. นี้ทำให้แน่ใจว่า subsequent instruction execution จะใช้ the
     updated memory map.
•   Dynamic exception priority change. เมื่อ an exception priority ต้องเปลี่ยนเมื่อ the exception ค้างอยู่หรือทำงาน
     อยู่, ใช้ DSB instructions หลังจากการเปลี่ยน. นี้ทำให้แน่ใจว่าการเปลี่ยนจะส่งผลบนการเสร็จสมบูรณ์ the DSB instruction.
•   Using a semaphore in multi-master system. ถ้า the system บรรจุมากกว่าหนึ่ง bus master, ตัวอย่างเช่น, ถ้า
     processor อีกตัวหนึ่งถูกปรากฎใน the system, แต่ละ processor ต้องใช้ a DMB instruction หลังจาก semaphore
     instructions ใดๆ, เพื่อให้แน่ใจว่า bus masters อื่นๆดู the memory transactions ในลำดับซึ่งพวกมันเคยถูกปฏิบัติ.

Memory เข้าถึง Strongly-ordered memory, อย่างเช่น the system control block, ไม่จำเป็นต้องใช้ DMB instructions.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 11, 2022, 08:28:41 am
2.2.5 Bit-banding

A bit-band region แมปแต่ละ word ใน a bit-band alias region เข้ากับ a single bit ใน the bit-band region. The bit-band regions ครอบครอง the lowest 1 MB of the SRAM และ peripheral memory regions.

The memory map มี two 32 MB alias regions ที่แมปถึง two 1 MB bit-band regions:
•   เข้าถึง the 32 MB SRAM alias region จะแมปถึง the 1 MB SRAM bit-band region, ดังแสดงในตาราง 13
•   เข้าถึง the 32 MB peripheral alias region จะแมปถึง the 1 MB peripheral bit-band region, ดังแสดงในตาราง 14.
(https://i.imgur.com/G0Hhrjk.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 11, 2022, 09:00:24 am
A word เข้าถึง the SRAM หรือ peripheral bit-band alias regions จะแมปถึง a single bit ใน the SRAM หรือ peripheral bit-band region.

สมการต่อไปนี้แสดงวิธีที่ the alias region แมปไปบน the bit-band region:

bit_word_offset = (byte_offset x 32) + (bit_number x 4)

bit_word_addr = bit_band_base + bit_word_offset

ที่:
•   Bit_word_offset คือตำแหน่งของ the target bit ใน the bit-band memory region.
•   Bit_word_addr คือ the address of the word ใน the alias memory region ที่แมปถึง the targeted bit.
•   Bit_band_base คือ the starting address of the alias region.
•   Byte_offset คือจำนวนของ the byte ใน the bit-band region ที่บรรจุ the targeted bit.
•   Bit_number คือ the bit position, 0-7, ของ the targeted bit.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 11, 2022, 09:24:52 am
Figure 10 บนหน้า 29 แสดงตัวอย่างของ bit-band mapping ระหว่าง the SRAM bit-band alias region และ the SRAM bit-band region:
•   The alias word ที่ 0x23FFFFE0 แมปถึง bit[0] ของ the bit-band byte ที่ 0x200FFFFF:
     0x23FFFFE0 = 0x22000000 + (0xFFFFF*32) + (0*4).
•   The alias word ที่ 0x23FFFFFC แมปถึง bit[7] ของ the bit-band byte ที่ 0x200FFFFF:
     0x23FFFFFC = 0x22000000 + (0xFFFFF*32) + (7*4).
•   The alias word ที่ 0x22000000 แมปถึง bit[0] ของ the bit-band byte ที่ 0x20000000:
     0x22000000 = 0x22000000 + (0*32) + (0 *4).
•   The alias word ที่ 0x2200001C แมปถึง bit[7] ของ the bit-band byte ที่ 0x20000000:
     0x2200001C = 0x22000000+ (0*32) + (7*4).

(https://i.imgur.com/Ekrei4l.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 11, 2022, 09:46:03 am
การเข้าถึงโดยตรง an alias region
การเขียนถึง a word ใน the alias region จะอัฟเดต a single bit ใน the bit-band region.

Bit[0] ของ the value ที่เขียนถึง a word ใน the alias region กำหนด the value ที่เขียนถึง the targeted bit ใน the bit-band region. การเขียน a value ด้วย bit[0] เซ็ตเป็น 1 จะเขียน a 1 ไปยัง the bit-band bit, และการเขียน a value ด้วย bit[0] เซ็ตเป็น 0 จะเขียน a 0 ไปยัง the bit-band bit.

Bits[31:1] ของ the alias word ไม่มีผลต่อ the bit-band bit. การเขียน 0x01 มีผลเดียวกันกับการเขียน 0xFF. การเขียน 0x00 มีผลเดียวกันกับการเขียน 0x0E.

การอ่าน a word ใน the alias region:
•   0x00000000 แสดงให้เห็นว่า the targeted bit ใน the bit-band region ถูกเซ็ตเป็น 0
•   0x00000001 แสดงให้เห็นว่า the targeted bit ใน the bit-band region ถูกเซ็ตเป็น 1

การเข้าถึงโดยตรง a bit-band region
Behavior of memory accesses บนหน้า 26 อธิบายลักษณะการทำงานของ direct byte, halfword, or word เข้าถึงไปยัง the bit-band regions.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 12, 2022, 08:58:51 am
2.2.6 Memory endianness

The processor ดู memory เป็น a linear collection of bytes ที่ตัวเลขเรียงลำดับจากน้อยไปหามากจากศูนย์ . ตัวอย่างเช่น, bytes 0-3 ถือ the first stored word, และ bytes 4-7 ถือ the second stored word.

Little-endian format

ใน little-endian format, the processor เก็บ the least significant byte ของ a word ที่ the lowest-numbered byte, และ the most significant byte ที่ the highest-numbered byte. ดู Figure 11 สำหรับตัวอย่าง.

(https://i.imgur.com/K17aafX.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 12, 2022, 09:38:30 am
2.2.7 Synchronization primitives

The Cortex-M3 instruction set รวมคู่ของ synchronization primitives ไว้. เหล่านี้จัดให้มี a non-blocking mechanism ที่ a thread หรือ process สามารถใช้เพื่อให้ได้ exclusive access ไปยัง a memory location. Software สามารถใช้พวกมันเพื่อดำเนินการ a guaranteed read-modify-write memory update sequence, หรือสำหรับ a semaphore mechanism.

A pair of synchronization primitives ประกอบด้วย:

A Load-Exclusive instruction           ใช้อ่านค่าของ a memory location, โดยร้องขอ exclusive access ไปยัง location นั้น.

A Store-Exclusive instruction          ใช้เพื่อพยายามเขียนไปยัง the same memory location, ส่งคืน a status bit ไปยัง a
                                                             register. หากบิตนี้คือ:
                                                               0: มันแสดงให้เห็นว่า the thread หรือ process ได้รับ exclusive access ไปยัง
                                                                   the memory, และการเขียนประสบความสำเร็จ
                                                               1: มันแสดงให้เห็นว่า the thread หรือ process ไม่ได้รับ exclusive access ไปยัง
                                                                   the memory, และไม่มีการเขียนถูกดำเนินการ

The pairs of Load-Exclusive and Store-Exclusive instructions คือ:
•   The word instructions LDREX and STREX
•   The halfword instructions LDREXH and STREXH
•   The byte instructions LDREXB and STREXB.

Software ต้องใช้ a Load-Exclusive instruction กับ the corresponding Store-Exclusive instruction.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 12, 2022, 10:13:20 am
เพื่อดำเนินการ a guaranteed read-modify-write ของ a memory location, software ต้อง:
1.   ใช้ a Load-Exclusive instruction เพื่ออ่านค่าของ the location.
2.   อัฟเดตค่า, ตามที่ต้องการ.
3.   ใช้ a Store-Exclusive instruction เพื่อพยายามเขียน the new value กลับไปยัง the memory location, และทดสอบ the
      returned status bit. หากบิตนี้คือ:
           0:   The read-modify-write สำเร็จเสร็จสมบูรณ์,
           1:   ไม่มีการเขียนถูกดำเนินการ. นี้แสดงให้เห็นว่า the value ที่ส่งคืนกลับที่ step 1 อาจล้าสมัย. The software ต้องพยายาม the
                  read-modify-write sequence ใหม่อีกครั้ง,
Title: Re: STM32F1 Programming Manual
Post by: tha on August 12, 2022, 10:50:15 am
Software สามารถใช้ the synchronization primitives เพื่อจัดให้มีใช้ a semaphores ดังต่อไปนี้:
1.  ใช้ a Load-Exclusive instruction เพื่ออ่านจาก the semaphore address เพื่อเช็คว่า the semaphore เป็นอิสระแล้วหรือยัง.
2.   ถ้า the semaphore เป็นอิสระ, ใช้ a Store-Exclusive เพื่อเขียน the claim value ไปยัง the semaphore address.
3.   ถ้า the returned status bit จาก step 2 แสดงให้เห็นว่า the Store-Exclusive ประสพความสำเร็จดังนั้น the software ได้อ้างสิทธิ์
      the semaphore. อย่างไรก็ตาม, ถ้า the Store-Exclusive ประสพความล้มเหลว,  process อีกงานหนึ่งอาจอ้างสิทธิ์ the
      semaphore หลังจาก the software ดำเนินการ step 1.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 12, 2022, 11:19:43 am
The Cortex-M3 รวม an exclusive access monitor ไว้, ที่ติดตามความจริงที่ว่า the processor ได้ปฏิบัติ a Load-Exclusive instruction แล้ว.

The processor เอาออก exclusive access tag ของมันหาก:
•   มันปฏิบัติ a CLREX instruction
•   มันปฏิบัติ a Store-Exclusive instruction, โดยไม่คำนึงถึงว่าการเขียนสำเร็จหรือไม่.
•   An exception เกิดขึ้น. นี้เป็นวิธีที่ the processor สามารถแก้ไข semaphore conflicts ระหว่าง different threads.

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ the synchronization primitive instructions, ดู LDREX and STREX บนหน้า 70 and CLREX บนหน้า 71.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 12, 2022, 11:37:50 am
2.2.8 Programming hints for the synchronization primitives

ANSI C ไม่สามารถสร้างโดยตรง the exclusive access instructions. บาง C compilers จัดให้มี intrinsic functions สำหรับ generation of these instructions:
(https://i.imgur.com/TieY58c.png)
The actual exclusive access instruction ที่สร้างขึ้นอยู่กับ the data type of the pointer ที่ผ่านไปยัง the intrinsic function. ตัวอย่างเช่น, the following C code สร้าง the require LDREXB operation:

__ldrex((volatile char *) 0xFF);
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 09:01:16 am
2.3 Exception model

ส่วนนี้อธิบาย the exception model.

2.3.1 Exception states

แต่ละ exception อยู่ในสถานะหนึ่งของ the following states:

Inactive                        The exception ไม่ active และไม่ pending.

Pending                        The exception กำลังรอเพื่อถูกบริการโดย the processor. An interrupt request จาก a peripheral
                                      หรือจาก software สามารถเปลี่ยนสถานะของ the corresponding interrupt ไปเป็น pending.

Active                            An exception ที่กำลังถูกบริการโดย the processor แต่ยังไม่เสร็จสมบูรณ์.
                                      Note: An exception handler สามารถอินเตอร์รัพท์การปฏิบัติของ exception handler อีกตัวหนึ่ง.
                                      ในกรณีของทั้งสอง exceptions อยู่ใน the active state.


Active and pending    The exception กำลังถูกบริการโดย the processor และมี a pending exception จาก the same
                                       source.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 09:24:09 am
2.3.2 Exception types

The exception types คือ:

Reset                       Reset ถูกปลุกเมื่อ power up หรือ a warm reset. The exception model ถือว่า reset เป็นรูปแบบพิเศษ
                                 ของ exception. เมือ reset ถูกยืนยัน, การทำงานของ the processor จะหยุด, อาจเกิดขึ้น ณ จุดใดๆใน an
                                 instruction. เมื่อ reset ถูกถอนการยืนยัน, execution จะสตาร์ทใหม่จาก the address ที่จัดให้มีโดย the
                                 reset entry ใน the vector table. Execution จะสตาร์ทใหม่เป็น privileged execution ใน Thread
                                 mode.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 09:55:38 am
NMI                          A NonMaskable Interrupt (NMI) สามารถถูกให้สัญญานโดย a peripheral หรือถูกทริกโดย software. นี้
                                 เป็น the highest priority exception นอกเหนือจาก reset. มันถูกเปิดใช้งานอย่างถาวรและมี a fixed priority
                                 of -2. NMIs ไม่สามารถเป็น:
                                 •  บังหรือป้องกันไม่ให้ทำงานโดย exception อื่นใดๆ
                                 •  ใช้สิทธิ์ก่อนโดย exception ใดๆนอกเหนือจาก Reset.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 10:06:18 am
Hard fault                A hard fault คือ an exception ที่เกิดขึ้นเนื่องจาก an error ในระหว่าง exception processing, หรือเนื่องจาก
                                  an exception ไม่สามารถถูกจัดการโดย exception mechanism อื่นใดๆ. Hard faults มี a fixed priority
                                  of -1, หมายความว่าพวกมันมี priority สูงกว่า exception ใดๆที่มี priority ที่กำหนดค่าได้.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 10:28:03 am
Memory management   A memory management fault คือ an exception ที่เกิดขึ้นเนื่องจาก a memory protection related
fault                                   fault. The fixed memory protection constraints จะตัดสิน fault นี้, สำหรับทั้ง instruction และ
                                           data memory transactions.  fault นี้ถูกใช้เพื่อยกเลิก instruction ที่เข้าถึง Execute Never (XN)
                                           memory regions.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 10:35:33 am
Bus fault                  A bus fault คือ an exception ที่เกิดขึ้นเนื่องจาก a memory related fault สำหรับ an instruction หรือ
                                  data memory transaction. สิ่งนี้อาจเกิดจาก error ที่ตรวจพบบน a bus ใน the memory system.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 11:21:12 am
Usage fault            A usage fault คือ an exception ที่เกิดขึ้นเนื่องจาก a fault ที่เกี่ยวกับ instruction execution. นี้ประกอบด้วย:
                                •   An undefined instruction
                                •   An illegal unaligned access
                                •   Invalid state on instruction execution
                                •   An error on exception return.
                                สิ่งต่อไปนี้อาจทำให้เกิด a usage fault เมื่อ the core ถูกกำหนดค่าเพื่อรายงานพวกมัน:
                                •    An unaligned address on word and halfword memory access
                                •    การหารด้วย 0
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 11:41:35 am
SVCall                     A supervisor call (SVC) คือ an exception ที่ถูกทริกโดย the SVC instruction. ใน an OS environment,
                                applications สามารถใช้ SVC instructions เพื่อเข้าถึง OS kernel functions และ device drivers.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 11:46:32 am
PendSV                  PendSV คือ an interrupt-driven request สำหรับ system-level service. ใน an OS environment, ใช้
                                PendSV สำหรับ context switching เมื่อไม่มี exception อื่นทำงาน.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 11:50:29 am
SysTick                   A SysTick exception คือ an exception ที่ the system timer สร้างขึ้นเมื่อมันถึงศูนย์. Software สามารถสร้าง
                                a SysTick exception ได้ด้วย. ใน an OS environment, the processor สามารถใช้ exception นี้เป็น
                                system tick.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 11:57:20 am
Interrupt (IRQ)         A interrupt, หรือ IRQ, คือ an exception ที่ให้สัญญานโดย a peripheral, หรือที่สร้างโดย a software
                                   request. ทุก interrupts จะไม่พร้อมกันกับ instruction execution. ใน the system, peripherals ใช้
                                   interrupts เพื่อติดต่อสื่อสารกับ the processor.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 12:05:24 pm
(https://i.imgur.com/ao4FRh5.png)
(https://i.imgur.com/VPS91Wg.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 13, 2022, 12:17:11 pm
สำหรับ an asynchronous exception, นอกเหนือจาก reset, the processor สามารถปฏิบัติ instruction อื่นอีกคำสั่งหนึ่งระหว่างเมื่อ the exception ถูกทริกและเมื่อ the processor เข้าสู่ the exception handler.

Privileged software สามารถปิดใช้งาน the exceptions ที่ Table 16 บนหน้า 33 แสดงเป็น having configurable priority, ดู:
•   System handler control and state register (SCB_SHCSR) on page 140
•   Interrupt clear-enable registers (NVIC_ICERx) on page 121
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ hard faults, memory management faults, bus faults, and usage faults, ดู Section 2.4: Fault handling on page 39.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 14, 2022, 08:38:47 am
2.3.3 Exception handlers

The processor จัดการ exceptions โดยใช้:

Interrupt Service                       Interrupts IRQ0 ถึง IRQ67 คือ the exceptions ที่จัดการโดย ISRs.
Routines (ISRs)

Fault handlers                           Hard fault, memory management fault, usage fault, bus fault คือ fault exceptions
                                                     ที่จัดการโดย the fault handlers.

System handlers                       NMI, PendSV, SVCall SysTick, และ the fault exceptions เป็นทุก system exceptions ที่
                                                     ถูกจัดการโดย system handlers.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 14, 2022, 09:16:43 am
2.3.4 Vector table

The vector table บรรจุ the reset value ของ the stack pointer, และ the start addresses, ที่เรียกว่า exception vectors อีกด้วย, สำหรับทุก exception handlers. Figure 12 บนหน้า 35 แสดงลำดับของ the exception vectors ใน the vector table. The least-significant bit ของแต่ละ vector ต้องเป็น 1, แสดงให้เห็นว่า the exception handler เป็น Thumb code.

(https://i.imgur.com/vBItkFc.png)

เมื่อ system reset, the vector table ถูกคงที่ที่ address 0x00000000. Privileged software สามารถเขียนถึง the VTOR เพื่อย้าย the vector table start address ไปยัง a different memory location, ในช่วง 0x00000080 ถึง 0x3FFFFF80, ดู Vector table offset register (SCB_VTOR) บนหน้า 133.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 16, 2022, 10:30:20 am
2.3.5 Exception priorities

ตาม Table 16 บนหน้า 33 แสดง, ทุก exceptions มี an associated priority, พร้อมด้วย:
•   A lower priority value แสดงให้เห็น a higher priority
•   Configurable priorities สำหรับทุก exceptions ยกเว้น Reset, Hard fault, และ NMI.

ถ้า software ไม่กำหนดค่า priorities ใดๆ, ดังนั้นทุกl exceptions ที่มี a configurable priority จะมี a priority of 0. สำหรับข้อมูลเกี่ยวกับการกำหนดค่า exception priorities ดู
•   System handler priority registers (SHPRx) บนหน้า 138
•   Interrupt priority registers (NVIC_IPRx) บนหน้า 125

Configurable priority values อยู่ในช่วง 0-15. นี้หมายความว่า the Reset, Hard fault, และ NMI exceptions, ที่มี fixed negative priority values, จะมี priority สูงกว่า exception อื่นใดๆเสมอ.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 16, 2022, 10:55:03 am
ตัวอย่างเช่น, การกำหนด a higher priority value ให้กับ IRQ[0] และ a lower priority value ให้กับ IRQ[1] หมายความว่า IRQ[1] มี priority สูงกว่า IRQ[0]. ถ้าทั้ง IRQ[1] และ IRQ[0] ถูกยืนยัน, IRQ[1] จะถูกประมวลผลก่อน IRQ[0].

ถ้าหลาย pending exceptions มี the same priority, the pending exception ที่มี the lowest exception number จะได้รับการประมวลผล. ตัวอย่างเช่น, ถ้าทั้ง IRQ[0] และ IRQ[1] กำลัง pending และมี the same priority, ดังนั้น IRQ[0] จะถูกประมวลผลก่อน IRQ[1].

เมื่อ the processor กำลังปฏิบัติ an exception handler, the exception handler จะถูกยึดไว้ใช้สิทธิ์ทำงานก่อนถ้า a higher priority exception เกิดขึ้น. ถ้า an exception ที่เกิดขึ้นมี the same priority กับ the exception ที่กำลังถูกจัดการ, the handler จะไม่ถูกยึดไว้ใช้สิทธิ์ทำงานก่อน, โดยไม่คำนึงถึง the exception number. อย่างไรก็ตาม, สถานะของ the new interrupt จะเปลี่ยนไปเป็น pending.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 16, 2022, 11:40:45 am
2.3.6 Interrupt priority grouping

เพื่อเพิ่ม priority control ใน systems ที่มี interrupts, the NVIC รองรับ priority grouping. นี้จะแบ่งแต่ละ interrupt priority register entry ลงในสอง fields:
•   An upper field ที่กำหนด the group priority
•   A lower field ที่กำหนด a subpriority ภายใน the group.

มีเพียง the group priority ที่ตัดสิน preemption of interrupt exceptions. เมื่อ the processor กำลังปฏิบัติ an interrupt exception handler, interrupt อื่นอีกตัวที่มี the same group priority กับ the interrupt ที่กำลังถูกปฏิบัติจะไม่ถูกยึดไว้ใช้สิทธิ์ทำงานก่อน the handler,

ถ้าหลาย pending interrupts มี the same group priority, the subpriority field จะตัดสินลำดับที่พวกมันจะถูกประมวลผล. ถ้าหลาย pending interrupts มี the same group priority and subpriority, the interrupt ที่มี the lowest IRQ number จะถูกประมวลผลก่อน.

สำหรับข้อมูลเกี่ยวกับการแบ่ง the interrupt priority fields ลงใน group priority and subpriority, ดู Application interrupt and reset control register (SCB_AIRCR) บนหน้า 134.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 17, 2022, 08:31:03 am
2.3.7 Exception entry and return

คำอธิบายของ exception handling ใช้ข้อกำหนดต่อไปนี้:

Preemption                   เมื่อ the processor กำลังปฏิบัติ an exception handler, an exception สามารถยึดไว้ใช้สิทธิ์ทำงาน
                                       ก่อน the exception handler ถ้า priority ของมันสูงกว่า the priority ของ the exception ที่กำลัง
                                       ถูกจัดการ. ดู Section 2.3.6: Interrupt priority grouping สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ
                                       preemption โดย an interrupt.
                                       เมื่อ exception ตัวหนึ่งยึดไว้ใช้สิทธิ์ทำงานก่อน exception อื่นอีกตัวหนึ่ง, the exceptions จะถูกเรียก
                                       ว่า nested exceptions. ดู Exception entry บนหน้า 37 ข้อมูลเพิ่มเติม.
Return                          สิ่งนี้เกิดขึ้นเมื่อ the exception handler เสร็จสมบูรณ์, และ:
                                        •   ไม่มี pending exception ที่มี sufficient priority ที่จะถูกบริการ
                                        •   The completed exception handler ไม่ได้จัดการ a late-arriving exception.
                                        the processor pops the stack และกู้คืน the processor state กลับสู่ the state เดิมก่อน the
                                        interrupt เกิดขึ้น. ดู Exception return บนหน้า 38 สำหรับข้อมูลเพิ่มเติม.
Tail-chaining                  กลไกนี้ช่วยเร่งความเร็ว exception servicing. เมื่อเสร็จสมบูรณ์ an exception handler, ถ้ามี a
                                        pending exception ที่ตรงตามข้อกำหนดสำหรับ exception entry, the stack pop จะถูกข้ามไปและ
                                        ควบคุมการส่งถ่ายไปยัง the new exception handler.
Late-arriving                 กลไกนี้เร่งความเร็ว preemption. ถ้า a higher priority exception เกิดขึ้นในระหว่าง state saving
                                       สำหรับ a previous exception, the processor จะสลับไปจัดการ the higher priority exception
                                       และเริ่มต้น the vector fetch สำหรับ exception นั้น. State saving จะไม่ได้รับผลกระทบจาก late
                                       arrival เนื่องจาก the state saved เป็นเหมือนกันสำหรับทั้งสอง exceptions. ดังนั้น the state
                                       saving จะดำเนินต่อไปโดยไม่หยุดชะงัก. The processor สามารถยอมรับ a late arriving exception
                                       จนกระทั่ง the first instruction ของ the exception handler ของ the original exception เข้าสู่
                                       the execute stage ของ the processor. เมื่อ return จาก the exception handler ของ the late-
                                       arriving exception, the normal tail-chaining rules apply(ประยุกต์ใช้).
Title: Re: STM32F1 Programming Manual
Post by: tha on August 18, 2022, 09:45:45 am
Exception entry(การเข้าสู่)

Exception entry เกิดขึ้นเมื่อมี a pending exception ที่มี sufficient priority และอย่างใดอย่างหนึ่ง:
•   The processor อยู่ใน Thread mode
•   The new exception มี priority สูงกว่า the exception ที่กำลังถูกจัดการ, ซึ่งในกรณีนี้ the new exception ยึดไว้ใช้สิทธิ์ทำงานก่อน the original exception.

เมื่อ exception หนึ่งยึดไว้ใช้สิทธิ์ทำงานก่อน exception อื่นอีกตัวหนึ่ง, the exceptions จะซ้อนกัน.

Sufficient priority หมายถึง the exception มี priority มากกว่าขีดจำกัดใดๆที่เซ็ตโดย the mask registers, ดู Exception mask registers บนหน้า 19. An exception ที่มี priority น้อยกว่านี้อยู่ระหว่างรอดำเนินการแต่จะไม่ถูกจัดการโดย the processor.

เมื่อ the processor ได้รับ an exception, ยกเว้น the exception เป็น a tail-chained หรือ a late-arriving exception, the processor จะใส่(pushes) information ลงบน the current stack. การดำเนินการนี้ถูกเรียกว่า stacking และ the structure ของ eight data words ถูกเรียกว่า stack frame. The stack frame บรรจุ the following information:
•   R0-R3, R12
•   Return address
•   PSR
•   LR.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 18, 2022, 10:00:28 am
ทันทีหลังจาก stacking, the stack pointer จะระบุ the lowest address ใน the stack frame. ยกเว้น stack alignment ถูกปิดใช้งาน, the stack frame ถูกจัดแถวเป็น a double-word address. ถ้า the STKALIGN bit ของ the Configuration Control Register (CCR) ถูกเซ็ตเป็น 1, stack align adjustment จะถูกดำเนินการในระหว่าง stacking.

The stack frame รวมเอาไว้ the return address. นี้คือ the address ของ the next instruction ในโปรแกรมที่ถูกอินเตอรฺรัพท์. ค่านี้จะถูกกู้คืนไปยัง the PC ที่ exception return เพื่อว่าโปรแกรมที่ถูกอินเตอรฺรัพท์จะกลับมาทำงานต่อ.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 18, 2022, 10:17:30 am
ควบคู่ไปกับ the stacking operation, the processor กระทำ a vector fetch ที่อ่าน the exception handler start address จาก the vector table. เมื่อ stacking เสร็จสมบูรณ์, the processor สตาร์ทการปฏิบัติ the exception handler. ในเวลาเดียวกัน, the processor จะเขียน an EXC_RETURN value ไปยัง the LR. นี้ระบุซึ่ง stack pointer ตรงกันกับ the stack frame และ operation mode อะไรที่ the processor เคยอยู่ในนั้นก่อน the entry จะเกิดขึ้น.

ถ้าไม่มี higher priority exception เกิดขึ้นในระหว่าง exception entry, the processor สตาร์ทการปฏิบัติ the exception handler และเปลี่ยนโดยอัตโนมัติสถานะของ the corresponding pending interrupt ไปเป็น active

ถ้า higher priority exception อื่นอีกตัวหนึ่งเกิดขึ้นในระหว่าง exception entry, the processor สตาร์ทการปฏิบัติ the exception handler สำหรับ exception นี้และไม่เปลี่ยน the pending status ของ the earlier exception. นี้คือ the late arrival case.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 18, 2022, 11:01:05 am
Exception return

Exception return เกิดขึ้นเมื่อ the processor อยู่ใน Handler mode และปฏิบัติหนึ่งของคำสั่งต่อไปนี้เพื่อโหลด the EXC_RETURN value ลงใน the PC:
•   A POP instruction ที่รวม the PC ไว้
•   A BX instruction ด้วย register ใดๆ.
•   An LDR or LDM instruction ที่มี the PC เป็น the destination(ปลายทาง)

EXC_RETURN คือค่าที่โหลดลงใน the LR ตอน exception entry. The exception mechanism อาศัยค่านี้ในการตรวจจับเมื่อ the processor เสร็จสมบูรณ์ an exception handler. The lowest four bits ของค่านี้จัดให้มี information เกี่ยวกับ the return stack และ processor mode. Table 17 แสดง the EXC_RETURN[3:0] values ที่มีคำอธิบายของ the exception return behavior

The processor เซ็ต EXC_RETURN bits[31:4] เป็น 0xFFFFFFF. เมื่อค่านี้ถูกโหลดลงใน the PC มันแสดงไปยัง the processor ว่า the exception เสร็จสมบูรณ์, และ the processor เริ่มต้น the exception return sequence.

(https://i.imgur.com/PblWJTQ.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 18, 2022, 03:15:42 pm
2.4 Fault handling

Faults คือ a subset ของ the exceptions, ดู Exception model บนหน้า 32. สิ่งต่อไปนี้สร้าง a fault:
•   A bus error on:
     –   An instruction fetch or vector table load
     –   A data access
•   An internally-detected error อย่างเช่น an undefined instruction หรือความพยายามเพื่อเปลี่ยน state ด้วย a BX instruction
•   ความพยายามปฏิบัติ an instruction จาก a memory region ที่ทำเครื่องหมายเป็น Non-Executable(XN).

2.4.1 Fault types

Table 18 แสดง the types of fault, the handler ที่ใช้สำหรับ the fault, the corresponding fault status register, and the register bit ที่แสดงให้เห็นว่า the fault ได้เกิดขึ้นแล้ว. ดู Configurable fault status register (SCB_CFSR) บนหน้า 142 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ the fault status registers.

(https://i.imgur.com/lEbvI4A.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 08:50:11 am
2.4.2 Fault escalation and hard faults

ทุก faults exceptions ยกเว้นสำหรับ hard fault จะมี configurable exception priority, ดู System handler priority registers (SHPRx) บนหน้า 138. Software สามารถปิดใช้งานการปฏิบัติของ the handlers สำหรับ faults เหล่านี้, ดู System handler control and state register (SCB_SHCSR) บนหน้า 140.

โดยปกติ, the exception priority, ร่วมกันกับค่าของ the exception mask registers, จะกำหนดว่า the processor เข้าสู่ the fault handler หรือไม่, และว่า a fault handler สามารถยึดไว้ใช้สิทธิ์ทำงานก่อน another fault handler. ตามที่อธิบายใน Section 2.3: Exception model บนหน้า 32.

ในบางสถานการณ์, a fault ที่มี configurable priority ถูกถือว่าเป็น a hard fault. สิ่งนี้ถูกเรียกว่า priority escalation, และ the fault ถูกอธิบายเป็นการบานปลายเป็น hard fault. การบานปลายเป็น hard fault เกิดขึ้นเมื่อ:
•   A fault handler ทำให้เกิด fault ประเภทเดียวกันกับ fault หนึ่งที่มันกำลังให้บริการ. escalation to hard fault นี้เกิดขึ้นเนื่องจาก a
     fault handler ไม่สามารถยึดไว้ใช้สิทธิ์ทำงานก่อนตัวมันเองเนื่องจากมันต้องมี priority เดียวกันกับ the current priority level.
•   A fault handler ทำให้เกิด a fault ที่มี priority เดียวกันหรือต่ำกว่า the fault ที่มันกำลังให้บริการ. นี้เนื่องจาก the handler สำหรับ
     the new fault ไม่สามารถยึดไว้ใช้สิทธิ์ทำงานก่อน the currently executing fault handler.
•   An exception handler ทำให้เกิด a fault ที่ the priority เท่ากับหรือต่ำกว่า the currently executing exception.
•   A fault เกิดขึ้นและ the handler สำหรับ fault นั้นไม่ถูกเปิดใช้งาน.

ถ้า a bus fault เกิดขึ้นในระหว่าง a stack push เมื่อเข้าสู่ a bus fault handler, the bus fault ไม่บานปลายเป็น a hard fault. นี้หมายความวาถ้า a corrupted stack ทำให้เกิด a fault, the fault handler จะปฏิบัติถึงแม้ว่า the stack push สำหรับ the handler จะล้มเหลว. The fault handler ทำงานแต่ the stack contents จะเสียหาย.

มีเพียง Reset and NMI ที่สามารถยึดไว้ใช้สิทธิ์ทำงานก่อน the fixed priority hard fault. A hard fault สามารถยึดไว้ใช้สิทธิ์ทำงานก่อน exception ใดๆนอกเหนือจาก Reset, NMI, หรือ another hard fault.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 09:29:25 am
2.4.3 Fault status registers and fault address registers

The fault status registers แสดงให้เห็นสาเหตุของ a fault. สำหรับ bus faults and memory management faults, the fault address register แสดงให้เห็น the address ที่เข้าถึงโดยการทำงานที่ทำให้เกิด the fault, ดังแสดงใน Table 19.

(https://i.imgur.com/K4MHu5c.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 09:45:45 am
2.4.4 Lockup

The processor เข้าสู่ a lockup state ถ้า a hard fault เกิดขึ้นเมื่อปฏิบัติ the NMI หรือ hard fault handlers. เมื่อ the processor อยู่ใน lockup state มันจะไม่ปฏิบัติคำสั่งใดๆ. The processor ยังคงอยู่ใน lockup state จนกระทั่งอย่างใดอย่างหนึ่ง :
•   มันถูก reset
•   An NMI เกิดขึ้น

ถ้า lockup state เกิดขึ้นจาก the NMI handler a subsequent NMI ไม่เป็นเหตุให้ the processor ออกจาก lockup state.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 09:58:21 am
2.5 Power management

The STM32 and Cortex-M3 processor sleep modes จะลด power consumption:
•   Sleep mode หยุด the processor clock. system อื่นทั้งหมดและ peripheral clocks อาจยังคงรันอยู่.
•   Deep sleep mode หยุดส่วนใหญ่ของ the STM32 system และ peripheral clocks. ที่ product level, นี้ตรงกันกับอย่างใดอย่าง
     หนึ่ง the Stop หรือ the Standby mode. สำหรับรายละเอียดเพิ่มเติม, โปรดดูที่ the “Power modes” Section ใน the STM32
     reference manual.

The SLEEPDEEP bit ของ the SCR จะเลือก sleep mode ที่ถูกใช้, ดู System control register (SCB_SCR) บนหน้า 136. สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทำงานของ the sleep modes ดู the STM32 product reference manual.

ส่วนนี้อธิบายกลไกสำหรับการเข้าสู่ sleep mode, และเงื่อนไขสำหรับการ waking up จาก sleep mode.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 10:32:58 am
2.5.1 Entering sleep mode

ส่วนนี้อธิบาย the mechanisms software สามารถใช้เพื่อผลัก the processor ลงใน sleep mode.

The system สามารถสร้าง spurious wakeup events, ตัวอย่างเช่น a debug operation จะปลุก the processor ขึ้น. ดังนั้น software ต้องสามารถที่จะผลัก the processor กลับลงใน sleep mode หลังจาก an event ดังกล่าว. A program อาจจะมี an idle loop เพื่อผลัก the processor กลับไปยัง sleep mode.

Wait for interrupt

The wait for interrupt instruction, WFI, เป็นเหตุให้เข้าสู่ sleep mode ทันที. เมื่อ the processor ปฏิบัติ a WFI instruction มันจะหยุดปฏิบัติ instructions และเข้าสู่ sleep mode. ดู WFI บนหน้า 104 สำหรับข้อมูลเพิ่มเติม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 11:12:21 am
Wait for event

The wait for event instruction, WFE, เป็นเหตุให้เข้าสู่ sleep mode โดยมีเงื่อนไขตามค่าของ an one-bit event register. เมื่อ the processor ปฏิบัติ a WFE instruction, มันจะตรวจสอบ register นี้:
•   ถ้า the register เป็น 0 the processor จะหยุดการปฏิบัติ instructions และเข้าสู่ sleep mode
•   ถ้า the register เป็น 1 the processor จะเคลียร์ the register เป็น 0 และปฏิบัติ instructions ต่อเนื่องไปโดยไม่มีการเข้าสู่ sleep
     mode.

ดู WFE บนหน้า 103 สำหรับข้อมูลเพิ่มเติม.

ถ้า the event register เป็น 1, นี้แสดงให้เห็นว่า the processor ต้องไม่เข้าสู่ sleep mode ตอนการปฏิบัติของ a WFE instruction. โดยปกติ, นี้เนื่องจาก an external event signal ถูกยืนยัน, หรือ a processor ใน the system ที่ปฏิบัติ an SEV instruction, ดู SEV บนหน้า 102. Software ไม่สามารถเข้าถึง register นี้ได้โดยตรง.

Sleep-on-exit

ถ้า the SLEEPONEXIT bit ของ the SCR ถูกเซ็ตเป็น 1, เมื่อ the processor เสร็จสมบูรณ์การปฏิบัติของ an exception handler มันจะรีเทิร์นไปยัง Thread mode และเข้าสู่ sleep mode ทันที. ใช้กลไกนี้ใน applications ที่ต้องการเพียง the processor ทำงานเมื่อ an exception เกิดขึ้น.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 11:52:48 am
2.5.2 Wakeup from sleep mode

เงื่อนไขในการปลุกโปรเซสเซอร์ขึ้นอยู่กับกลไกที่ทำให้มันเข้าสู่ sleep mode.

Wakeup from WFI or sleep-on-exit

โดยปกติ, the processor จะปลุกเฉพาะเมื่อมันตรวจพบ an exception ที่มี sufficient priority ทีเป็นเหตุให้เข้าสู่ exception.

บาง embedded systems อาจต้องปฏิบัติ system restore tasks หลังจาก the processor ปลุกขึ้น, และก่อนมันปฏิบัติ an interrupt handler. เพื่อให้สำเร็จผลนี้ เซ็ต the PRIMASK bit เป็น 1 และ the FAULTMASK bit เป็น 0. ถ้า an interrupt มาถึงซึ่งถูกเปิดใช้งานและมี priority สูงกว่า current exception priority, the processor จะปลุกขึ้นแต่ไม่ปฏิบัติ the interrupt handler จนกว่า the processor จะเซ็ต PRIMASK เป็นศูนย์. สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ PRIMASK and FAULTMASK ดู Exception mask registers บนหน้า 19.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 12:05:37 pm
Wakeup from WFE

The processor จะปลุกขึ้นถ้า:
•   มันตรวจพบ an exception  ที่มี sufficient priority ทีเป็นเหตุให้เข้าสู่ exception.
•   มันตรวจพบ an external event signal, ดู The external event input บนหน้า 43

นอกจากนี้, ถ้า the SEVONPEND bit ใน the SCR ถูกเซ็ตเป็น 1, any new pending interrupt จะทริก an event และปลุก the processor, แม้ว่า the interrupt ถูกปิดใช้งานหรือมี insufficient priority ที่เป็นเหตุให้ exception entry. สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ the SCR see System control register (SCB_SCR) บนหน้า 136
Title: Re: STM32F1 Programming Manual
Post by: tha on August 19, 2022, 05:34:53 pm
2.5.3 The external event input

The processor จัดให้มี an external event input signal. signal นี้สามารถถูกสร้างโดย the up to 16 external input lines, โดย the PVD, RTC alarm หรือโดย the USB wakeup event, ที่กำหนดค่าผ่านทาง the external interrupt/event controller (EXTI).

signal นี้สามารถปลุก the processor จาก WFE, หรือเซ็ต the internal WFE event register เป็นหนึ่งเพื่อแสดงให้เห็นว่า the processor ต้องไม่เข้าสู่ sleep mode ตาม a later(ต่อมา) WFE instruction, ดู Wait for event บนหน้า 42. สำหรับรายละเอียดเพิ่มเติมโปรดดูที่ the STM32 reference manual, section 4.3 Low power modes.

2.5.4 Power management programming hints

ANSI C ไม่สามารถสร้าง the WFI and WFE instructions ได้โดยตรง. The CMSIS จัดให้มี the following intrinsic functions สำหรับคำสั่งเหล่านี้:
void __WFE(void)   // Wait for Event
void __WFI(void)   // Wait for Interrupt
Title: Re: STM32F1 Programming Manual
Post by: tha on August 20, 2022, 07:35:49 am
3   The Cortex®-M3 instruction set

3.1   Instruction set summary

The processor จัดให้มีใช้ a version ของ the thumb instruction set. Table 20 แสดงรายการ the supported instructions.

ใน Table 20:
•   Angle brackets, <>, ล้อมรอบรูปแบบทางเลือกของตัวถูกดำเนินการ
•   Braces, {}, ล้อมรอบตัวถูกดำเนินการที่ให้เลือกได้
•   The operands column ไม่ครบถ้วนสมบูรณ์
•   Op2 คือ a flexible second operand ซึ่งสามารถเป็นอย่างใดอย่างหนึ่ง a register หรือ a constant
•   instructions ส่วนใหญ่สามารถใช้ an optional condition code suffix

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ the instructions and operands, ดู the instruction descriptions.

(https://i.imgur.com/A9Enuva.png)
(https://i.imgur.com/VFXzx4c.png)
(https://i.imgur.com/HPW5PCP.png)
(https://i.imgur.com/Zh7RpnE.png)
(https://i.imgur.com/F2bHEbx.png)
(https://i.imgur.com/6K19DbH.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 20, 2022, 09:02:37 am
3.2  Intrinsic functions

ANSI ไม่สามารถเข้าถึงบาง Cortex-M3 instructions ได้โดยตรง. section นี้อธิบาย intrinsic functions ที่สามารถสร้าง instructions เหล่านี้, ที่จัดให้มีโดย the CMIS และที่อาจถูกจัดให้มีโดย a C compiler. ถ้า a C compiler ไม่รองรับ an appropriate intrinsic function, คุณอาจต้องใช้ an inline assembler เพื่อเข้าถึงบางคำสั่ง.

The CMSIS จัดให้มี the intrinsic functions ที่แสดงรายการใน Table 21 เพื่อสร้างคำสั่งที่ ANSI ไม่สามารถเข้าถึงได้โดยตรง.
(https://i.imgur.com/4XazHsN.png)

The CMSIS จัดให้มีจำนวนหนึ่งของ functions สำหรับการเข้าถึง the special registers โดยใช้คำสั่ง MRS และ MSR อีกด้วย (ดู Table 22).
(https://i.imgur.com/aM6FPtl.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 20, 2022, 01:17:46 pm
3.3 About the instruction descriptions

The following sections ให้ข้อมูลเพิ่มเติมเกี่ยวกับการใช้ the instructions:
•   Operands on page 50
•   Restrictions when using PC or SP on page 51
•   Flexible second operand on page 51
•   Shift operations on page 52
•   Address alignment on page 55
•   PC-relative expressions on page 56
•   Conditional execution on page 56
•   Instruction width selection on page 58.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 20, 2022, 02:35:33 pm
3.3.1 Operands

An instruction operand สามารถเป็น an Arm register, a constant, หรือ another instruction-specific parameter. Instructions ทำงานกับ the operands และมักจะเก็บผลลัพธ์ใน a destination register. เมื่อมี a destination register ใน the instruction, มันมักจะถูกระบุก่อน the operands.

Operands ในบาง instructions มีความยืดหยุ่นโดยที่พวกมันสามารถเป็นอย่างใดอย่างหนึ่ง a register หรือ a constant (ดู Flexible second operand).
Title: Re: STM32F1 Programming Manual
Post by: tha on August 20, 2022, 02:51:43 pm
3.3.2 Restrictions when using PC or SP

คำสั่งจำนวนมากมีข้อจำกัดเกี่ยวกับว่าคุณสามารถใช้ the program counter (PC) หรือ stack pointer (SP) สำหรับ the operands หรือ destination register. ดู instruction descriptions สำหรับข้อมูลเพิ่มเติม.

Bit[0] ของ address ใดๆที่เขียนไปยัง the PC ด้วย a BX, BLX, LDM, LDR, or POP instruction ต้องเป็น 1 เพื่อการปฏิบัติที่ถูกต้อง, เนื่องจากบิทนี้แสดงให้เห็น the required instruction set, และ the Cortex-M3 processor รองรับเฉพาะ thumb instructions.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 21, 2022, 08:36:38 am
3.3.3 Flexible second operand

คำสั่งในการประมวลผลข้อมูลทั่วไปจำนวนมากมี a flexible second operand. นี้จะแสดงเป็น operand2 ในคำอธิบายของไวยากรณ์ของแต่ละคำสั่ง.

Operand2 สามารถเป็น :
•   Constant
•   Register with optional shift

Constant

คุณระบุ an operand2 constant ใน the form #constant, โดยที่ constant สมารถเป็น:
•   constant ใดๆที่สามารถถูกสร้างขึ้นโดยการเลื่อน an 8-bit value ไปทางซ้ายตามจำนวนของ bits ใดๆภายใน a 32-bit word.
•   constant ใดๆของ the form 0x00XY00XY
•   constant ใดๆของ the form 0xXY00XY00
•   constant ใดๆของ the form 0xXYXYXYXY
ใน the constants ที่แสดงข้างบน, X และ Y คือ hexadecimal digits.

นอกจากนี้ ในคำสั่งจำนวนน้อย, constant สามารถได้รับช่วงค่าที่กว้างกว่าได้. เหล่านี้ถูกอธิบายใน the individual instruction descriptions.

เมื่อ an operand2 constant ถูกใช้กับ the instructions MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ or TST, the carry flag ถูกอัฟเดตไปยัง bit[31] ของ the constant, ถ้า the constant ใหญ่กว่า 255 และสามารถถูกสร้างโดยการเลื่อน an 8-bit value. คำสั่งเหล่านี้จะไม่มีผลกับ the carry flag ถ้า operand2 เป็น constant อื่นใดๆ.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 21, 2022, 09:02:47 am
Instruction substitution

assembler ของคุณอาจจะสามารถสร้าง an equivalent instruction ในกรณีที่คุณระบุ a constant ที่ไม่ได้รับอนุญาต. ตัวอย่างเช่น, an assembler อาจประกอบ the instruction CMP Rd, #0xFFFFFFFE เป็น the equivalent instruction CMN Rd, #0x2.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 21, 2022, 09:24:55 am
Register with optional shift

An operand2 register ถูกระบุใน the form Rm {, shift}, โดยที่:
•   Rm คือ the register ที่เก็บ the data สำหรับ the second operand
•   Shift คือ an optional shift ที่จะถูกใช้กับ Rm. มันสามารถเป็นหนึ่งใน:
          ASR #n: Arithmetic shift right n bits, 1 ≤ n ≤ 32
          LSL #n: Logical shift left n bits, 1 ≤ n ≤ 31
          LSR #n: Logical shift right n bits, 1 ≤ n ≤ 32
          ROR #n: Rotate right n bits, 1 ≤ n ≤ 31
          RRX: Rotate right one bit, with extend
          —: ถ้าละเว้น, จะไม่มีการเลื่อนเกิดขึ้น, เทียบเท่ากับ LSL #0

ถ้าคุณละเว้น the shift, หรือระบุ LSL #0, the instruction จะใช้ค่าใน Rm.

ถ้าคุณระบุ a shift, the shift จะถูกใช้กับค่าใน Rm, และ the resulting 32-bit value จะถูกใช้โดย the instruction. อย่างไรก็ตาม, สิ่งที่บรรจุอยู่ภายในใน the register Rm ยังคงไม่เปลี่ยน. การระบุ a register ด้วย shift จะอัฟเดต the carry flag ด้วยเมื่อใช้กับ certain instructions. สำหรับข้อมูลเกี่ยวกับ the shift operations และผลกระทบที่มีต่อ the carry flag, ดู Shift operations.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 21, 2022, 10:38:24 am
3.3.4 Shift operations

Register shift operations ย้าย the bits ใน a register ไปทางซ้ายหรือทางขวาตามจำนวนที่ระบุของบิต, the shift length. Register shift สามารถถูกดำเนินการ:
•   โดยตรงโดยคำสั่ง ASR, LSR, LSL, ROR, and RRX. ผลลัพธ์ถูกเขียนไปยัง a destination register
•   ในระหว่างการคำนวณของ operand2 โดยคำสั่งที่ระบุ the second operand เป็น a register ที่มีการเลื่อน (ดู Flexible second
     operand บนหน้า 51). ผลลัพธ์ถูกใช้โดยคำสั่ง.

The permitted shift lengths ขึ้นอยู่กับ the shift type และ the instruction (ดู the individual instruction description หรือ Flexible second operand). ถ้า the shift length เป็น 0, จะไม่มีการเลื่อนเกิดขึ้น. Register shift operations จะอัฟเดต the carry flag ยกเว้นเมื่อ the specified shift length เป็น 0. The following sub-sections อธิบาย the various shift operations และผลกระทบที่มีต่อ the carry flag. ในคำอธิบายเหล่านี้, Rm คือ the register ที่บรรจุค่าที่จะถูกเลื่อน, และ n คือ the shift length.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 21, 2022, 11:57:11 am
ASR

Arithmetic shift right ทีละ n bits จะย้าย the left-hand 32-n bits ของ the register Rm, ไปทางขวา n ตำแหน่ง, ลงใน the right-hand 32-n bits ของผลลัพธ์. และมันก๊อปปี้ the original bit[31] ของ the register ลงใน the left-hand n bits ของผลลัพธ์ (ดู Figure 13: ASR#3 บนหน้า 53).

คุณสามารถใช้ the ASR #n operation เพื่อหารค่าใน the register Rm ด้วย 2^n, โดยผลลัพธ์จะถูกปัดเศษไปทาง negative-infinity

เมื่อคำสั่งเป็น ASRS หรือเมื่อ ASR #n ถูกใช้ใน operand2 ที่มีคำสั่ง MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ or TST, the carry flag จะถูกอัฟเดตไปยังบิตสุดท้ายที่เลื่อนออก, bit[n-1], ของ the register Rm.

Note:    1 ถ้า n เป็น 32 หรือมากกว่า, ทุก the bits ใน the result จะถูกเซ็ตไปยังค่าของ bit[31] ของ Rm.
             2 ถ้า n เป็น 32 หรือมากกว่าและ the carry flag ถูกอัฟเดต, มันจะถูกอัฟเดตไปยังค่าของ bit[31] ของ Rm.


(https://i.imgur.com/y3HHARQ.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 21, 2022, 02:11:16 pm
LSR

Logical shift right ทีละ n bits จะย้าย the left-hand 32-n bits ของ the register Rm, ไปทางขวา n ตำแหน่ง, ลงใน the right-hand 32-n bits ของผลลัพธ์. และมันจะเซ็ต the left-hand n bits ของผลลัพธ์เป็น 0 (ดู Figure 14).

คุณสามารถใช้ the LSR #n operation เพื่อหารค่าใน the register Rm ด้วย 2^n, หากค่านั้นถูกคำนึงถึงเป็น an unsigned integer.

เมื่อคำสั่งเป็น LSRS หรือเมื่อ LSR #n ถูกใช้ใน operand2 ที่มีคำสั่ง MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ or TST, the carry flag จะถูกอัฟเดตไปยังบิตสุดท้ายที่เลื่อนออก, bit[n-1], ของ the register Rm

Note:  1 ถ้า n เป็น 32 หรือมากกว่า, ดังนั้นทุก the bits ในผลลัพธ์จะถูกเคลียร์เป็น 0.
           2 ถ้า n เป็น 32 หรือมากกว่าและ the carry flag ถูกอัฟเดต, มันจะถูกอัฟเดตเป็น 0.


(https://i.imgur.com/yB9pgKx.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 22, 2022, 07:29:50 am
LSL

Logical shift left ทีละ n bits จะย้าย the right-hand 32-n bits ของ the register Rm, ไปทางซ้าย n ตำแหน่ง, ลงใน the left-hand 32-n bits ของ the result. และมันเซ็ต the right-hand n bits ของ the result เป็น 0 (ดู Figure 15: LSL#3 บนหน้า 54).

คุณสามารถใช้ the LSL #n operation เพื่อคูณค่าใน the register Rm ด้วย 2^n, หากค่านั้นถูกคำนึงถึงเป็น an unsigned integer หรือ a two’s complement signed integer. Overflow สามารถเกิดขึ้นได้โดยไม่มีการเตือน.

เมื่อคำสั่งคือ LSLS หรือเมื่อ LSL #n, ที่มี n ที่ไม่ใช่ศูนย์, ถูกใช้ใน operand2 กับคำสั่ง MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ or TST, the carry flag จะถูกอัฟเดตไปยังบิตสุดท้ายที่เลื่อนออก, bit[32-n], ของ the register Rm. คำสั่งเหล่านี้ไม่กระทบต่อ the carry flag เมื่อใช้ด้วย LSL #0.

Note:  1 ถ้า n เป็น 32 หรือมากกว่า, ดังนั้นทุก the bits ในผลลัพธ์จะถูกเคลียร์เป็น 0.
           2 ถ้า n เป็น 33 หรือมากกว่าและ the carry flag ถูกอัฟเดต, มันจะถูกอัฟเดตเป็น 0.


(https://i.imgur.com/V1hYmn3.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 22, 2022, 11:13:05 am
ROR

Rotate right ทีละ n bits จะย้าย the left-hand 32-n bits ของ the register Rm, ไปทางขวา n ตำแหน่ง, ลงใน the right-hand 32-n bits ของ the result. มันย้าย the right-hand n bits ของ the register ลงใน the left-hand n bits ของ the result อีกด้วย (ดู Figure 16).

เมื่อคำสั่งคือ RORS หรือเมื่อ ROR #n ถูกใช้ใน operand2 กับคำสั่ง MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ or TST, the carry flag จะถูกอัฟเดตไปยัง the last bit rotation, bit[n-1], ของ the register Rm.

Note:  1   ถ้า n คือ 32, ดังนั้นค่าของ the result เป็นอย่างเดียวกับค่าใน Rm, และถ้า the carry flag ถูกอัฟเดต, มันจะถูกอัฟเดตไปยัง
                 bit[31] ของ Rm.
            2   ROR ที่มี shift length, n, มากกว่า 32 จะเป็นอย่างเดียวกับ ROR ที่มี shift length n-32.


(https://i.imgur.com/yaPar9J.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 22, 2022, 11:47:53 am
RRX

Rotate right with extend จะย้าย the bits ของ the register Rm ไปทางขวาทีละ one bit. และมันจะก๊อปปี้ the carry flag ลงใน bit[31] ของ the result (ดู Figure 17).

เมื่อคำสั่งคือ RRXS หรือเมื่อ RRX ถูกใช้ใน operand2 กับคำสั่ง MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ or TST, the carry flag จะถูกอัฟเดตไปยัง bit[0] ของ the register Rm.

(https://i.imgur.com/xg4w835.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 22, 2022, 01:44:23 pm
3.3.5 Address alignment

An aligned access คือ an operation โดยที่ a word-aligned address ถูกใช้สำหรับ a word, dual word, หรือหลาย word access, หรือโดยที่ a halfword-aligned address ถูกใช้สำหรับ a halfword access. Byte accesses จะถูกจัดแถวเสมอ.

The Cortex-M3 processor รองรับ unaligned access เฉพาะสำหรับ the following instructions:
•   LDR, LDRT
•   LDRH, LDRHT
•   LDRSH, LDRSHT
•   STR, STRT
•   STRH, STRHT

คำสั่ง load และ store อื่นทั้งหมดจะสร้าง a usage fault exception ถ้าพวกมันกระทำ an unaligned access, และดังนั้นการเข้าถึงของพวกมันต้องเป็น address aligned. สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ faults ดู Fault handling บนหน้า 39.

Unaligned accesses มักจะช้ากว่า aligned accesses. นอกจากนี้, บาง memory regions อาจไม่รองรับ unaligned accesses. ดังนั้น, Arm ขอแนะนำว่า programmers ต้องแน่ใจว่า accesses ถูกจัดแถว. เพื่อหลีกเลี่ยง accidental generation ของ unaligned accesses, ใช้ the UNALIGN_TRP bit ใน the configuration and control register เพื่อดักจับทุก unaligned accesses, ดู Configuration and control register (SCB_CCR) บนหน้า 137.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 22, 2022, 04:35:43 pm
3.3.6 PC-relative expressions

A PC-relative expression หรือ label คือ a symbol ที่แสดงถึง the address ของ an instruction หรือ literal data. มันถูกแสดงใน the instruction เป็น the PC value บวกหรือลบด้วยตัวเลขหักกลบลบกัน(offset). The assembler คำนวณ the required offset จาก the label และ the address ของ the current instruction. ถ้า the offset ใหญ่เกินไป, the assembler จะสร้าง an error.

•   สำหรับ the B, BL, CBNZ, and CBZ instructions, ค่าของ the PC คือ the address ของ the current instruction บวก four
     bytes.
•   สำหรับคำสั่งอื่นทั้งหมดที่ใช้ labels, ค่าของ the PC คือ the address ของ the current instruction บวก four bytes, ที่มี bit[1]
     ของ the result ถูกเคลียร์เป็น 0 เพื่อทำให้มันจัดแถวเป็นเวิร์ด.
•   assembler ของคุณอาจอนุญาตให้ใช้รูปแบบอื่นสำหรับ PC-relative expressions, อย่างเช่น a label บวกหรือลบ a number, หรือ
     an expression ของ the form [PC, #number].
Title: Re: STM32F1 Programming Manual
Post by: tha on August 23, 2022, 08:58:04 am
3.3.7 Conditional execution

Most data processing instructions สามารถเลือกอัฟเดต the condition flags ใน the application program status register (APSR) สอดคล้องกับผลลัพธ์ของการดำเนินการ (ดู Application program status register บนหน้า 17). บางคำสั่งจะอัฟเดตทุก flags, และบางคำสั่งจะอัฟเดตเฉพาะ a subset. ถ้า a flag ไม่ถูกอัฟเดต, ค่าเดิมจะถูกรักษาไว้. ดู the instruction descriptions สำหรับ the flags ที่พวกมันมีผล.

คุณสามารถปฏิบัติคำสั่งแบบมีเงื่อนไข, โดยยึดตาม the condition flags ที่เซ็ตในคำสั่งอื่น :
•   ทันทีหลังจาก the instruction นั้นอัฟเดต the flags
•   หลังจากมีคำสั่งแทรกแซงจำนวนหนึ่งที่ยังไม่ถูกอัปเดต the flags

Conditional execution มีให้ใช้งานโดยการใช้ conditional branches หรือโดยการเพิ่ม condition code suffixes ไปยัง instructions. ดู Table 23: Condition code suffixes บนหน้า 57 สำหรับการแสดงรายการของ the suffixes ที่เพิ่มไปยังคำสั่งเพื่อทำให้พวกมันเป็นคำสั่งแบบมีเงื่อนไข. The condition code suffix ช่วยให้ the processor สามารถทดสอบเงื่อนไขขึ้นอยู่กับ the flags. หากการทดสอบเงื่อนไขของ a conditional instruction ล้มเหลว, the instruction:
•   จะไม่ปฏิบัติ
•   จะไม่เขียนค่าใดๆไปยัง destination register ของมัน
•   จะไม่ส่งผลต่อ the flags ใดๆ
•   จะไม่สร้าง exception ใดๆ

Conditional instructions, ยกเว้นสำหรับ conditional branches, ต้องอยู่ภายใน an If-then instruction block. ดู IT บนหน้า 94 สำหรับข้อมูลเพิ่มเติมและข้อจำกัดเมื่อใช้ the IT instruction. ขึ้นอยู่กับผู้ขาย, the assembler อาจใส่ an IT instruction โดยอัตโนมัติถ้าคุณมี conditional instructions ภายนอก the IT block.

ใช้ the CBZ and CBNZ instructions เพื่อเปรียบเทียบค่าของ a register กับศูนย์และ branch ตาม the result.

ส่วนนี้อธิบาย:
•   The condition flags
•   Condition code suffixes on page 57
Title: Re: STM32F1 Programming Manual
Post by: tha on August 23, 2022, 09:51:43 am
The condition flags

The APSR บรรจุ the following condition flags:
•   N: เซ็ตเป็น 1 เมื่อ the result of the operation เป็นลบ, ถ้าเป็นอย่างอื่นถูกเคลียร์เป็น 0
•   Z: เซ็ตเป็น 1 เมื่อ the result of the operation เป็นศูนย์, ถ้าเป็นอย่างอื่นถูกเคลียร์เป็น 0
•   C: เซ็ตเป็น 1 เมื่อ the operation results ใน a carry, ถ้าเป็นอย่างอื่นถูกเคลียร์เป็น 0
•   V: เซ็ตเป็น 1 เมื่อ the operation ทำให้เกิด an overflow, ถ้าเป็นอย่างอื่นถูกเคลียร์เป็น 0

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ the APSR ดู Program status register บนหน้า 16.

A carry เกิดขึ้น:
•   ถ้าผลของการบวกใหญ่กว่าหรือเท่ากับ 2^32
•   ถ้าผลของการลบเป็นบวกหรือศูนย์
•   ตามผลของ an inline barrel shifter operation ใน a move หรือ logical instruction

Overflow เกิดขึ้นถ้าผลของการบวก, การลบ, หรือเปรียบเทียบใหญ่กว่าหรือเท่ากับ 2^31, หรือน้อยกว่า -2^31.

คำสั่งส่วนใหญ่จะอัฟเดต the status flags เฉพาะถ้า the S suffix ถูกระบุ. ดู the instruction descriptions สำหรับข้อมูลเพิ่มเติม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 23, 2022, 11:14:02 am
Condition code suffixes

คำสั่งที่สามารถกำหนดเงื่อนไขได้จะมี an optional condition code,ที่แสดงใน syntax descriptions เป็น {cond}. Conditional execution ต้องการ a preceding IT instruction. An instruction ที่มี a condition code จะถูกปฏิบัติเฉพาะถ้า the condition code flags ใน the APSR ตรงตามเงื่อนไขที่ระบุ. Table 23 แสดง the condition codes ที่ใช้.

คุณสามารถใช้ conditional execution ที่มี the IT instruction เพื่อลดจำนวนของ branch instructions ใน code.

Table 23 แสดงความสัมพันธ์ระหว่าง condition code suffixes และ the N, Z, C, and V flags ด้วย.

(https://i.imgur.com/7dFqBxZ.png)
(https://i.imgur.com/UVoiVNI.png)

Specific example 1: Absolute value แสดงการใช้ของ a conditional instruction เพื่อหา the absolute value ของ a number. R0 = ABS(R1).
(https://i.imgur.com/MJu9gGg.png)

Specific example 2: Compare and update value แสดงการใช้ของ conditional instructions เพื่ออัฟเดตค่าของ R4 ถ้า the signed value R0 and R2 ใหญ่กว่า R1 and R3 ตามลำดับ.
(https://i.imgur.com/lYwJao4.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 23, 2022, 05:04:45 pm
3.3.8 Instruction width selection

มีคำสั่งมากมายที่สามารถสร้างอย่างใดอย่างหนึ่ง a 16-bit encoding หรือ a 32-bit encoding ขึ้นอยู่กับ the operands และ destination register ที่ระบุ. สำหรับบางส่วนของคำสั่งเหล่านี้, คุณสามารถบังคับ a specific instruction size โดยการใช้ an instruction width suffix. The .W suffix บังคับ a 32-bit instruction encoding. The .N suffix บังคับ a 16-bit instruction encoding.

ถ้าคุณระบุ an instruction width suffix และ the assembler ไม่สามารถสร้าง an instruction encoding ของ the requested width, มันจะสร้าง an error.

ในบางกรณีมันอาจจำเป็นต้องระบุ the .W suffix, ตัวอย่างเช่นถ้า the operand เป็น the label ของ an instruction หรือ literal data, ดังในกรณีของ branch instructions. สิ่งนี้เนื่องจาก the assembler อาจไม่สร้าง the right size encoding โดยอัตโนมัติ.

เพื่อใช้ an instruction width suffix, วางมันทันทีหลังจาก the instruction mnemonic และ condition code, หากมี. Specific example 3: Instruction width selection แสดงคำสั่งที่มี the instruction width suffix.

(https://i.imgur.com/JOsnfc0.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 23, 2022, 05:09:24 pm
(https://i.imgur.com/vMZsco6.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 08:08:04 am
3.4.1 ADR

Load PC-relative address.

Syntax

ADR{cond} Rd, label

โดยที่:
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rd’ คือ the destination register
•   ‘label’ คือ a PC-relative expression (ดู PC-relative expressions บนหน้า 56)

Operation

ADR กำหนด the address โดยการเพิ่ม an immediate value ไปยัง the PC. มันจะเขียน the result ไปยัง the destination register.

ADR จะผลิต position-independent code, เนื่องจาก the address เป็น PC-relative.

ถ้าคุณใช้ ADR สร้าง a target address สำหรับ a BX or BLX instruction, คุณต้องแน่ใจว่า bit[0] ของ the address ที่คุณสร้างถูกเซ็ตเป็น1 เพื่อ correct execution.

ค่าของ label ต้องอยู่ภายในช่วง -4095 ถึง 4095 จาก the address ใน the PC.

Note:  คุณอาจต้องใช้ the .W suffix เพื่อได้รับ the maximum offset range หรือเพื่อสร้าง addresses ที่ไม่ถูกจัดแถวเป็น word
           (ดู Instruction width selection บนหน้า 58).


Restrictions

Rd ต้องไม่ใช่ทั้ง SP หรือ PC.

Condition flags

คำสั่งนี้ไม่เปลี่ยนแปลง the flags.

Examples

     ADR R1, TextMessage; write address value of a location labelled as
            ; TextMessage to R1
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 10:28:18 am
3.4.2 LDR and STR, immediate offset

Load and store ที่มี immediate offset, pre-indexed immediate offset, หรือ post-indexed immediate offset.
(https://i.imgur.com/gDZGlLs.png)
where:
•   ‘op’ คืออย่างใดอย่างหนึ่ง LDR (load register) หรือ STR (store register)
•   ‘type’ คือหนึ่งของต่อไปนี้:
     B: Unsigned byte, ศูนย์ขยายถึง 32 bits ในการ loads
     SB: Signed byte, sign ขยายถึง 32 bits (LDR เท่านั้น)
     H: Unsigned halfword, ศูนย์ขยายถึง 32 bits ในการ loads
     SH: Signed halfword, sign ขยายถึง 32 bits (LDR เท่านั้น)
     —: ละเว้น, สำหรับ word
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rt’ คือ the register เพื่อ load หรือ store
•   ‘Rn’ คือ the register ซึ่ง the memory address ตั้งฐานอยู่
•   ‘offset’ คือระยะห่าง(an offset) จาก Rn. ถ้า offset ถูกละเว้น, the address คือสิ่งที่จุอยู่ภายในของ Rn
•   ‘Rt2’ คือ the additional register เพื่อ load หรือ store สำหรับ two-word operations
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 11:06:40 am
Operation

LDR instructions โหลด one or two registers ด้วย a value จาก memory. STR instructions เก็บ one or two register values ไปยัง memory.

Load and store instructions ที่มี immediate offset สามารถใช้ the following addressing modes:
•   Offset addressing
     The offset value ถูกเพิ่มไปยังหรือลบออกจาก the address ที่ได้รับจาก the register Rn. The result ถูกใช้เป็น the address
     สำหรับ the memory access. The register Rn ไม่ถูกเปลี่ยนแปลง. The assembly language syntax สำหรับโหมดนี้คือ: [Rn,
     #offset].
•   Pre-indexed addressing
     The offset value ถูกเพิ่มไปยังหรือลบออกจาก the address ที่ได้รับจาก the register Rn. The result ถูกใช้เป็น the address
     สำหรับ the memory access และถูกเขียนกลับลงใน the register Rn. The assembly language syntax สำหรับโหมดนี้คือ:
     [Rn, #offset]!
•   Post-indexed addressing
     The address ที่ได้รับจาก the register Rn ถูกใช้เป็น the address สำหรับ the memory access. The offset value ถูกเพิ่มไป
     ยังหรือลบออกจาก the address, และถูกเขียนกลับลงใน the register Rn. The assembly language syntax สำหรับโหมดนี้คือ:
     [Rn], #offset.

ค่าที่ load หรือ store สามารถเป็น a byte, halfword, word, หรือ two words. Bytes and halfwords สามารถเป็นอย่างใดอย่างหนึ่ง signed หรือ unsigned (ดู Address alignment บนหน้า 55).

Table 25 แสดงย่านของ offsets สำหรับ immediate, pre-indexed and post-indexed forms.

(https://i.imgur.com/KKaB4bj.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 11:50:01 am
Restrictions

•   สำหรับ load instructions
     –   Rt สามารถเป็น SP หรือ PC สำหรับ word loads เท่านั้น
     –   Rt ต้องแตกต่างจาก Rt2 สำหรับ two-word loads
     –   Rn ต้องแตกต่างจาก Rt and Rt2 ใน the pre-indexed หรือ post-indexed forms
•   เมื่อ Rt คือ PC ใน a word load instruction
     –   bit[0] ของ the loaded value ต้องเป็น 1 เพื่อการดำเนินการที่ถูกต้อง
     –   A branch จะเกิดขึ้นกับ the address ที่สร้างโดยการเปลี่ยน bit[0] ของ the loaded value เป็น 0
     –   หากคำสั่งเป็นแบบมีเงื่อนไข มันต้องเป็นคำสั่งสุดท้ายใน the IT block
•   สำหรับ store instructions
     –   Rt สามารถเป็น SP สำหรับ word stores เท่านั้น
     –   Rt ต้องไม่เป็น PC
     –   Rn ต้องไม่เป็น PC
     –   Rn ต้องแตกต่างจาก Rt and Rt2 ใน the pre-indexed หรือ post-indexed forms

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

(https://i.imgur.com/ppv6Te4.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 02:20:05 pm
3.4.3 LDR and STR, register offset

Load and store with register offset.

Syntax

op{type}{cond} Rt, [Rn, Rm {, LSL #n}]

โดยที่:
•   ‘op’ คืออย่างใดอย่างหนึ่ง LDR (load register) หรือ STR (store register)
•   ‘type’ คือหนึ่งของต่อไปนี้:
     B: Unsigned byte, ศูนย์ขยายถึง 32 bits ในการ loads
     SB: Signed byte, sign ขยายถึง 32 bits (LDR เท่านั้น)
     H: Unsigned halfword, ศูนย์ขยายถึง 32 bits ในการ loads
     SH: Signed halfword, sign ขยายถึง 32 bits (LDR เท่านั้น)
     —: ละเว้น, สำหรับ word
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rt’ คือ the register เพื่อ load หรือ store
•   ‘Rn’ คือ the register ซึ่ง the memory address ตั้งฐานอยู่
•   ‘Rm’ คือ a register ที่บรรจุ a value ที่จะถูกใช้เป็น the offset
•   ‘LSL #n’ คือ an optional shift, ที่มี n ในช่วง 0 ถึง 3
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 02:49:00 pm
Operation

LDR instructions โหลด a register ด้วย a value จาก memory. STR instructions เก็บ a register value ลงใน memory.

The memory address เพื่อโหลดจากหรือเก็บไปยังจะอยู่ที่ an offset จาก the register Rn. The offset ถูกระบุโดย the register Rm และสามารถถูกเลื่อนไปทางซ้ายได้สูงถึง 3 bits โดยใช้ LSL.

The value เพื่อ load หรือ store สามารถเป็น a byte, halfword, or word. สำหรับ load instructions, bytes and halfwords  สามารถเป็นอย่างใดอย่างหนึ่ง signed หรือ unsigned (ดู Address alignment บนหน้า 55).
Title: Re: STM32F1 Programming Manual
Post by: tha on August 24, 2022, 03:12:53 pm
Restrictions

ในคำสั่งเหล่านี้:
•   Rn ต้องไม่เป็น PC
•   Rm ต้องไม่เป็นทั้ง SP หรือ PC
•   Rt สามารถเป็น SP เฉพาะสำหรับ word loads และ word stores
•   Rt สามารถเป็น PC เฉพาะสำหรับ word loads

เมื่อ Rt คือ PC ใน a word load instruction
•   bit[0] ของ the loaded value ต้องเป็น 1 เพื่อการดำเนินการที่ถูกต้อง และ a branch จะเกิดขึ้นกับ halfword-aligned address นี้
•   หากคำสั่งเป็นแบบมีเงื่อนไข มันต้องเป็นคำสั่งสุดท้ายใน the IT block

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

(https://i.imgur.com/4bSYuC1.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 07:19:18 am
3.4.4 LDR and STR, unprivileged

Load and store with unprivileged access.

Syntax

op{type}T{cond} Rt, [Rn {, #offset}]; immediate offset

โดยที่:
•   ‘op’ คืออย่างใดอย่างหนึ่ง LDR (load register) หรือ STR (store register)
•   ‘type’ คือหนึ่งของต่อไปนี้:
     B: Unsigned byte, ศูนย์ขยายถึง 32 bits ในการ loads
     SB: Signed byte, sign ขยายถึง 32 bits (LDR เท่านั้น)
     H: Unsigned halfword, ศูนย์ขยายถึง 32 bits ในการ loads
     SH: Signed halfword, sign ขยายถึง 32 bits (LDR เท่านั้น)
     —: ละเว้น, สำหรับ word
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rt’ คือ the register เพื่อ load หรือ store
•   ‘Rn’ คือ the register ซึ่ง the memory address ตั้งฐานอยู่
•   ‘offset’ คือระยะห่าง(an offset) จาก Rn และสามารถเป็น 0 ถึง 255.. ถ้า offset ถูกละเว้น, the address คือสิ่งที่จุอยู่ภายในของ
     Rn
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 07:35:01 am
Operation

คำสั่ง load และ store เหล่านี้ดำเนินการฟังชั่นเดียวกันกับ the memory access instructions with immediate offset (ดู LDR and STR, immediate offset บนหน้า 61). ข้อแตกต่างกันคือคำสั่งเหล่านี้มีเฉพาะ unprivileged access แม้ว่าเมื่อใช้ใน privileged software.

เมื่อถูกใช้ใน unprivileged software, คำสั่งเหล่านี้จะทำงานเหมือนกันกับ normal memory access instructions with immediate offset.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 07:40:27 am
Restrictions

ในคำสั่งเหล่านี้:
•   Rn ต้องไม่เป็น PC
•   Rm ต้องไม่เป็นทั้ง SP หรือ PC

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

(https://i.imgur.com/OW5D276.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 08:30:44 am
3.4.5 LDR, PC-relative

โหลด register จาก memory.

Syntax

LDR{type}{cond} Rt, label
LDRD{cond} Rt, Rt2, label; load two words

โดยที่:
•   ‘type’ คือหนึ่งของต่อไปนี้:
     B: Unsigned byte, ศูนย์ขยายถึง 32 bits ในการ loads
     SB: Signed byte, sign ขยายถึง 32 bits (LDR เท่านั้น)
     H: Unsigned halfword, ศูนย์ขยายถึง 32 bits ในการ loads
     SH: Signed halfword, sign ขยายถึง 32 bits (LDR เท่านั้น)
     —: ละเว้น, สำหรับ word
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rt’ คือ the register เพื่อ load หรือ store
•   ‘Rt2’ คือ the second register เพื่อ load หรือ store
•   ‘label’ คือ a PC-relative expression (ดู PC-relative expressions บนหน้า 56)

Operation

LDR โหลด a register ด้วยค่าจาก a PC-relative memory address. The memory address ถูกระบุโดย a label หรือโดย an offset จาก the PC.

The value เพื่อ load หรือ store สามารถเป็น a byte, halfword, or word. สำหรับ load instructions, bytes and halfwords  สามารถเป็นอย่างใดอย่างหนึ่ง signed หรือ unsigned (ดู Address alignment บนหน้า 55).

‘label’ ต้องอยู่ภายในช่วงที่จำกัดของ the current instruction. Table 26 แสดง the possible offsets ระหว่าง label และ the PC.
(https://i.imgur.com/8qjDSQl.png)
คุณอาจต้องใช้ the .W suffix เพื่อได้รับ the maximum offset range (ดู Instruction width selection บนหน้า 58).

Restrictions

ในคำสั่งเหล่านี้:
•   Rt สามารถเป็น SP หรือ PC สำหรับ word loads เท่านั้น
•   Rt2 ต้องไม่เป็นทั้ง SP หรือ PC
•   Rt ต้องแตกต่างจาก Rt2
เมื่อ Rt คือ PC ใน a word load instruction:
•   bit[0] ของ the loaded value ต้องเป็น 1 เพื่อการดำเนินการที่ถูกต้อง, และ a branch จะเกิดขึ้นกับ halfword-aligned address นี้
•   หากคำสั่งเป็นแบบมีเงื่อนไข มันต้องเป็นคำสั่งสุดท้ายใน the IT block

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

Examples
(https://i.imgur.com/aoWNAKr.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 11:22:42 am
3.4.6 LDM and STM

Load and store multiple registers.

Syntax

op{addr_mode}{cond} Rn{!}, reglist

โดยที่:
•   ‘op’ คืออย่างใดอย่างหนึ่ง LDM (load multiple register) หรือ STM (store multiple register)
•   ‘addr_mode’ คือใดๆของต่อไปนี้:
     IA: เพิ่ม address หลังจากแต่ละ access (นี้คือค่าเริ่มต้น)
     DB: ลด address ก่อนแต่ละ access
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rn’ คือ the register ซึ่ง the memory address ตั้งฐานอยู่
•   ‘!’ คือ an optional writeback suffix. ถ้ามี ‘!’, the final address ที่ถูกโหลดจากหรือเก็บไปยังจะถูกเขียนกลับลงใน Rn.
•   ‘reglist’ คือรายการของอย่างน้อยหนึ่ง registers ที่จะถูกโหลดหรือถูกเก็บ, โดยใส่ไว้ในวงเล็บปีกกา. มันสามารถบรรจุ register
     ranges. มันจะต้องคั่นด้วยเครื่องหมายจุลภาคหากมีมากกว่าหนึ่ง register หรือ register range (ดูตัวอย่างบนหน้า 68).

LDM and LDMFD เป็นคำพ้องความหมายสำหรับ LDMIA. LDMFD หมายถึงการใช้ของมันสำหรับการดึงข้อมูลจากสแต็กจากมากไปหาน้อยที่เต็ม.

LDMEA  เป็นคำพ้องความหมายสำหรับ LDMDB, และหมายถึงการใช้ของมันสำหรับการดึงข้อมูลจากสแต็กจากมากไปหาน้อยที่ว่างเปล่า.

STM and STMEA เป็นคำพ้องความหมายสำหรับ STMIA. STMEA และหมายถึงการใช้ของมันสำหรับการส่งข้อมูลไปยังสแต็กจากมากไปหาน้อยที่ว่างเปล่า.

STMFD เป็นคำพ้องความหมายสำหรับ STMDB, และหมายถึงการใช้ของมันสำหรับการส่งข้อมูลไปยังสแต็กจากมากไปหาน้อยที่เต็ม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 01:04:22 pm
Operation

LDM instructions โหลด the registers ใน reglist ด้วย word values จาก memory addresses ที่อ้างอิงจาก Rn.

STM instructions เก็บ the word values ใน the registers ใน reglist ไปยัง memory addresses ที่อ้างอิงจาก Rn.

For LDM, LDMIA, LDMFD, STM, STMIA, and STMEA the memory addresses ที่ใช้สำหรับการเข้าถึงจะอยู่ที่ช่วง 4-byte ตั้งแต่ Rn ถึง Rn + 4 * (n-1), โดยที่ n คือจำนวนของ registers ใน reglist. การเข้าถึงเกิดขึ้นตามลำดับของ increasing register numbers, โดยที่ the lowest numbered register จะใช้ the lowest memory address และ the highest number register จะใช้ the highest memory address. ถ้า the writeback suffix ถูกระบุ, ค่าของ Rn + 4 * (n-1) จะถูกเขียนกลับไปยัง Rn.

For LDMDB, LDMEA, STMDB, and STMFD the memory addresses ที่ใช้สำหรับการเข้าถึงจะอยู่ที่ช่วง 4-byte ตั้งแต่ Rn ถึง Rn - 4 * (n-1),  โดยที่ n คือจำนวนของ registers ใน reglist. การเข้าถึงเกิดขึ้นตามลำดับของ decreasing register numbers, โดยที่ the highest numbered register จะใช้ the highest memory address และ the lowest number register จะใช้ the lowest memory address. ถ้า the writeback suffix ถูกระบุ, ค่าของ Rn - 4 * (n-1) จะถูกเขียนกลับไปยัง Rn.

The PUSH and POP instructions สามารถถูกแสดงในรูปแบบนี้ (ดู PUSH and POP สำหรับรายละเอียด).
Title: Re: STM32F1 Programming Manual
Post by: tha on August 25, 2022, 02:05:48 pm
Restrictions

ในคำสั่งเหล่านี้:
•   Rn ต้องไม่เป็น PC
•   reglist ต้องไม่บรรจุ SP
•   ในคำสั่ง STM ใดๆ, reglist ต้องไม่บรรจุ PC
•   ในคำสั่ง LDM ใดๆ, reglist ต้องไม่บรรจุ PC ถ้ามันบรรจุ LR
•   reglist ต้องไม่บรรจุ Rn ถ้าคุณระบุ the writeback suffix

เมื่อ PC คือ reglist ใน an LDM instruction:
•   bit[0] ของ the value ที่โหลดไปยัง the PC ต้องเป็น 1 เพื่อการดำเนินการที่ถูกต้อง, และ a branch จะเกิดขึ้นกับ halfword-
     aligned address นี้
•   หากคำสั่งเป็นแบบมีเงื่อนไข มันต้องเป็นคำสั่งสุดท้ายใน the IT block

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

Examples

       LDMR8,{R0,R2,R9}; LDMIA is a synonym for LDM
       STMDBR1!,{R3-R6,R11,R12}

Incorrect examples

       STMR5!,{R5,R4,R9}; value stored for R5 is unpredictable
       LDMR2, {}; there must be at least one register in the list
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 08:12:25 am
3.4.7 PUSH and POP

Push registers ลงบน, และ pop registers จาก a full-descending stack.

Syntax

PUSH{cond} reglist
POP{cond} reglist

โดยที่:
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘reglist’ คือรายการที่ไม่ว่างเปล่าของ registers, โดยใส่ไว้ในวงเล็บปีกกา. มันสามารถบรรจุ register ranges. มันจะต้องคั่นด้วย
     เครื่องหมายจุลภาคหากมันบรรจุมากกว่าหนึ่ง register หรือ register range (ดูตัวอย่างบนหน้า 68).

PUSH and POP เป็นคำพ้องความหมายสำหรับ  STMDB และ LDM (หรือ LDMIA) ที่มี the memory addresses สำหรับ the access อ้างอิงจาก SP, และที่มี the final address สำหรับ the access ถูกเขียนกลับไปยัง the SP. PUSH and POP เป็นคำช่วยจำที่ต้องการในกรณีเหล่านี้.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 08:32:09 am
Operation

PUSH เก็บ registers บน the stack ตามลำดับของ decreasing register numbers, โดยที่ the highest numbered register จะใช้ the highest memory address และ the lowest numbered register จะใช้ the lowest memory address.

POP โหลด registers จาก the stack ตามลำดับของ increasing register numbers, โดยที่ the lowest numbered register จะใช้ the lowest memory address และ the highest numbered register จะใช้ the highest memory address.

ดู LDM and STM บนหน้า 67 สำหรับข้อมูลเพิ่มเติม.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 08:44:23 am
Restrictions

ในคำสั่งเหล่านี้:
•   ‘reglist’ ต้องไม่บรรจุ SP
•   สำหรับ the PUSH instruction, reglist ต้องไม่บรรจุ PC
•   สำหรับ the POP instruction, reglist ต้องไม่บรรจุ PC ถ้ามันบรรจุ LR

เมื่อ PC อยู่ใน reglist ใน a POP instruction:
•   bit[0] ของ the value ที่โหลดไปยัง the PC ต้องเป็น 1 เพื่อการดำเนินการที่ถูกต้อง, และ a branch จะเกิดขึ้นกับ
     halfword-aligned address นี้
•   หากคำสั่งเป็นแบบมีเงื่อนไข มันต้องเป็นคำสั่งสุดท้ายใน the IT block

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

Examples

       PUSH{R0,R4-R7}
       PUSH{R2,LR}
       POP{R0,R10,PC}
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 09:20:31 am
3.4.8 LDREX and STREX

Load and store register exclusive.

Syntax

LDREX{cond} Rt, [Rn {, #offset}]
STREX{cond} Rd, Rt, [Rn {, #offset}]
LDREXB{cond} Rt, [Rn]
STREXB{cond} Rd, Rt, [Rn]
LDREXH{cond} Rt, [Rn]
STREXH{cond} Rd, Rt, [Rn]

โดยที่:
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rd’ คือ the destination register สำหรับ the returned status
•   ‘Rt’ คือ the register เพื่อ load หรือ store
•   ‘Rn’ คือ the register ซึ่ง the memory address ตั้งฐานอยู่
•   ‘offset’ คือ an optional offset ที่ใช้กับค่าใน Rn. ถ้า offset ถูกละเว้น, the address คือค่าใน Rn.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 09:54:38 am
Operation

LDREX, LDREXB, and LDREXH โหลด a word, byte, and halfword ตามลำดับจาก a memory address

STREX, STREXB, and STREXH พยายามเก็บ a word, byte, and halfword ตามลำดับไปยัง a memory address. The address ที่ใช้ในคำสั่ง store-exclusive ใดๆต้องเป็นเหมือนกันกับ the address ใน the most recently executed load-exclusive instruction. ค่าที่เก็บโดย the Store-exclusive instruction ต้องมี data size เดียวกันกับค่าที่โหลดโดย the preceding load-exclusive instruction ด้วย. ซึ่งหมายความว่า software ต้องใช้ a load-exclusive instruction และ a matching store-exclusive instruction เสมอเพื่อดำเนินการ a synchronization operation, ดู Synchronization primitives บนหน้า 30.

ถ้า a store-exclusive instruction ดำเนินการ the store, มันจะเขียน 0 ไปยัง destination register ของมัน. ถ้ามันไม่ดำเนินการ the store, มันจะเขียน 1 ไปยัง destination register ของมัน. ถ้า the store-exclusive instruction เขียน 0 ไปยัง the destination register, มันจะถูกรับประกันว่าไม่มี process อื่นใน the system เข้าถึง the memory location ระหว่าง the load-exclusive และ store-exclusive instructions

ด้วยเหตุผลด้านประสิทธิภาพ ให้รักษาจำนวนคำสั่งระหว่างคำสั่ง load-exclusive และคำสั่ง store-exclusive ที่ตรงกันให้น้อยที่สุด.

หมายเหตุ: ผลลัพธ์ของการดำเนินการคำสั่ง a store-exclusive ไปยัง an address ที่แตกต่างจากที่ใช้ใน the preceding load-
                 exclusive instruction นั้นไม่สามารถคาดการณ์ได้.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 10:07:59 am
Restrictions

ในคำสั่งเหล่านี้:
•   ห้ามใช้ PC
•   ห้ามใช้ SP สำหรับ Rd and Rt
•   สำหรับ STREX, Rd ต้องแตกต่างจากทั้ง Rt and Rn
•   ค่าของ offset ต้องเป็นผลคูณของสี่ในช่วง 0-1020

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

Examples

       MOVR1, #0x1; initialize the ‘lock taken’ value try
       LDREXR0, [LockAddr]; load the lock value
       CMPR0, #0; is the lock free?
       ITTEQ; IT instruction for STREXEQ and CMPEQ
       STREXEQR0, R1, [LockAddr]; try and claim the lock
       CMPEQR0, #0; did this succeed?
       BNEtry; no – try again
                  ; yes – we have the lock
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 10:31:37 am
3.4.9 CLREX

Clear exclusive.

Syntax

CLREX{cond}

โดยที่:
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)

Operation

ใช้ CLREX เพื่อให้คำสั่ง STREX, STREXB, or STREXH ถัดไปเขียน 1 ไปยัง destination register ของมันและล้มเหลวในการดำเนินการ the store. มันมีประโยชน์ใน exception handler code เพื่อบังคับ the failure ของ the store exclusive ถ้า the exception เกิดขึ้นระหว่าง a load exclusive instruction และ the matching store exclusive instruction ใน a synchronization operation.

ดู Synchronization primitives บนหน้า 30 สำหรับข้อมูลเพิ่มเติม.

Condition flags

คำสั่งเหล่านี้ไม่เปลี่ยนแปลง the flags.

Examples

       CLREX
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 10:43:38 am
(https://i.imgur.com/4HcXfyU.png)
(https://i.imgur.com/bDHKgJh.png)
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 11:23:37 am
3.5.1 ADD, ADC, SUB, SBC, and RSB

Add, add with carry, subtract, subtract with carry, and reverse subtract.

Syntax

op{S}{cond} {Rd,} Rn, Operand2
op{cond} {Rd,} Rn, #imm12; ADD and SUB only

โดยที่:
•   ‘op’ เป็นหนึ่งของ:
     ADD: Add
     ADC: Add with carry
     SUB: Subtract
     SBC: Subtract with carry
     RSB: Reverse subtract
•   ‘S’ คือ an optional suffix. ถ้า S ถูกระบุ, the condition code flags จะถูกอัฟเดตบนผลลัพธ์ของ the operation (ดู
     Conditional execution บนหน้า 56)
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rd’ คือ the destination register. ถ้า Rd ถูกละเว้น, the destination register คือ Rn
•   ‘Rn’ คือ the register ที่ถือ the first operand
•   ‘Operand2’ คือ a flexible second operand (ดู Flexible second operand บนหน้า 51 สำหรับรายละเอียดของ the options).
•   ‘imm12’ คือค่าใดๆในช่วง 0—4095
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 11:48:43 am
Operation

The ADD instruction บวก the value ของ operand2 หรือ imm12 กับ the value ใน Rn.

The ADC instruction บวก the values ใน Rn และ operand2, พร้อมกันกับ the carry flag.

The SUB instruction ลบ the value ของ operand2 หรือ imm12 จาก the value ใน Rn.

The SBC instruction ลบ the value ของ operand2 ออกจาก the value ใน Rn. ถ้า the carry flag เคลียร์, the result จะถูกลดไปหนึ่ง.

The RSB instruction ลบ the value ใน Rn จาก the value ของ operand2. นี้มีประโยชน์เนื่องจากมีตัวเลือกมากมายสำหรับ operand2.

ใช้ ADC and SBC เพื่อประกอบ multiword arithmetic (ดู Multiword arithmetic examples บนหน้า 74 และ ADR บนหน้า 60).

ADDW เทียบเท่ากับ the ADD syntax ที่ใช้ the imm12 operand. SUBW เทียบเท่ากับ the SUB syntax ที่ใช้ the imm12 operand.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 01:52:32 pm
Restrictions

ในคำสั่งเหล่านี้:
•   Operand2 ต้องไม่เป็นทั้ง SP หรือ PC
•   Rd สามารถเป็น SP เฉพาะใน ADD และ SUB, และเฉพาะกับข้อจำกัดเพิ่มเติมต่อไปนี้:
     –   Rn ต้องเป็น SP ด้วย
     –   การเลื่อนใดๆใน operand2 ต้องถูกจำกัดถึงสูงสุดของสามบิตโดยใช้ LSL
•   Rn สามารถเป็น SP เฉพาะใน ADD และ SUB
•   Rd สามารถเป็น PC เฉพาะใน the ADD{cond} PC, PC, Rm instruction โดยที่:
     –   คุณต้องไม่ระบุ the S suffix
     –   Rm ต้องไม่เป็นทั้ง PC หรือ SP
     –   หากคำสั่งเป็นแบบมีเงื่อนไข มันต้องเป็นคำสั่งสุดท้ายใน the IT block
•   ด้วยข้อยกเว้นของ the ADD{cond} PC, PC, Rm instruction, Rn สามารถเป็น PC เฉพาะใน ADD and SUB,  และเฉพาะกับข้อ
     จำกัดเพิ่มเติมต่อไปนี้:
     –   คุณต้องไม่ระบุ the S suffix
     –   The second operand ต้องเป็น a constant ในช่วง 0 ถึง 4095

Note: 1 เมื่อใช้ the PC สำหรับการบวกหรือการลบ, bits[1:0] ของ the PC จะถูกปัดเศษเป็น b00 ก่อนดำเนินการ the calculation,
            กำหนด the base address สำหรับ the calculation word-aligned.
         2 ถ้าคุณต้องการสร้าง the address ของคำสั่ง, คุณต้องปรับ the constant ตามค่าของ the PC. Arm ขอแนะนำให้คุณใช้ the
            ADR instruction แทน ADD หรือ SUB ที่มี Rn เท่ากับ the PC, เนื่องจาก assembler ของคุณจะคำนวณ the correct
            constant สำหรับ the ADR instruction โดยอัตโนมัติ.


เมื่อ Rd คือ PC ใน the ADD{cond} PC, PC, Rm instruction:
•   bit[0] ของค่าที่เขียนไปยัง the PC จะถูกละเว้น
•   A branch เกิดขึ้นกับ the address ที่สร้างขึ้นโดยการบังคับ bit[0] ของค่านั้นเป็น 0

Condition flags

ถ้า S ถูกระบุ, คำสั่งเหล่านี้จะอัฟเดต the N, Z, C and V flags สอดคล้องกับ the result

Examples

       ADDR2, R1, R3
       SUBSR8, R6, #240; sets the flags on the result
       RSBR4, R4, #1280; subtracts contents of R4 from 1280
       ADCHIR11, R0, R3; only executed if C flag set and Z
                 ; flag clear
Title: Re: STM32F1 Programming Manual
Post by: tha on August 26, 2022, 02:23:27 pm
Multiword arithmetic examples

Specific example 4: 64-bit addition แสดงสองคำสั่งที่บวก a 64-bit integer ที่บรรจุใน R2 and R3 กับ another 64-bit integer ที่บรรจุใน R0 and R1, และวาง the result ใน R4 and R5.

Specific example 4: 64-bit addition

       ADDSR4, R0, R2; add the least significant words
       ADCR5, R1, R3; add the most significant words with carry

Multiword values ไม่จำเป็นต้องใช้ registers ที่ต่อเนื่อง. Specific example 5: 96-bit subtraction แสดงคำสั่งที่ลบ a 96-bit integer บรรจุใน R9, R1, and R11 ออกจากอีกชุดหนึ่งที่บรรจุใน R6, R2, and R8. The example เก็บ the result ใน R6, R9, and R2.

Specific example 5: 96-bit subtraction

       SUBSR6, R6, R9; subtract the least significant words
       SBCSR9, R2, R1; subtract the middle words with carry
       SBCR2, R8, R11; subtract the most significant words with carry
Title: Re: STM32F1 Programming Manual
Post by: tha on August 29, 2022, 03:21:55 pm
3.5.2 AND, ORR, EOR, BIC, and ORN

Logical AND, OR, exclusive OR, bit clear, and OR NOT.

Syntax

op{S}{cond} {Rd,} Rn, Operand2

โดยที่:
•   ‘op’ คือหนึ่งของ:
     AND: Logical AND
     ORR: Logical OR or bit set
     EOR: Logical exclusive OR
     BIC: Logical AND NOT or bit clear
     ORN: Logical OR NOT
•   ‘S’ คือ an optional suffix. ถ้า S ถูกระบุ, the condition code flags จะถูกอัฟเดตตามผลลัพธ์ของ the operation (ดู
     Conditional execution บนหน้า 56)
•   ‘cond’ คือ an optional condition code (ดู Conditional execution บนหน้า 56)
•   ‘Rd’ คือ the destination register.
•   ‘Rn’ คือ the register ที่ถือ the first operand
•   ‘Operand2’ คือ a flexible second operand (ดู Flexible second operand บนหน้า 51 สำหรับรายละเอียดของ the options).
Title: Re: STM32F1 Programming Manual
Post by: tha on August 29, 2022, 03:44:00 pm
Operation

The AND, EOR, and ORR instructions ดำเนินการระดับบิต  AND, exclusive OR, and OR operations ต่อค่าใน Rn และ operand2.

The BIC instruction ดำเนินการ an AND operation ต่อ the bits ใน Rn ด้วยการกลับของบิทที่ตรงกันในค่าของ operand2.

The ORN instruction ดำเนินการ an OR operation ต่อ the bits ใน Rn ด้วยการกลับของบิทที่ตรงกันในค่าของ operand2.
Title: Re: STM32F1 Programming Manual
Post by: tha on August 29, 2022, 03:53:51 pm
Restrictions

ห้ามใช้ทั้ง SP หรือ PC.

Condition flags

ถ้า S ถูกระบุ, คำสั่งเหล่านี้:
•   อัฟเดต the N and Z flags สอดคล้องกับ the result
•   สามารถอัฟเดต the C flag ในระหว่างการคำนวณของ operand2 (ดู Flexible second operand บนหน้า 51)
•   ไม่มีผลต่อ the V flag

Examples

       ANDR9, R2,#0xFF00
       ORREQR2, R0, R5
       ANDSR9, R8, #0x19
       EORSR7, R11, #0x18181818
       BICR0, R1, #0xab
       ORNR7, R11, R14, ROR #4
       ORNSR7, R11, R14, ASR #32
Title: Re: STM32F1 Programming Manual
Post by: tha on September 01, 2022, 07:49:35 am
3.5.3 ASR, LSL, LSR, ROR, and RRX

Arithmetic shift right, logical shift left, logical shift right, rotate right, and rotate right with extend.

Syntax

op{S}{cond} Rd, Rm, Rs
op{S}{cond} Rd, Rm, #n
RRX{S}{cond} Rd, Rm

โดยที่:
•   ‘op’ คือหนึ่งของ:
     ASR: Arithmetic shift right
     LSL: Logical shift left
     LSR: Logical shift right
     ROR: Rotate right
•   ‘S’ คือ an optional suffix. ถ้า S ถูกระบุ, the condition code flags จะถูกอัฟเดตตามผลลัพธ์ของ the operation (ดู
     Conditional execution บนหน้า 56)
•   ‘Rd’ คือ the destination register.
•   ‘Rm’ คือ the register ที่ถือ the value ที่จะถูกเลื่อน
•   ‘Rs’ คือ the register ที่ถือ the shift length ที่จะใช้กับ the value Rm. เฉพาะ the least significant byte ถูกใช้และสามารถอยู่
     ในช่วง 0 ถึง 255.
•   ‘n’ คือ the shift length. The range of shift lengths ขึ้นอยู่กับ the instruction ดังต่อไปนี้:
     ASR: Shift length from 1 to 32
     LSL: Shift length from 0 to 31
     LSR: Shift length from 1 to 32
     ROR: Shift length from 1 to 31

Note:  MOV{S}{cond} Rd, Rm เป็นไวยากรณ์ที่ต้องการสำหรับ LSL{S}{cond} Rd, Rm, #0.
Title: Re: STM32F1 Programming Manual
Post by: tha on September 01, 2022, 08:17:56 am
Operation

ASR, LSL, LSR, and ROR ย้าย the bits ใน the register Rm ไปทางซ้ายหรือทางขวาตามจำนวนตำแหน่งที่ระบุโดยค่าคงที่ n หรือ register Rs.

RRX ย้าย the bits ใน the register Rm ไปทางขวา 1.

ในคำสั่งทั้งหมดเหล่านี้, ผลลัพธ์จะถูกเขียนไปยัง Rd แต่ค่าใน register Rm ยังคงไม่เปลี่ยน สำหรับรายละเอียดเกี่ยวกับผลลัพธ์ที่ถูกสร้างขึ้นโดยคำสั่งต่างๆ (ดู Shift operations ในหน้า 52).
Title: Re: STM32F1 Programming Manual
Post by: tha on September 01, 2022, 08:48:26 am
Restrictions

ห้ามใช้ทั้ง SP หรือ PC.

Condition flags

ถ้า S ถูกระบุ:
•   คำสั่งเหล่านี้อัฟเดต the N and Z flags สอดคล้องกับ the result
•   The C flag ถูกอัฟเดตไปยังบิตสุดท้ายที่เลื่อนออก, ยกเว้นเมื่อ the shift length เป็น 0 (ดู Shift operations ในหน้า 52).

Examples

       ASRR7, R8, #9; arithmetic shift right by 9 bits
       LSLSR1, R2, #3; logical shift left by 3 bits with flag update
       LSRR4, R5, #6; logical shift right by 6 bits
       RORR4, R5, R6; rotate right by the value in the bottom byte of R6
       RRXR4, R5; rotate right with extend