楽天市場
[無料でホームページを作成] [通報・削除依頼]

1kワードのTINYBASIC STM32L010F4

1kワードのTINYBASIC STM32版(STM32G030J6M6)をSTM32L010F4P6に移植しました。

移植の過程でいくつか考慮すべき点がありましたので、本ページに記載します。

①STM32G0とSTM32L0ではベクターの記述が異なる。
両者のベクター領域は(FLASHの場合)ともに0x08000000~0x080000BFなのですが、搭載している
ペリフェラルが異なるためベクターの記述をSTM32G0から変更する必要があります。

②同じ機能のレジスタでも両者のマニュアル上で名称が異なる。
特にRCC関連のレジスタで名称が異なるものがいくつか存在します。

③STM32G0とSTM32L0ではリセット時のクロックが異なる。
STM32L0はArm® Cortex®-M0+ベースの超低消費電力32bitマイコンで、起動時に低電力モードに設定され、
起動時のクロック周波数が低く設定されています。STM32G0と同じ周波数16MHzで動作させるためにクロック
の変更が必要となります。

マニュアルを読んだ限りでは、クロックの設定を変更するためにSTOPモード移行後の割り込みが必要とも受けとれる
記述があり難儀しましたが、実際は以下のページに記載の方法で16MHzのクロックに切り替えることができました。
http://stefanfrings.de/stm32/stm32l0.html

④BOOT0ピンの扱い
STM32G0ではSTM32CubeProgrammerを使用してBOOT0ピンの設定により、シリアル経由のプログラム書き込みが
行えましたが、STM32L010F4の場合シリアル通信が成立せず、書き込みに困難を生じます。(以下のページ参照)
https://qiita.com/caa45040/items/a2e6ceee37f21f84fe27

今回はBOOT0ピンを使用せず、CMCIS-DAPのライター(トラ技ライター)を使用してプログラム書き込みを行いました。


<STM32L010F4P6のクロック変更例:TBLは0x080000C0に配置、Configurarからプログラム開始>

TBL:
    .word    0x8AE41004        @ r0
    .word    GPIOA_MODER     @ r1
    .word    RCC_CR             @ r3
    .word    LPUART_CR1        @ r5
    .word    PWR_CR              @ r6

Configurar:
    movs    r7,#0x20                @@ r7 = 0x00000020
    lsls       r7,r7,#24                @@ r7 = 0x20000000    RAMTOP
    lsrs       r4,r7,#2                 @@ r4 = 0x08000000
    adds     r4,#0xC0                @@ r4 = 0x080000C0    CODETOP
    movs    r2,r4                       @@ r2 = 0x080000C0
    ldm      r2!,{r0-r1,r3,r5-r6} @@ load r0/r1/r3/r5/r6

                                                                        @@ <RCC>
    strh      r0,[r3,#(RCC_APB1ENR+2-RCC_CR)]   @@ [RCC_APB1ENR]=0x10040000
                                                                        @@ PWR/LPUART1 Clock Enable
    lsrs      r2,r4,#16
    strh      r2,[r6,#(PWR_CR-PWR_CR)]        @@ [PWR_CR]=0x00000800 Power Range 1 Select
    movs    r2,#0x01
    strb      r2,[r3,#(RCC_CR-RCC_CR)]         @@ [RCC_CR]=0x00000301 MSI/HSI16ON Enable
rclp1:
    ldrb      r6,[r3,#(RCC_CR-RCC_CR)]         @@ HSI16RDY=1?
    lsrs      r6,r6,#3
    bcc      rclp1
    str       r2,[r3,#(RCC_CFGR-RCC_CR)]       @@ HSI16 Used as System Clock
rclp2:
    ldrb      r6,[r3,#(RCC_CFGR-RCC_CR)]      @@ SWS=01?
    lsrs      r6,r6,#3
    bcc      rclp2
    strb     r7,[r3,#(RCC_CR+1-RCC_CR)]       @@ MSI OFF
    str       r2,[r3,#(RCC_IOPENR-RCC_CR)]    @@ [RCC_IOPENR]=0x00000001 GPIOA Clock Enable

                                                                              @@ <GPIOA>
    strh      r7,[r1,#(GPIOA_MODER-GPIOA_MODER)]  @@ [GPIOA_MODER]=0xEBFF0000
                                                                              @@ PA13-14=AF,PA0-7 INPUT
    movs    r2,0x66
    lsls       r2,r2,#20
    str        r2,[r1,#(GPIOA_AFRH-GPIOA_MODER)]     @@ [GPIOA_AFRH]=0x06600000
                                                                              @@ PA13=LPUSART1_RX,PA14=LPUSART1_TX

    lsrs       r0,r0,#16                                                @@ <LPUART1>
    str        r0,[r5,#(LPUART_BRR-LPUART_CR1)]    
                                            @@[LPUART_BRR]=0x00008AE4,256*16000000/115200=35555.55=0x8AE4
    movs    r0,#0x0D
    str        r0,[r5,#(LPUART_CR1-LPUART_CR1)]        @@ [LPUART_CR1]=0x0000000D TX/RX Enable
                                                                              @@ LPUART1 Enable



<回路図>シリアルポートの通信速度は115200BPS
img_20210512-114125.png



○ダウンロードはこちらから
https://drive.google.com/file/d/1pRKuDhRQJPACAuJGmyywuT40SN6n0ayJ/view?usp=sharing