Table of Contents (pdf)
CHAPTER 1. SEE A PROGRAM RUNNING 1
1.1 TRANSLATING C TO MACHINE CODE 1
1.2 LOADING A MACHINE PROGRAM INTO MEMORY 4
1.2.1 Harvard versus Von Neumann Architecture 4
1.2.2 Creating Runtime Memory Image 6
1.3 REGISTERS 10
1.3.1 Reusing Registers to Improve Performance 10
1.3.2 Processor Registers 12
1.4 EXECUTING A MACHINE PROGRAM 15
1.4.1 Loading a Program 16
1.4.2 Starting the Execution 17
1.4.3 Program Completion 20
1.5 SELF-REVIEW EXERCISES 21
1.6 EXERCISES 24
CHAPTER 2. DATA REPRESENTATION 25
2.1 BIT, BYTE, AND WORD 25
2.2 BINARY, OCTAL, DECIMAL, AND HEXADECIMAL 27
2.3 UNSIGNED INTEGERS 28
2.4 SIGNED INTEGERS 29
2.4.1 Sign-and-Magnitude 31
2.4.2 One's Complement 32
2.4.3 Two's Complement 33
2.4.4 Carry Flag for Unsigned Addition and Subtraction 35
2.4.5 Overflow Flag for Signed Addition and Subtraction 37
2.5 CHARACTER STRING 46
2.6 SELF-REVIEW EXERCISES 48
2.7 EXERCISES 49
CHAPTER 3. ARM INSTRUCTION SET ARCHITECTURE 51
3.1 INSTRUCTION SET ARCHITECTURE (ISA) 51
3.2 ARM INSTRUCTION SET ARCHITECTURE 52
3.3 ARM CORTEX-M ORGANIZATION 55
3.4 GOING FROM C TO ASSEMBLY 57
3.5 ASSEMBLY INSTRUCTION FORMAT 60
3.6 ANATOMY OF AN ASSEMBLY PROGRAM 62
3.7 ASSEMBLER DIRECTIVES 65
3.8 SELF-REVIEW EXERCISES 69
3.9 EXERCISES 71
CHAPTER 4. ARITHMETIC AND LOGIC INSTRUCTIONS 73
4.1 PROGRAM STATUS REGISTER 73
4.2 UPDATING PROGRAM STATUS FLAGS 75
4.3 SHIFT AND ROTATE 76
4.4 ARITHMETIC INSTRUCTIONS 78
4.4.1 Addition and Subtraction 79
4.4.2 Short Multiplication and Division 80
4.4.3 Long Multiplication 80
4.4.4 Saturation 81
4.5 IMPLEMENTING A BARREL SHIFTER 82
4.6 BITWISE LOGIC OPERATIONS 83
4.7 REVERSING THE ORDER OF BITS AND BYTES 87
4.8 SIGN AND ZERO EXTENSION 89
4.9 TEST AND COMPARISON 90
4.10 DATA MOVEMENT BETWEEN REGISTERS 91
4.11 BIT FIELD EXTRACT 92
4.12 SELF-REVIEW EXERCISES 92
4.13 EXERCISES 95
CHAPTER 5. LOAD, STORE, AND STACK 97
5.1 LOADING CONSTANT INTO REGISTERS 97
5.1.1 Data Movement Instruction MOV and MVN 97
5.1.2 Pseudo Instruction LDR and ADR 98
5.1.3 Comparing LDR, ADR, and MOV 99
5.2 BIG AND LITTLE ENDIAN 99
5.3 ACCESSING DATA IN MEMORY 100
5.4 MEMORY ADDRESSING 101
5.4.1 Pre-index, Post-index, and Pre-index with Update 101
5.4.2 Load and Store Instructions 103
5.4.3 PC-relative Addressing 103
5.4.4 Example of Accessing an Array 104
5.5 LOADING AND STORING MULTIPLE REGISTERS 105
5.6 ACCESSING STACK MEMORY 107
5.6.1 Stack Types 107
5.6.2 PUSH and POP Operations 108
5.6.3 Implementing Stacks with STM and LDM 109
5.7 SELF-REVIEW EXERCISES 111
5.8 EXERCISES 113
CHAPTER 6. BRANCH AND CONDITIONAL EXECUTION 117
6.1 CONDITION TESTING 117
6.2 BRANCH INSTRUCTIONS 119
6.3 CONDITIONAL EXECUTION 122
6.4 IF STATEMENT 123
6.5 IF-ELSE STATEMENT 126
6.6 FOR LOOP 127
6.7 WHILE LOOP 128
6.8 DO WHILE LOOP 129
6.9 CONTINUE STATEMENT 130
6.10 BREAK STATEMENT 131
6.11 SWITCH STATEMENT 132
6.12 SELF-REVIEW EXERCISES 134
6.13 EXERCISES 137
CHAPTER 7. STRUCTURED PROGRAMMING 141
7.1 BASIC CONTROL STRUCTURES 141
7.2 STEPWISE REFINEMENT 143
7.3 REGISTER ALLOCATION 146
7.4 EXAMPLE: FACTORIAL NUMBERS 149
7.5 EXAMPLE: COUNTING ONES IN A WORD 150
7.6 EXAMPLE: FINDING THE MAXIMUM VALUE IN AN ARRAY 152
7.7 EXAMPLE: COUNTING DIGITS 154
7.8 EXAMPLE: PARITY BIT 155
7.9 EXAMPLE: PERFECT NUMBERS 157
7.10 EXAMPLE: ARMSTRONG NUMBERS 159
7.11 EXAMPLE: PALINDROME STRING 160
7.12 EXAMPLE: CONVERTING STRING TO INTEGER (ATOI) 162
7.13 EXAMPLE: BINARY SEARCH 163
7.14 EXAMPLE: BUBBLE SORT 165
7.15 SELF-REVIEW EXERCISES 167
7.16 EXERCISES 168
CHAPTER 8. SUBROUTINES 171
8.1 CALLING A SUBROUTINE 172
8.2 PRESERVING CALLER'S RUNTIME ENVIRONMENT VIA STACK 173
8.3 PASSING ARGUMENTS TO SUBROUTINE VIA REGISTERS 176
8.4 PASS-BY-VALUE AND PASS-BY-REFERENCE 177
8.4.1 Example of Passing by Value: Sum of an Array 179
8.4.2 Example of Passing by Reference: Swap two characters 181
8.5 CALLING SUBROUTINES IN A DIFFERENT FILE 182
8.6 EXAMPLE: GREATEST COMMON DIVISOR 183
8.7 EXAMPLE: CONCATENATING TWO STRINGS 185
8.8 EXAMPLE: COMPARING TWO STRINGS 186
8.9 EXAMPLE: INSERTING AN INTEGER INTO A SORTED ARRAY 187
8.10 EXAMPLE: CONVERTING INTEGER TO STRING (ITOA) 188
8.11 EXAMPLE: MATRIX TRANSPOSE 190
8.12 EXAMPLE: REMOVING A CHARACTER FROM A STRING 192
8.12.1 Example: Reversing a String 193
8.13 EXAMPLE: FINDING UNIQUE NUMBERS IN AN ARRAY 194
8.14 PASSING ARGUMENTS THROUGH STACK 198
8.15 RECURSIVE FUNCTIONS 200
8.15.1 Example: Factorial Numbers 202
8.15.2 Example: String Permutation 203
8.15.3 Tail Recursion 205
8.16 SELF-REVIEW EXERCISES 207
8.17 EXERCISES 210
CHAPTER 9. 64-BIT DATA PROCESSING 213
9.1 64-BIT ADDITION 213
9.2 64-BIT SUBTRACTION 214
9.3 64-BIT COUNTING LEADING ZEROS 215
9.4 64-BIT SIGN EXTENSION 215
9.5 64-BIT LOGICAL SHIFT LEFT 216
9.6 64-BIT LOGICAL SHIFT RIGHT 217
9.7 64-BIT MULTIPLICATION 218
9.8 64-BIT UNSIGNED DIVISION 219
9.9 64-BIT SIGNED DIVISION 221
9.10 SELF-REVIEW EXERCISES 223
9.11 EXERCISES 225
CHAPTER 10. MIXING C AND ASSEMBLY CODE 227
10.1 DATA TYPES AND ACCESS 227
10.1.1 Signed or Unsigned Integers 228
10.1.2 Data Alignment 229
10.1.3 Data Structure Padding 230
10.2 SPECIAL VARIABLES 233
10.2.1 Static Variables 233
10.2.2 Volatile Variables 237
10.3 INLINE ASSEMBLY 239
10.3.1 Assembly Functions in a C Program 239
10.3.2 Inline Assembly Instructions in a C Program 240
10.4 CALLING ASSEMBLY SUBROUTINES FROM A C PROGRAM 241
10.4.1 Example of Calling an Assembly Subroutine 241
10.4.2 Example of Accessing C Variables in Assembly 242
10.5 CALLING C FUNCTIONS FROM ASSEMBLY PROGRAMS 243
10.5.1 Example of Calling a C Function 243
10.5.2 Example of Accessing Assembly Data in a C Program 244
10.6 SELF-REVIEW EXERCISES 245
10.7 EXERCISES 246
CHAPTER 11. INTERRUPTS 249
11.1 INTRODUCTION TO INTERRUPTS 249
11.2 INTERRUPT NUMBERS 250
11.3 INTERRUPT SERVICE ROUTINES 252
11.4 INTERRUPT VECTOR TABLE 253
11.5 INTERRUPT STACKING AND UNSTACKING 255
11.6 NESTED VECTORED INTERRUPT CONTROLLER (NVIC) 257
11.6.1 Enable and Disable Peripheral Interrupts 258
11.6.2 Interrupt Priority 260
11.6.3 Global Interrupt Enable and Disable 264
11.7 SYSTEM TIMER 265
11.7.1 Timer Diagram and Registers 266
11.7.2 Timer Resolution and Period 268
11.7.3 Implementing a Delay Function 269
11.8 EXTERNAL INTERRUPT 272
11.9 SOFTWARE INTERRUPT 275
11.10 SELF-REVIEW EXERCISES 276
11.11 EXERCISES 279
CHAPTER 12. FIXED-POINT ARITHMETIC 281
12.1 FIXED-POINT REPRESENTATION 282
12.1.1 Unsigned Fixed-point Representation 283
12.1.2 Signed Fixed-point Representation 284
12.1.3 Converting to Fixed-point Format 285
12.2 FIXED-POINT RANGE AND RESOLUTION TRADEOFF 286
12.3 FIXED-POINT ADDITION AND SUBTRACTION 287
12.4 FIXED-POINT MULTIPLICATION 289
12.5 FIXED-POINT DIVISION 290
12.6 SELF-REVIEW EXERCISES 291
12.7 EXERCISES 292
CHAPTER 13. FLOATING-POINT ARITHMETIC 293
13.1 FLOATING-POINT REPRESENTATION 293
13.1.1 Special Values 297
13.1.2 Subnormal Numbers 297
13.1.3 Overflow and Underflow 298
13.1.4 Tradeoff between Numeric Range and Resolution 299
13.1.5 Rounding Rules 301
13.2 SOFTWARE-BASED FLOATING-POINT OPERATIONS 303
13.2.1 Floating-point Addition 304
13.2.2 Floating-point Multiplication 308
13.3 HARDWARE-BASED FLOATING-POINT OPERATIONS 310
13.3.1 FPU Registers 311
13.3.2 Load and Store Floating-point Numbers 319
13.3.3 Copy Floating-point Numbers 320
13.3.4 Copy and Set the Status and Control Register 320
13.3.5 Single-precision Arithmetic Operations 321
13.3.6 Single-precision comparisons 322
13.3.7 Precision Conversion 323
13.3.8 FPU Exception and Exception handling 325
13.3.9 Example Assembly Programs 328
13.4 SELF-REVIEW EXERCISES 330
13.5 EXERCISES 334
CHAPTER 14. INSTRUCTION ENCODING AND DECODING 337
14.1 TRADEOFF BETWEEN CODE DENSITY AND PERFORMANCE 337
14.2 DIVIDING BIT STREAMS INTO 16- OR 32-BIT INSTRUCTIONS 338
14.3 ENCODING 16-BIT THUMB INSTRUCTIONS 339
14.4 ENCODING 32-BIT INSTRUCTIONS 340
14.5 ENCODING IMMEDIATE NUMBERS 342
14.6 CALCULATING TARGET MEMORY ADDRESS 343
14.7 INSTRUCTION DECODING EXAMPLE 1 344
14.8 INSTRUCTION DECODING EXAMPLE 2 349
14.9 SELF-REVIEW EXERCISES 353
14.10 EXERCISES 354
CHAPTER 15. GENERAL PURPOSE I/O (GPIO) 355
15.1 INTRODUCTION TO GENERAL PURPOSE I/O (GPIO) 355
15.2 GPIO INPUT MODES: PULL UP AND PULL DOWN 356
15.3 GPIO INPUT: SCHMITT TRIGGER 357
15.4 GPIO OUTPUT MODES: PUSH-PULL AND OPEN-DRAIN 359
15.4.1 Push-Pull Output 359
15.4.2 Open-Drain Output 360
15.5 GPIO OUTPUT SPEED: SLEW RATE 362
15.6 MEMORY-MAPPED I/O 363
15.7 LIGHTING UP AN LED 366
15.8 PUSH BUTTON 371
15.9 KEYPAD SCAN 376
15.10 STEPPER MOTOR CONTROL 382
15.10.1 Bipolar and Unipolar Stepper Motor 382
15.10.2 Step Angle 383
15.10.3 Wave Stepping 384
15.10.4 Full Stepping 385
15.10.5 Half Stepping 386
15.10.6 Micro-stepping 388
15.10.7 Driving Stepper Motor 390
15.11 LCD 391
15.11.1 External Connection Diagram 391
15.11.2 Internal Font Encoding 394
15.11.3 Sending Commands and Data to LCD 395
15.11.4 Programming Fonts 398
15.12 SELF-REVIEW EXERCISES 399
15.13 EXERCISES 402
CHAPTER 16. GENERAL-PURPOSE TIMERS 405
16.1 TIMER ORGANIZATION AND COUNTING MODES 405
16.2 OUTPUT COMPARE 408
16.2.1 Setting Output Mode 409
16.2.2 Example of Using a Timer to Toggle LED 411
16.2.3 Timer Update Events 414
16.3 PWM OUTPUT 416
16.3.1 PWM Alignment 420
16.3.2 PWM Programming Flowchart 421
16.4 INPUT CAPTURE 425
16.4.1 Configuring Input Capture 429
16.4.2 Input Capture in Slave Mode with Reset 434
16.4.3 Interfacing to Ultrasonic Distance Sensor 436
16.5 REAL-TIME CLOCK 442
16.5.1 UNIX Epoch Time 442
16.5.2 RTC Frequency Settings 444
16.5.3 Oscillator Frequency Accuracy 445
16.5.4 Binary Coded Decimal (BCD) Encoding 446
16.5.5 RTC Initialization 447
16.5.6 RTC Alarm 451
16.5.7 Using RTC to Wake Processors up from Sleep Mode 453
16.6 SELF-REVIEW EXERCISES 456
16.7 EXERCISES 459
CHAPTER 17. DIRECT MEMORY ACCESS (DMA) 461
17.1 ADVANCED MICROCONTROLLER BUS ARCHITECTURE (AMBA) 462
17.2 INTERFACING A PERIPHERAL WITHOUT AND WITH DMA 464
17.3 DMA CHANNELS 465
17.4 PROGRAMMING DMA 468
17.5 DMA CIRCULAR MODE 470
17.6 DMA INTERRUPTS 471
17.7 SELF-REVIEW EXERCISES 472
17.8 EXERCISES 474
CHAPTER 18. ANALOG INPUT AND OUTPUT 475
18.1 ANALOG-TO-DIGITAL CONVERTER (ADC) 475
18.1.1 ADC Architecture 475
18.1.2 Digital Quantization 476
18.1.3 Sample and Hold 477
18.1.4 ADC Quantization Error 478
18.1.5 ADC Diagram 480
18.1.6 ADC Conversion Modes 481
18.1.7 ADC Data Alignment 483
18.1.8 ADC Input Channels 484
18.1.9 ADC Triggers 485
18.1.10 Measuring the Input Voltage 488
18.1.11 ADC Configuration Flowchart 489
18.1.12 ADC with DMA 493
18.1.13 DMA with Ping-Pong Buffering 495
18.1.14 ADC Calibration 497
18.2 DIGITAL-TO-ANALOG CONVERTER (DAC) 498
18.2.1 DAC Architecture 498
18.2.2 DAC on STM32L Processors 500
18.2.3 Conversion Trigger 501
18.2.4 Buffered Output 501
18.2.5 Generating a Sine Wave via Table Lookup 502
18.2.6 DAC with Software Trigger 506
18.2.7 Using Timer as a Trigger to DAC 507
18.2.8 Musical Synthesizing 510
18.3 SELF-REVIEW EXERCISES 515
18.4 EXERCISES 518
CHAPTER 19. SERIAL COMMUNICATION PROTOCOLS 521
19.1 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER 521
19.1.1 Communication Frame 522
19.1.2 Bit Rate and Baud Rate 523
19.1.3 UART Standards 525
19.1.4 UART Communication via Polling 526
19.1.5 UART Communication via Interrupt 530
19.1.6 UART Communication via DMA 533
19.1.7 Serial Communication to Bluetooth Module 536
19.2 INTER-INTEGRATED CIRCUIT (I2C) 539
19.2.1 I2C Pins 539
19.2.2 I2C Protocol 540
19.2.3 I2C Data Frame 542
19.2.4 Interfacing Serial Digital Thermal Sensors via I2C 543
19.2.5 I2C Programmable Timings 545
19.2.6 Sending Data to I2C Slave via Polling 551
19.2.7 Receiving Data from I2C Slave via Polling 552
19.2.8 Interfacing a Temperature Sensor via Polling 553
19.2.9 Transferring Data via DMA on I2C Master 558
19.3 SERIAL PERIPHERAL INTERFACE BUS (SPI) 560
19.3.1 Data Exchange 560
19.3.2 Clock Configuration 562
19.3.3 Using SPI to Interface a Gyroscope 563
19.4 UNIVERSAL SERIAL BUS (USB) 569
19.4.1 USB Bus Layer 570
19.4.2 USB Device Layer 572
19.4.3 USB Function Layer 574
19.4.4 USB Class Layer 582
19.4.5 Human Interface Device (HID) 582
19.5 SELF-REVIEW EXERCISES 587
19.6 EXERCISES 589
CHAPTER 20. MULTITASKING 591
20.1 PROCESSOR MODE AND PRIVILEGE LEVEL 592
20.1.1 Control Register 593
20.1.2 Exception Return Value (EXC_RETURN) 594
20.1.3 Selection of MSP and PSP in Thread Mode 596
20.2 SUPERVISOR CALL (SVC) 597
20.3 CPU SCHEDULING 600
20.4 EXAMPLE OF ROUND ROBIN SCHEDULING 602
20.5 SELF-REVIEW EXERCISES 608
20.6 EXERCISES 610
CHAPTER 21. DIGITAL SIGNAL PROCESSING (DSP) 611
21.1 FIXED-POINT AND FLOATING-POINT DSP 611
21.2 FIXED-POINT DATA TYPES IN DSP 612
21.3 SATURATION 613
21.4 ARITHMETIC INSTRUCTIONS 615
21.4.1 Parallel 8-bit Add and Subtract 616
21.4.2 Parallel 16-bit Add and Subtract 620
21.4.3 32-bit Add and Subtract 622
21.4.4 Sum of Absolute Difference 623
21.4.5 Extension and Add 624
21.4.6 Add and Subtract Half-words with Exchange 625
21.4.7 16-bit and 32-bit Multiplication 627
21.4.8 16-bit Multiply and Accumulate with 64-bit Result 630
21.4.9 16-bit Multiply and Accumulate with 32-bit Result 633
21.4.10 16×32 Multiply and Accumulate with 32-bit Result 635
21.4.11 32×32 Multiply and Accumulate with 32-bit Result 635
21.4.12 Unsigned Long Multiply with Accumulate Accumulate 635
21.5 PACKING HALF-WORDS INTO A WORD 637
21.6 SIGNED AND UNSIGNED EXTENSION 638
21.7 GE FLAGS 639
21.8 BYTE SELECTION INSTRUCTION 640
21.9 BASIC DSP FUNCTIONS 641
21.9.1 Vector Negate 641
21.9.2 Vector Absolution Value 642
21.9.3 Vector Offset with Saturation 644
21.9.4 Vector Shift Left with Saturation 645
21.9.5 Vector Mean 647
21.9.6 Vector Pairwise Multiplication 648
21.9.7 Vector Dot Product 650
21.9.8 Vector Min and Max 652
21.10 SELF-REVIEW EXERCISES 653
21.11 EXERCISES 654
APPENDIX A: ASCII CHARACTERS 656
APPENDIX B: GNU COMPILER 657
APPENDIX C: CORTEX-M3/M4 INSTRUCTIONS 668
APPENDIX D: FLOATING-POINT INSTRUCTIONS 670
APPENDIX E: DSP INSTRUCTIONS ON CORTEX-M4 AND CORTEX-M7 672
APPENDIX F: CORTEX-M0/M0+/M1 INSTRUCTIONS 675
APPENDIX G: CORTEX-M3/M4 16-BIT THUMB-2 INSTRUCTION ENCODING 677
APPENDIX H: CORTEX-M3/M4 32-BIT THUMB-2 INSTRUCTION ENCODING 679
APPENDIX I: GPIO ALTERNATE FUNCTIONS FOR STM32L4 686
BIBLIOGRAPHY 693
INDEX 699
SOLUTIONS TO SELF-REVIEW EXERCISES 713
|