Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ARMマイコンで作るシンセサイザー

Fadis
May 09, 2015

 ARMマイコンで作るシンセサイザー

超低消費電力のARMマイコンLPC812を使ってFMシンセサイザーを作る方法と、その実装に用いられる乗算の最適化について解説します

Fadis

May 09, 2015
Tweet

More Decks by Fadis

Other Decks in Programming

Transcript

  1. "3.ϚΠίϯͰ࡞Δ
    γϯηαΠβʔ
    Naomasa Matsubayashi

    View Slide

  2. "3.ϚΠίϯͰ࡞Δ
    γϯηαΠβʔ
    Naomasa Matsubayashi
    !GBEJT@
    5XJUUFS
    (JUIVC
    TMJEFTIBSF
    IUUQXXXTMJEFTIBSFOFUGBEJT
    IUUQTHJUIVCDPN'BEJT

    View Slide

  3. TMJEFTIBSF
    IUUQXXXTMJEFTIBSFOFUGBEJT

    View Slide

  4. ੈͷதʹ͸৭Μͳ
    ARM
    ͕͋Δ

    View Slide

  5. Ͱ͔͍ARM
    "3.
    $PSUFY"
    BeagleBoard-X15
    ARM Cortex-A15
    1.5GHz x2
    IUUQXXXFMJOVYPSH#FBHMFCPBSE#FBHMF#PBSE9

    View Slide

  6. "3.
    $PSUFY.
    খ͍͞ARM
    LPC812
    ARM Cortex-M0+
    30MHz
    IUUQXXXOYQMQDDPNMQD@NJDPODPSUFYNMQD

    View Slide

  7. ϚΠΫϩίϯτϩʔϥ޲͚ARM
    Cortex-MγϦʔζ
    Cortex-M7
    Cortex-M4
    Cortex-M3
    Cortex-M1
    Cortex-M0+
    CortexM0
    IUUQBSNDPNKBQSPEVDUTQSPDFTTPSTDPSUFYNJOEFYQIQ

    View Slide

  8. ARM໋ྩʹ͸ରԠ͍ͯ͠ͳ͍
    5IVNC '16
    ͷΈ
    5IVNC '16
    ͷΈ
    5IVNCͷΈ
    5IVNCͷҰ෦͚ͩ
    5IVNCͷҰ෦͚ͩ
    5IVNCͷҰ෦͚ͩ
    Cortex-M7
    Cortex-M4
    Cortex-M3
    Cortex-M1
    Cortex-M0+
    CortexM0
    5IVNCͱ͸"3.ϓϩηοαͷ΋͏ͭͷ໋ྩηοτɻ
    ໋ྩ͕Մม௕Ͱ"3.໋ྩηοτΑΓϚγϯޠ͕খ͘͞ͳΔɻ

    View Slide

  9. ύΠϓϥΠϯ͕୹͍
    Cortex-M7
    Cortex-M4
    Cortex-M3
    Cortex-M1
    Cortex-M0+
    CortexM0
    ஈ౤ػత࣮ߦ
    ஈ౤ػత࣮ߦ




    ౤ػత࣮ߦͱ͸ॲཧ͕ඞཁ͔Ͳ͏͔֬ఆ͢Δલ͔Β
    ࣮ߦΛ࢝Ί͓ͯ͘ࣄɻඞཁͳ͔ͬͨΒ࣮ߦ݁ՌΛࣺͯΔɻ

    View Slide

  10. MMU͕ແ͍
    جຊతʹ04Λಈ͔͢͜ͱ͸૝ఆ͞Ε͍ͯͳ͍
    ..6ͱ͸ϝϞϦ؅ཧϢχοτɻԾ૝ΞυϨεͱ
    ෺ཧΞυϨεͷม׵ɺٴͼϝϞϦอޢΛߦ͏ϋʔυ΢ΣΞɻ
    Cortex-M7/M4/M3/M0+ʹ͸
    ϝϞϦอޢϢχοτ͚ͩ͸උΘ͍ͬͯΔ
    IUUQXXXMJOVYBSNPSH-JOVY,FSOFM-JOVY.
    ͨͩ͠-JOVYΛಈ͔ͯ͠͠·ͬͨਓ͸ډΔ
    Ծ૝ΞυϨεͷม׵͸ग़དྷͳ͍

    View Slide

  11. ARMʹͯ͠͸஗͍
    %.*14.)[ͱ͸%ISZTUPOFϕϯνϚʔΫΛඵؒʹ࣮ߦ
    Ͱ͖ͨճ਺Λप೾਺Ͱׂͬͨ΋ͷɻେ͖͍ఔΫϩοΫลΓͷ
    ੑೳ͕ྑ͍ɻ଎͍"3.ͩͱҎ্ɺY@ͩͱҎ্ɻ
    .)[
    .)[
    .)[
    .)[
    .)[
    Cortex-M7
    Cortex-M4
    Cortex-M3
    Cortex-M0+
    CortexM0





    %.*14.)[
    ΫϩοΫ

    View Slide

  12. ͍҆
    Ϛϧπͱ͸ळ༿ݪͷຊళΛ͸͡ΊશࠃΧॴʹ͋Δిࢠ෦
    ඼԰͞Μɻೖ໳Ωοτ͔Βಛघ༻్ͷੴ·Ͱ෯޿͍඼ἧ͑ɻ
    NXP LPC812ͷ৔߹
    ϚϧπͰݸ
    IUUQXXXNBSVUTVDPKQQDJ
    110ԁ ੫ൈ

    View Slide

  13. ௿ফඅిྗ
    NXP LPC812ͷ৔߹
    ࠷େΫϩοΫ MHz

    10.89mW
    ׂΓࠐΈ଴ػ࣌
    5.28µW
    ΫϩοΫΛ௿Ίʹઃఆ͢Ε͹
    ίΠϯܕϦν΢Ϝి஑Ͱ΋ಈ͘

    View Slide

  14. ARM$PSUFY.Ͱಈ͘
    όΠφϦΛ࡞Ζ͏

    View Slide

  15. mbed
    ϒϥ΢β্Ͱಈ͘౷߹։ൃ؀ڥ
    IUUQTNCFEPSH

    View Slide

  16. mbed
    ৭Μͳ$PSUFY.ϚΠίϯ޲͚ͷ
    όΠφϦΛు͚Δ

    View Slide

  17. mbed
    ৭ΜͳσόΠεͷυϥΠό͕
    ࠷ॳ͔Β༻ҙ͞Ε͍ͯΔ

    View Slide

  18. mbed

    View Slide

  19. mbed
    64#ετϨʔδΛϚ΢ϯτ
    ΠʔαωοτυϥΠό
    )551αʔό
    %)$1ͰΞυϨεΛ໯ͬͯ͘Δ
    )551αʔόΛ൪ϙʔτʹCJOE
    ڻҟͷϨΠϠʔͷߴ͞

    View Slide

  20. μϝͩ
    ΋ͬͱϨΠϠʔΛԼ͛ΔΜͩ

    View Slide

  21. BSNOPOFFBCJH
    ϩʔΧϧͷHDDͰϏϧυ͠Α͏

    View Slide

  22. CMSIS
    Cortex-M޲͚ͷ
    ϋʔυ΢ΣΞந৅ԽϨΠϠʔ
    ARM͕ࣾΠϯλʔϑΣʔεΛఆΊͯ
    ϚΠίϯͷϕϯμ͕࣮૷͢Δ
    ҧ͏ϕϯμͷϚΠίϯʹҠߦͯ͠΋
    جຊతͳػೳͷ࢖͍ํ͸ҰॹͰशಘָ͕

    View Slide

  23. Cortex-MϚΠίϯ
    CMSIS
    mbedϥΠϒϥϦ
    mbedίϛϡχςΟ
    ϖϦϑΣϥϧϥΠϒϥϦ
    ΞϓϦέʔγϣϯ
    mbed͸CMSISͷ্Ͱಈ͘
    Πʔαωοτ
    υϥΠό
    ͱ͔͸͜͜
    )551αʔό
    ͱ͔͸͜͜
    σόΠεͷ
    ॳظԽ
    ͱ͔͸͜͜
    ͜͜·Ͱ͸࢖͍͍ͨ

    View Slide

  24. mbedͷιʔείʔυ͸
    githubͰެ։͞Ε͍ͯΔ
    ֤ϚΠίϯ޲͚ͷCMSISͷ࣮૷΋ೖ͍ͬͯΔ
    IUUQTHJUIVCDPNNCFENJDSPNCFE
    CMSIS

    View Slide

  25. ldscript
    NCFEͷϠπ͸
    "3.७ਖ਼ίϯύΠϥ༻ʹॻ͔Ε͍ͯΔ
    METDSJQUͱ͸ϦϯΧʹ౉͢ઃఆϑΝΠϧɻόΠφϦΠϝʔδ
    ͷͲ͜ʹԿ͕ஔ͔ΕΔ͔Λهड़͢Δɻ

    View Slide

  26. MEMORY {!
    flash (rx) : ORIGIN = 0x00000000, LENGTH = 16K!
    ram (rwx) : ORIGIN = 0x10000000, LENGTH = 4K!
    }!
    ENTRY(Reset_Handler)!
    SECTIONS {!
    .text : {!
    KEEP(*(.isr_vector))!
    *(.text*)!
    KEEP(*(.init))!
    KEEP(*(.fini))!
    *crtbegin.o(.ctors)!
    *crtbegin?.o(.ctors)!
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)!
    *(SORT(.ctors.*))!
    *(.ctors)!
    *crtbegin.o(.dtors)!
    *crtbegin?.o(.dtors)!
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)!
    *(SORT(.dtors.*))!
    *(.dtors)!
    *(.rodata*)!
    KEEP(*(.eh_frame*))!
    } > flash!
    .ARM.extab : {!
    *(.ARM.extab* .gnu.linkonce.armextab.*)!
    } > flash!
    __exidx_start = .;!
    .ARM.exidx : {!
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)!
    } > flash!
    __exidx_end = .;!
    __etext__ = .;!
    .data : AT(__etext__) {!
    __data_values__ = LOADADDR(.data);!
    __data_begin__ = .;!
    *(vtable)!
    *(.data*)!
    3".ͱϑϥογϡϝϞϦͷ
    ։࢝ΞυϨεͱαΠζ͸
    ී௨σʔλγʔτʹॻ͍ͯ͋Δ
    !
    ࠓճ࢖͏-1$ͷ৘ใ͸
    ҎԼͷ63-͔ΒḷΕΔ
    IUUQXXXOYQMQDDPNMQD@NJDPODPSUFYNMQD
    ldscript

    View Slide

  27. MEMORY {!
    flash (rx) : ORIGIN = 0x00000000, LENGTH = 16K!
    ram (rwx) : ORIGIN = 0x10000000, LENGTH = 4K!
    }!
    ENTRY(Reset_Handler)!
    SECTIONS {!
    .text : {!
    KEEP(*(.isr_vector))!
    *(.text*)!
    KEEP(*(.init))!
    KEEP(*(.fini))!
    *crtbegin.o(.ctors)!
    *crtbegin?.o(.ctors)!
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)!
    *(SORT(.ctors.*))!
    *(.ctors)!
    *crtbegin.o(.dtors)!
    *crtbegin?.o(.dtors)!
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)!
    *(SORT(.dtors.*))!
    *(.dtors)!
    *(.rodata*)!
    KEEP(*(.eh_frame*))!
    } > flash!
    .ARM.extab : {!
    *(.ARM.extab* .gnu.linkonce.armextab.*)!
    } > flash!
    __exidx_start = .;!
    .ARM.exidx : {!
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)!
    } > flash!
    __exidx_end = .;!
    __etext__ = .;!
    .data : AT(__etext__) {!
    __data_values__ = LOADADDR(.data);!
    __data_begin__ = .;!
    *(vtable)!
    *(.data*)!
    . = ALIGN(4);!
    ϑϥογϡϝϞϦʹ͸
    !
    ׂΓࠐΈϕΫλ
    Ϛγϯޠ
    ॻ͖มΘΒͳ͍σʔλ
    !
    Λஔ͘
    ldscript

    View Slide

  28. .ARM.exidx : {!
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)!
    } > flash!
    __exidx_end = .;!
    __etext__ = .;!
    .data : AT(__etext__) {!
    __data_values__ = LOADADDR(.data);!
    __data_begin__ = .;!
    *(vtable)!
    *(.data*)!
    . = ALIGN(4);!
    PROVIDE_HIDDEN (__preinit_array_start = .);!
    KEEP(*(.preinit_array))!
    PROVIDE_HIDDEN (__preinit_array_end = .);!
    . = ALIGN(4);!
    PROVIDE_HIDDEN (__init_array_start = .);!
    KEEP(*(SORT(.init_array.*)))!
    KEEP(*(.init_array))!
    PROVIDE_HIDDEN (__init_array_end = .);!
    . = ALIGN(4);!
    PROVIDE_HIDDEN (__fini_array_start = .);!
    KEEP(*(SORT(.fini_array.*)))!
    KEEP(*(.fini_array))!
    PROVIDE_HIDDEN (__fini_array_end = .);!
    . = ALIGN(4);!
    __data_end__ = .;!
    } > ram!
    .bss : {!
    __bss_begin__ = .;!
    *(.bss*)!
    *(COMMON)!
    __bss_end__ = .;!
    } > ram!
    __stack_begin__ = .;!
    .stack_dummy : {!
    *(.stack)!
    } > ram!
    __stack_end__ = .;!
    }
    3".ʹ͸
    !
    WUBCMF
    ॻ͖มΘΔσʔλ
    ελοΫ
    !
    Λஔ͘
    ldscript

    View Slide

  29. ϓϩάϥϜ͕ىಈ͔ͯ͠Β
    NBJOؔ਺ʹೖΔ·ͰͷॲཧΛॻ͍ͨ΋ͷ
    ىಈ
    άϩʔόϧม਺ͷॳظ஋Λઃఆ
    άϩʔόϧม਺ͷίϯετϥΫλΛ࣮ߦ
    ϋʔυ΢ΣΞͷॳظԽ
    main()ʹδϟϯϓ
    ελʔτΞοϓϧʔνϯ

    View Slide

  30. NCFEͷϠπ͸ྫʹΑͬͯ
    "3.७ਖ਼ίϯύΠϥ༻ʹॻ͔Ε͍ͯΔ
    ελʔτΞοϓϧʔνϯ

    View Slide

  31. ελʔτΞοϓϧʔνϯ
    Reset_Handler:!
    ldr r1, =__etext__!
    ldr r2, =__data_begin__!
    ldr r3, =__data_end__!
    ldr r0, =init_data!
    blx r0!
    ldr r0, =init_bss!
    blx r0!
    ldr r0, =run_preinit!
    blx r0!
    ldr r0, =run_init!
    blx r0!
    ldr r0, =SystemInit!
    blx r0!
    ldr r0, =main!
    blx r0!
    .pool !
    .size Reset_Handler, . - Reset_Handler

    View Slide

  32. ελʔτΞοϓϧʔνϯ
    Reset_Handler:!
    ldr r1, =__etext__!
    ldr r2, =__data_begin__!
    ldr r3, =__data_end__!
    ldr r0, =init_data!
    blx r0!
    ldr r0, =init_bss!
    blx r0!
    ldr r0, =run_preinit!
    blx r0!
    ldr r0, =run_init!
    blx r0!
    ldr r0, =SystemInit!
    blx r0!
    ldr r0, =main!
    blx r0!
    .pool !
    .size Reset_Handler, . - Reset_Handler
    ΞηϯϒϦͰ֨ಆͨ͘͠ͳ͍ͷͰ
    $Ͱ࣮૷ͨ͠ॳظԽίʔυʹඈͿ

    View Slide

  33. ελʔτΞοϓϧʔνϯ
    Reset_Handler:!
    ldr r1, =__etext__!
    ldr r2, =__data_begin__!
    ldr r3, =__data_end__!
    ldr r0, =init_data!
    blx r0!
    ldr r0, =init_bss!
    blx r0!
    ldr r0, =run_preinit!
    blx r0!
    ldr r0, =run_init!
    blx r0!
    ldr r0, =SystemInit!
    blx r0!
    ldr r0, =main!
    blx r0!
    .pool !
    .size Reset_Handler, . - Reset_Handler
    σόΠεͷॳظԽ͸
    CMSISʹ͓·͔ͤ

    View Slide

  34. void run_preinit(void) {!
    int *cur = &__preinit_array_start;!
    for( ; cur < &__preinit_array_end; cur++ ) {!
    void (*f)(void) = (void *)*cur;!
    (*f)();!
    }!
    }!
    void run_init(void) {!
    int *cur = &__init_array_start;!
    for( ; cur < &__init_array_end; cur++ ) {!
    void (*f)(void) = (void *)*cur;!
    (*f)();!
    }!
    }!
    void init_data(void) {!
    unsigned char *src = &__data_values__;!
    unsigned char *dest = &__data_begin__;!
    unsigned int len = &__data_end__ - &__data_begin__;!
    while( len-- ) *dest++ = *src++;!
    }!
    void init_bss(void) {!
    unsigned char *dest = &__bss_begin__;!
    unsigned int len = &__bss_end__ - &__bss_begin__;!
    while( len-- ) *dest++ = 0;!
    }

    View Slide

  35. void run_preinit(void) {!
    int *cur = &__preinit_array_start;!
    for( ; cur < &__preinit_array_end; cur++ ) {!
    void (*f)(void) = (void *)*cur;!
    (*f)();!
    }!
    }!
    void run_init(void) {!
    int *cur = &__init_array_start;!
    for( ; cur < &__init_array_end; cur++ ) {!
    void (*f)(void) = (void *)*cur;!
    (*f)();!
    }!
    }!
    void init_data(void) {!
    unsigned char *src = &__data_values__;!
    unsigned char *dest = &__data_begin__;!
    unsigned int len = &__data_end__ - &__data_begin__;!
    while( len-- ) *dest++ = *src++;!
    }!
    void init_bss(void) {!
    unsigned char *dest = &__bss_begin__;!
    unsigned int len = &__bss_end__ - &__bss_begin__;!
    while( len-- ) *dest++ = 0;!
    }
    RAMʹஔ͍͓ͯ͘σʔλΛ
    ϑϥογϡϝϞϦ͔Βίϐʔ

    View Slide

  36. void run_preinit(void) {!
    int *cur = &__preinit_array_start;!
    for( ; cur < &__preinit_array_end; cur++ ) {!
    void (*f)(void) = (void *)*cur;!
    (*f)();!
    }!
    }!
    void run_init(void) {!
    int *cur = &__init_array_start;!
    for( ; cur < &__init_array_end; cur++ ) {!
    void (*f)(void) = (void *)*cur;!
    (*f)();!
    }!
    }!
    void init_data(void) {!
    unsigned char *src = &__data_values__;!
    unsigned char *dest = &__data_begin__;!
    unsigned int len = &__data_end__ - &__data_begin__;!
    while( len-- ) *dest++ = *src++;!
    }!
    void init_bss(void) {!
    unsigned char *dest = &__bss_begin__;!
    unsigned int len = &__bss_end__ - &__bss_begin__;!
    while( len-- ) *dest++ = 0;!
    }
    άϩʔόϧΦϒδΣΫτͷ
    ίϯετϥΫλͱ͔Λ࣮ߦ

    View Slide

  37. LEDΛ఺໓ͤͯ͞ΈΑ͏

    View Slide

  38. #include "LPC8xx.h"!
    extern "C"!
    __attribute__((interrupt("IRQ")))!
    void SysTick_Handler(void) {!
    LPC_GPIO_PORT->NOT0 = ( 1 << 16 );!
    }!
    int main() {!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);!
    LPC_GPIO_PORT->DIR0 |= ( 1 << 16 );!
    SysTick_Config( 6000000 );!
    while( 1 );!
    }

    View Slide

  39. #include "LPC8xx.h"!
    extern "C"!
    __attribute__((interrupt("IRQ")))!
    void SysTick_Handler(void) {!
    LPC_GPIO_PORT->NOT0 = ( 1 << 16 );!
    }!
    int main() {!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);!
    LPC_GPIO_PORT->DIR0 |= ( 1 << 16 );!
    SysTick_Config( 6000000 );!
    while( 1 );!
    }
    SysTickλΠϚʔͷׂΓࠐΈ͕ൃੜͨ͠Β
    ൪໨ͷGPIOͷ஋Λ൓స
    @@BUUSJCVUF@@ JOUFSSVQU l*32z


    ͱ͸͜ΕΛࢦఆͯ͠
    ͓͘ͱHDDׂ͕ΓࠐΈΤϯτϦϧʔνϯΛ෇͚ͯ͘ΕΔ

    View Slide

  40. #include "LPC8xx.h"!
    extern "C"!
    __attribute__((interrupt("IRQ")))!
    void SysTick_Handler(void) {!
    LPC_GPIO_PORT->NOT0 = ( 1 << 16 );!
    }!
    int main() {!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);!
    LPC_GPIO_PORT->DIR0 |= ( 1 << 16 );!
    SysTick_Config( 6000000 );!
    while( 1 );!
    }
    GPIO΁ͷΫϩοΫΛ༗ޮʹͯ͠
    ൪໨Λग़ྗϞʔυʹ੾Γସ͑
    SysTick͕6,000,000Χ΢ϯτ͢Δ౓ʹ
    SysTickׂΓࠐΈΛൃੜͤ͞ΔΑ͏ʹ͢Δ

    View Slide

  41. LPC812͸
    ىಈ࣌͸12MHzͰಈ͍͍ͯΔ
    SysTick͕
    6,000,000Χ΢ϯτ͢Δʹ͸
    0.5ඵ͔͔Δ
    0.5ඵຖʹGPIOͷग़ྗ͕
    ൓స͢Δ͸ͣ

    View Slide

  42. IUUQZPVUVCF(ZQE(%N*D

    View Slide

  43. ୈճΧʔωϧ7.ؔ੢Ͱ঺հͨ͠ωλ
    100MHzͷCortex-M3ϚΠίϯΛ࢖ͬͯ
    FMԻݯͱ͔Λ࡞Δ࿩
    γϯηαΠβʔೖ໳

    View Slide

  44. MHzͷCortex-M0+Ͱ΋
    γϯηαΠβʔ͕࡞ΕΔͷͰ͸

    View Slide

  45. ԻΛग़ͤΔΑ͏ʹ͠Α͏

    View Slide

  46. ϚΠίϯʹ%"$͕ແ͍ͷͰ
    41*ʹ%"$ΛͿΒԼ͛Δ
    7
    "3.ϚΠίϯ
    -1$
    41*%"$
    .$1
    Ξϯϓ*$
    )57
    1*0@
    1*0@
    1*0@
    7%%
    744
    7%%
    "744
    $4
    4$-,
    4%*
    73&'
    7065"
    744

    Ж'
    Ж'
    Ж'
    7%%
    744
    73&'
    "6%*/
    065/
    0651

    View Slide

  47. void init_dac() {!
    NVIC_DisableIRQ( (IRQn_Type)( SPI0_IRQn ) );!
    NVIC_SetPriority(SPI0_IRQn, 0); !
    do {!
    NVIC_ClearPendingIRQ(SPI0_IRQn); !
    } while(NVIC_GetPendingIRQ(SPI0_IRQn) != 0);!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11);!
    LPC_SPI0->DLY = 4;!
    LPC_SPI0->DIV = 2;!
    LPC_SPI0->TXCTRL = (16-1)<<24 | 1<<22 | ( 1 << 20 );!
    LPC_SPI0->CFG = (1<<5)|(1<<4)|(1<<2);!
    switch_matrix::bind_SPI0_SSEL_IO( 8 ); !
    switch_matrix::bind_SPI0_SCK_IO( 9 );!
    switch_matrix::bind_SPI0_MOSI_IO( 1 );!
    LPC_SPI0->INTENSET = 0x0;!
    NVIC_EnableIRQ( (IRQn_Type)( SPI0_IRQn ) );!
    LPC_SPI0->TXDAT = 2048 | ( 1 << 13 )|( 1 << 12 );!
    }!
    void set_dac( uint16_t value ) {!
    value &= 4095;!
    LPC_SPI0->TXDAT = value | ( 1 << 13 )|( 1 << 12 );!
    }

    View Slide

  48. void init_dac() {!
    NVIC_DisableIRQ( (IRQn_Type)( SPI0_IRQn ) );!
    NVIC_SetPriority(SPI0_IRQn, 0); !
    do {!
    NVIC_ClearPendingIRQ(SPI0_IRQn); !
    } while(NVIC_GetPendingIRQ(SPI0_IRQn) != 0);!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11);!
    LPC_SPI0->DLY = 4;!
    LPC_SPI0->DIV = 2;!
    LPC_SPI0->TXCTRL = (16-1)<<24 | 1<<22 | ( 1 << 20 );!
    LPC_SPI0->CFG = (1<<5)|(1<<4)|(1<<2);!
    switch_matrix::bind_SPI0_SSEL_IO( 8 ); !
    switch_matrix::bind_SPI0_SCK_IO( 9 );!
    switch_matrix::bind_SPI0_MOSI_IO( 1 );!
    LPC_SPI0->INTENSET = 0x0;!
    NVIC_EnableIRQ( (IRQn_Type)( SPI0_IRQn ) );!
    LPC_SPI0->TXDAT = 2048 | ( 1 << 13 )|( 1 << 12 );!
    }!
    void set_dac( uint16_t value ) {!
    value &= 4095;!
    LPC_SPI0->TXDAT = value | ( 1 << 13 )|( 1 << 12 );!
    }
    LPC812ͷSPI͸
    Ұ౓ʹ16bit·ͰૹΕΔ
    MCP4821 ࠓճ࢖ͬͨDAC
    ͸
    16bitૹΔຖʹग़ྗ͕ߋ৽͞ΕΔ
    ૹ৴׬ྃ࣌ͷׂΓࠐΈ͕ཁΒͳ͍
    ૹ৴όοϑΝ΋ཁΒͳ͍
    ΍ͬͨͶ

    View Slide

  49. void init_system_clock() {!
    LPC_SYSCON->SYSAHBCLKDIV = 2;!
    LPC_SYSCON->SYSPLLCTRL = 0x24;!
    }!
    int main() {!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);!
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18);!
    LPC_GPIO_PORT->DIR0 |= ( 1 << 8 );!
    LPC_GPIO_PORT->DIR0 |= ( 1 << 9 );!
    LPC_GPIO_PORT->DIR0 |= ( 1 << 1 );!
    init_system_clock();!
    init_dac();!
    SysTick_Config( 1875*2 );!
    while( 1 );!
    }
    $16ͷΫϩοΫΛ.)[ʹͯ͠
    SysTickΛ8kHzʹઃఆ

    View Slide

  50. uint16_t step = 0;!
    !
    extern "C"!
    __attribute__((interrupt("IRQ")))!
    void SysTick_Handler(void) {!
    set_dac( step << 5 );!
    ++step;!
    }
    SysTickׂΓࠐΈ͕ൃੜͨ͠Β
    Χ΢ϯλͷ஋ΛDACʹૹΔ
    ͜ΕͰϊίΪϦ೾͕ग़Δ͸ͣ

    View Slide

  51. IUUQZPVUVCFGBK-LMLQ/*

    View Slide

  52. Ի৭Λܭࢉ͠Α͏

    View Slide

  53. View Slide

  54. μΠφϛοΫϨϯδѹॖ
    ΦʔσΟΦόοϑΝ
    ΦϖϨʔλ࿨Ի'.Իݯ

    View Slide

  55. ͷݻఆখ਺఺਺Λ࢖͏
    ුಈখ਺ԋࢉث͕ແ͍
    ੔਺෦CJUූ߸෇͖੔਺ খ਺෦CJUූ߸ແ͠੔਺
    ੔਺͔Βݻఆখ਺఺਺΁ͷม׵͸ࠨʹCJUγϑτ
    ݻఆখ਺఺਺͔Β੔਺΁ͷม׵͸ӈʹCJUγϑτ

    View Slide

  56. ϒϩοΫ୯ҐͰܭࢉ
    1$.ͷαϯϓϧ͸L)[͸ͳ͍ͱ
    ·ͱ΋ͳԻʹฉ͑͜ͳ͍
    Իྔͷ্͛Լ͛΍Ωʔͷঢ়ଶ͸
    ΋ͬͱ௿͍ස౓Ͱ͔͠มԽ͠ͳ͍
    ϒϩοΫ
    ϒϩοΫͷதͰ͸Իྔ΍ΩʔͷมԽ͸
    ແࢹͰ͖Δ΋ͷͱ͢Δ

    View Slide

  57. प೾਺ͷ௿͍೾΍ઢܗͳ஋ͷมԽ͸
    ؒҾ͍ͯܭࢉग़དྷΔ
    ิؒ ิؒ ิؒ ิؒ
    ඞཁͳαϯϓϧ਺
    ܭࢉͨ͠αϯϓϧ਺
    ͝·͔ͨ͠αϯϓϧ਺



    ϒϩοΫ୯ҐͰܭࢉ

    View Slide

  58. IUUQZPVUVCF0B6NO0Y[6*

    View Slide

  59. ܭࢉΛ଎͘͠Α͏

    View Slide

  60. CJUͷ੔਺ಉ࢜ͷ৐ࢉͷ݁Ռ͸
    ࠷େͰCJUͷ੔਺ʹͳΔ
    FFFFFFFF!
    FFFFFFFF
    CJU
    CJU
    CJU
    FFFFFFFE00000001
    *

    View Slide

  61. ৐ࢉ໋ྩNVM͸
    CJUͱCJUΛֻ͚ͯ
    ݁ՌͷԼCJUΛಘΔ
    IUUQJOGPDFOUFSBSNDPNIFMQJOEFYKTQ UPQJD
    DPNBSNEPDEVJJK$JIJIHHKIUNM

    View Slide

  62. FFFF.FFFF!
    FFFF.FFFF
    FFFFFFFE.00000001
    *
    ͷݻఆখ਺఺਺ಉ࢜ͷ
    ৐ࢉͷ݁Ռ͸
    ͷݻఆখ਺఺਺ʹͳΔ
    ݁ՌΛͰಘΔʹ͸
    CJU໨͔ΒCJU໨·Ͱ͕ཉ͍͠

    View Slide

  63. FFFF.FFFF!
    FFFF.FFFF
    FFFFFFFE.00000001
    *
    ݁ՌΛͰಘΔʹ͸
    CJU໨͔ΒCJU໨·Ͱ͕ཉ͍͠
    ৐ࢉ݁ՌͷCJU໨Ҏ্ͷ஋͕ඞཁ

    View Slide

  64. CJUͱCJUΛֻ͚ͯ
    ݁ՌΛCJUͰಘΔ໋ྩ
    NVMM

    View Slide

  65. inline constexpr self_type operator*(!
    const self_type &y!
    ) const {!
    return self_type(!
    (!
    static_cast< double_type >( base ) *!
    static_cast< double_type >( y.base )!
    ) >> Shift::value, raw()!
    );!
    }
    NVMM͕࢖ΘΕΔ͜ͱΛظ଴ͯ͠
    ৐ࢉΛ͜Μͳ෩ʹ࣮૷͍ͯͨ͠

    View Slide

  66. …!
    00001374 <__aeabi_lmul>:!
    1374: 469c mov ip, r3!
    1376: 0403 lsls r3, r0, #16!
    1378: b5f0 push {r4, r5, r6, r7, lr}!
    137a: 0c1b lsrs r3, r3, #16!
    137c: 0417 lsls r7, r2, #16!
    137e: 0c3f lsrs r7, r7, #16!
    1380: 0c15 lsrs r5, r2, #16!
    1382: 1c1e adds r6, r3, #0!
    1384: 1c04 adds r4, r0, #0!
    1386: 0c00 lsrs r0, r0, #16!
    1388: 437e muls r6, r7!
    138a: 436b muls r3, r5!
    138c: 4347 muls r7, r0!
    138e: 4345 muls r5, r0!
    1390: 18fb adds r3, r7, r3!
    1392: 0c30 lsrs r0, r6, #16!
    1394: 1818 adds r0, r3, r0!
    1396: 4287 cmp r7, r0!
    1398: d902 bls.n 13a0 <__aeabi_lmul+0x2c>!
    139a: 2380 movs r3, #128 ; 0x80!
    ݱ࣮

    View Slide

  67. 1392: 0c30 lsrs r0, r6, #16!
    1394: 1818 adds r0, r3, r0!
    1396: 4287 cmp r7, r0!
    1398: d902 bls.n 13a0 <__aeabi_lmul+0x2c>!
    139a: 2380 movs r3, #128 ; 0x80!
    139c: 025b lsls r3, r3, #9!
    139e: 18ed adds r5, r5, r3!
    13a0: 0c03 lsrs r3, r0, #16!
    13a2: 18ed adds r5, r5, r3!
    13a4: 4663 mov r3, ip!
    13a6: 435c muls r4, r3!
    13a8: 434a muls r2, r1!
    13aa: 0436 lsls r6, r6, #16!
    13ac: 0c36 lsrs r6, r6, #16!
    13ae: 18a1 adds r1, r4, r2!
    13b0: 0400 lsls r0, r0, #16!
    13b2: 1980 adds r0, r0, r6!
    13b4: 1949 adds r1, r1, r5!
    13b6: bdf0 pop {r4, r5, r6, r7, pc}!

    ݱ࣮
    mull͸࢖ΘΕ͍ͯͳ͍

    View Slide

  68. ARM໋ྩʹ͸ରԠ͍ͯ͠ͳ͍
    5IVNC '16
    ͷΈ
    5IVNC '16
    ͷΈ
    5IVNCͷΈ
    5IVNCͷҰ෦͚ͩ
    5IVNCͷҰ෦͚ͩ
    5IVNCͷҰ෦͚ͩ
    Cortex-M7
    Cortex-M4
    Cortex-M3
    Cortex-M1
    Cortex-M0+
    CortexM0
    5IVNCͱ͸"3.ϓϩηοαͷ΋͏ͭͷ໋ྩηοτɻ
    ໋ྩ͕Մม௕Ͱ"3.໋ྩηοτΑΓϚγϯޠ͕খ͘͞ͳΔɻ

    View Slide

  69. ARM໋ྩʹ͸ରԠ͍ͯ͠ͳ͍
    5IVNC '16
    ͷΈ
    5IVNC '16
    ͷΈ
    5IVNCͷΈ
    5IVNCͷҰ෦͚ͩ
    5IVNCͷҰ෦͚ͩ
    5IVNCͷҰ෦͚ͩ
    Cortex-M7
    Cortex-M4
    Cortex-M3
    Cortex-M1
    Cortex-M0+
    CortexM0
    5IVNCͱ͸"3.ϓϩηοαͷ΋͏ͭͷ໋ྩηοτɻ
    ໋ྩ͕Մม௕Ͱ"3.໋ྩηοτΑΓϚγϯޠ͕খ͘͞ͳΔɻ
    Ұ෦ͱ͸

    View Slide

  70. NPWNPWXNPWU
    BEEBEDBES
    TVCTCDSTC
    NVMNMBNMTTNVMMVNVMMTNMBMVNMBM
    TEJWVEJW
    TTBUVTBU
    DNQDNO
    BOEFPSPSSPSOCJDNWOUTUUFR
    MTMMTSBTSSPSSSYDM[
    MESMESIMESCMESTIMESTCMESUMESIUMESCUMESTIUMESTCUMESEMEN
    TUSTUSITUSCTUSTITUSTCTUSUTUSIUTUSCUTUSTIUTUSTCUTUSETUN
    QVTIQPQ
    MESFYMESFYIMESFYCTUSFYTUSFYITUSFYCDMSFY
    CCMCYCMYDC[DC[OUCCUCI
    TWDJUDQTJEDQTJFNSTNTSCLQU
    TYUITYUCVYUIVYUC
    VCGYTCGYCGDCGJ
    SFWSFWSFWTISCJU
    TFWXFGXGJOPQ
    JTCENCETC
    M7/M4/M3
    Ҡಈ
    Ճࢉ
    ݮࢉ
    ৐ࢉ
    আࢉ
    ๞࿨ԋࢉ
    ൺֱ
    ࿦ཧԋࢉ
    γϑτ
    ϩʔυ
    ετΞ
    ελοΫૢ࡞
    ηϚϑΥ
    ෼ذ
    ঢ়ଶมߋ
    ܕͷ֦ு
    ϏοτϑΟʔϧυ
    Ϗοτྻ൓స
    ώϯτ
    όϦΞ
    ARMv7m

    View Slide

  71. NPWNPWXNPWU
    BEEBEDBES
    TVCTCDSTC
    NVMNMBNMTTNVMMVNVMMTNMBMVNMBM
    TEJWVEJW
    TTBUVTBU
    DNQDNO
    BOEFPSPSSPSOCJDNWOUTUUFR
    MTMMTSBTSSPSSSYDM[
    MESMESIMESCMESTIMESTCMESUMESIUMESCUMESTIUMESTCUMESEMEN
    TUSTUSITUSCTUSTITUSTCTUSUTUSIUTUSCUTUSTIUTUSTCUTUSETUN
    QVTIQPQ
    MESFYMESFYIMESFYCTUSFYTUSFYITUSFYCDMSFY
    CCMCYCMYDC[DC[OUCCUCI
    TWDJUDQTJEDQTJFNSTNTSCLQU
    TYUITYUCVYUIVYUC
    VCGYTCGYCGDCGJ
    SFWSFWSFWTISCJU
    TFWXFGXGJZFJMEOPQ
    JTCENCETC
    Ҡಈ
    Ճࢉ
    ݮࢉ
    ৐ࢉ
    আࢉ
    ๞࿨ԋࢉ
    ൺֱ
    ࿦ཧԋࢉ
    γϑτ
    ϩʔυ
    ετΞ
    ελοΫૢ࡞
    ηϚϑΥ
    ෼ذ
    ঢ়ଶมߋ
    ܕͷ֦ு
    ϏοτϑΟʔϧυ
    Ϗοτྻ൓స
    ώϯτ
    όϦΞ
    M1/M0+/M0
    ARMv6m

    View Slide

  72. M1/M0+/M0
    NPWNPWXNPWU
    BEEBEDBES
    TVCTCDSTC
    NVMNMBNMTTNVMMVNVMMTNMBMVNMBM
    TEJWVEJW
    TTBUVTBU
    DNQDNO
    BOEFPSPSSPSOCJDNWOUTUUFR
    MTMMTSBTSSPSSSYDM[
    MESMESIMESCMESTIMESTCMESUMESIUMESCUMESTIUMESTCUMESEMEN
    TUSTUSITUSCTUSTITUSTCTUSUTUSIUTUSCUTUSTIUTUSTCUTUSETUN
    QVTIQPQ
    MESFYMESFYIMESFYCTUSFYTUSFYITUSFYCDMSFY
    CCMCYCMYDC[DC[OUCCUCI
    TWDJUDQTJEDQTJFNSTNTSCLQU
    TYUITYUCVYUIVYUC
    VCGYTCGYCGDCGJ
    SFWSFWSFWTISCJU
    TFWXFGXGJZFJMEOPQ
    JTCENCETC
    Ҡಈ
    Ճࢉ
    ݮࢉ
    ৐ࢉ
    আࢉ
    ๞࿨ԋࢉ
    ൺֱ
    ࿦ཧԋࢉ
    γϑτ
    ϩʔυ
    ετΞ
    ελοΫૢ࡞
    ηϚϑΥ
    ෼ذ
    ঢ়ଶมߋ
    ܕͷ֦ு
    ϏοτϑΟʔϧυ
    Ϗοτྻ൓స
    ώϯτ
    όϦΞ
    ARMv6m
    NVMM͸٘ਜ਼ʹͳͬͨͷͩ
    NVMNMBNMTTNVMMVNVMMTNMBMVNMBM

    View Slide

  73. NVMMແ͠ͰͲ͏΍ͬͯ
    ݁Ռ͕CJUͷ৐ࢉΛ͢Δ͔
    a b
    a*d b*d
    * c d
    a*c b*c
    ((a*c)<<32)+((a*d+b*c)<<16)+b*d
    BCDE͸ͦΕͧΕCJU
    චࢉͷཁྖͰCJUͮͭ
    ܭࢉ͍ͯ͘͠

    View Slide

  74. a b
    a*d b*d
    * c d
    a*c b*c
    ((a*c)<<32)+((a*d+b*c)<<16)+b*d
    αϯϓϧຖʹ͜ΜͳܭࢉΛ
    Կ౓΋͍ͯͨ͠Βؒʹ߹Θͳ͍

    View Slide

  75. CJUͷ৐ࢉΛ
    ճආͤΑ

    View Slide

  76. ݁Ռ͕໌Β͔ͳ৔߹
    CJU໨͔ΒCJU໨͸໌Β͔ͳͷͰ
    CJU໨͔ΒCJU໨·Ͱ͕ཉ͍͠
    ͜ͷܭࢉ͸NVM໋ྩͰͰ͖Δ
    0000.FFFF!
    0000.FFFF
    00000000.FFFE0001
    *

    View Slide

  77. ݁Ռ͕໌Β͔ͳ৔߹
    ࣮͸'.ԻݯͷܭࢉதʹݱΕΔ
    ৐ࢉͷଟ͘ʹ͜Ε͕੒Γཱͭ
    ADSR
    FMมௐ
    Իྔͷ࣌ؒมԽ
    ࠷େ

    ྆ลڞʹͷ৔߹ͷΈ
    ஫ҙ͢Ε͹NVMͰ0,

    View Slide

  78. ࣮͸'.ԻݯͷܭࢉதʹݱΕΔ
    ৐ࢉͷຆͲʹ͜Ε͕੒Γཱͭ
    ϛΩαʔ
    JMJMJMJM
    J J J J
    M M M M
    ೖྗ͸'.ΦϖϨʔλͷग़ྗͳͷͰ࠷େ
    ॏΈ͸શ෦͋Θͤͯ࠷େ
    ྆ลڞʹͷ৔߹ͷΈ஫ҙ͢Ε͹NVMͰ0,
    ݁Ռ͕໌Β͔ͳ৔߹

    View Slide

  79. ݻఆখ਺఺਺ͱ੔਺ͷ৐ࢉ
    FFFF.FFFF!
    FFFF
    FFFEFFFF.0001
    *
    ݁ՌΛͰಘΔʹ͸
    CJU໨͔ΒCJU໨·Ͱ͕ཉ͍͠
    ͜ͷܭࢉ͸NVM໋ྩͰͰ͖Δ

    View Slide


  80. ʜ ʜ
    ϒϩοΫͷதͰԿ൪໨ͷαϯϓϧ͔͸
    ੔਺Ͱද͞ΕΔ
    αϯϓϧͷΠϯσοΫεͱ࣌ࠁͷؔ܎͸ઢܗ
    UGTTT UGTTT
    ࣌ࠁߦྻ

    View Slide

  81. ࣌ࠁߦྻ
    αϯϓϧͷΠϯσοΫεͱ࣌ࠁͷؔ܎͸ઢܗ
    YͷߦྻͰදݱग़དྷΔ
    U͸αϯϓϧͷ࣌ࠁ
    J͸αϯϓϧͷΠϯσοΫε
    GT͸1$.ͷप೾਺
    TT͸͜ͷϒϩοΫͷ࠶ੜ͕࢝·Δ࣌ࠁ

    View Slide

  82. τʔϯ࣌ؒ
    ࣮ࡍͷ࣌ࠁʹରͯ͠
    Իͷप೾਺ഒͰਐߦ͢ΔΫϩοΫ
    τʔϯ࣌ؒͷখ਺෦෼͚ͩΛऔΓग़͢ͱ
    ҙਤͨ͠प೾਺ͱҐ૬ͷϊίΪϦ೾ʹͳΔ

    View Slide

  83. τʔϯߦྻ
    ࣌ࠁͱτʔϯΫϩοΫͷؔ܎͸ઢܗͳͷͰ
    YͷߦྻͰදݱͰ͖Δ
    ͜ͷ৐ࢉ͸খ਺ಉ͔࢜ͭ
    ݁Ռͷઈର஋͕Ҏ্ʹͳΔ
    U͸αϯϓϧͷ࣌ࠁɺUU͸αϯϓϧͷτʔϯ࣌ࠁ
    GU͸ϊʔτͷप೾਺ɺTU͸ϊʔτͷҐ૬

    View Slide

  84. ͜ͷ෦෼͕ࣄલʹٻ·͍ͬͯΕ͹
    ΠϯσοΫε͸੔਺ͳͷͰ
    τʔϯΫϩοΫ͸ߴ଎ͳ৐ࢉͰٻ·Δ
    τʔϯߦྻ
    ࣌ࠁͱτʔϯΫϩοΫͷؔ܎͸ઢܗͳͷͰ
    YͷߦྻͰදݱͰ͖Δ

    View Slide

  85. ϒϩοΫͷ։࢝࣌ࠁ͕ϒϩοΫຖʹมΘΔͷͰ
    ϒϩοΫຖʹ
    ࣌ࠁߦྻͱτʔϯߦྻͷੵΛٻΊΔ
    ߦྻͷੵͷܭࢉʹ͸஗͍৐ࢉ͕ೖΔ͕
    ϒϩοΫʹ͖ͭճͷ஗͍৐ࢉͰ
    αϯϓϧ୯Ґͷ஗͍৐ࢉΛճආग़དྷΔ

    View Slide

  86. ݁Ռ

    View Slide

  87. IUUQZPVUVCF%%-4&JSS@"

    View Slide

  88. ·ͱΊ
    খ͞ͳARMʹ͸
    େ͖ͳັྗ͕ൿΊΒΕ͍ͯΔ

    View Slide

  89. Thank you for listening.

    View Slide