goo blog サービス終了のお知らせ 

忘備録-備忘録

技術的な備忘録

CH32V003J4M6でprintfデバッグその2

2024-12-27 20:03:45 | ch32v003
ch32v003funでprintfが手軽に使用できるようにライブラリを修正しました。

ch32v003fun.cの1730行あたりの関数SetupUARTに追加します。
 
  1. void SetupUART( int uartBRR )
  2. {
  3. #ifdef CH32V003
  4.     // Enable GPIOD and UART.
  5.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO;
  6. #ifdef USE_UARTPRINTF_PD6
  7.     // Push-Pull, 10MHz Output, GPIO D6, with AutoFunction
  8.     GPIOD->CFGLR &= ~( 0xf << ( 4 * 6 ) );
  9.     GPIOD->CFGLR |= ( GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF ) << ( 4 * 6 );
  10.     // AFIO->PCFR1 |= 0x200000; // 再マップ
  11.     AFIO->PCFR1 &= ~( 1 << 2 | 1 << 21 ); // 再マップ
  12.     AFIO->PCFR1 |= 1 << 21;
  13. #else
  14.     // Push-Pull, 10MHz Output, GPIO D5, with AutoFunction
  15.     GPIOD->CFGLR &= ~( 0xf << ( 4 * 5 ) );
  16.     GPIOD->CFGLR |= ( GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF ) << ( 4 * 5 );
  17.     // Push-Pull, 10MHz Output, GPIO D5, with AutoFunction
  18.     GPIOD->CFGLR &= ~( 0xf << ( 4 * 5 ) );
  19.     GPIOD->CFGLR |= ( GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF ) << ( 4 * 5 );
  20. #endif
  21. #elif defined( CH32X03x )
  22.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1;

  23.     // Push-Pull, 10MHz Output, GPIO A9, with AutoFunction
  24.     GPIOB->CFGHR &= ~( 0xf << ( 4 * 2 ) );
  25.     GPIOB->CFGHR |= ( GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF ) << ( 4 * 2 );
  26. #else
  27.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1;

  28.     // Push-Pull, 10MHz Output, GPIO A9, with AutoFunction
  29.     GPIOA->CFGHR &= ~( 0xf << ( 4 * 1 ) );
  30.     GPIOA->CFGHR |= ( GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF ) << ( 4 * 1 );
  31. #endif

  32.     // 115200, 8n1. Note if you don't specify a mode, UART remains off even when UE_Set.
  33.     USART1->CTLR1 = USART_WordLength_8b | USART_Parity_No | USART_Mode_Tx;
  34.     USART1->CTLR2 = USART_StopBits_1;
  35.     USART1->CTLR3 = USART_HardwareFlowControl_None;

  36.     USART1->BRR = uartBRR;
  37.     USART1->CTLR1 |= CTLR1_UE_Set;
  38. }


funconfig.hを次のように書き換えます。
 
  1. #ifndef _FUNCONFIG_H
  2. #define _FUNCONFIG_H

  3. #define CH32V003 1
  4. #define FUNCONF_USE_UARTPRINTF 1
  5. #define USE_UARTPRINTF_PD6 1
  6. // #define FUNCONF_USE_DEBUGPRINTF 1
  7. #endif


CH32V003J4M6でLEDチカチカ

2024-12-27 18:06:39 | ch32v003
CH32V003J4M6の1pin,3pin,5pin,6pin,7pinにLEDを接続して点滅させるプログラム

ch32v003funのAPIを使用 
  1. #include "ch32v003fun.h"
  2. #include <stdio.h>

  3. // use defines to make more meaningful names for our GPIO pins
  4. #define PIN_1 PD6
  5. #define PIN_3 PA2
  6. #define PIN_5 PC1
  7. #define PIN_6 PC2
  8. #define PIN_7 PC4

  9. int main()
  10. {
  11.     SystemInit();

  12.     // Enable GPIOs
  13.     funGpioInitAll();

  14.     funPinMode(PIN_1, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
  15.     funPinMode(PIN_3, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
  16.     funPinMode(PIN_5, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
  17.     funPinMode(PIN_6, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
  18.     funPinMode(PIN_7, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);

  19.     while (1)
  20.     {
  21.         funDigitalWrite(PIN_1, FUN_HIGH);
  22.         funDigitalWrite(PIN_3, FUN_HIGH);
  23.         funDigitalWrite(PIN_5, FUN_HIGH);
  24.         funDigitalWrite(PIN_6, FUN_HIGH);
  25.         funDigitalWrite(PIN_7, FUN_HIGH);
  26.         Delay_Ms(500);
  27.         funDigitalWrite(PIN_1, FUN_LOW);
  28.         funDigitalWrite(PIN_3, FUN_LOW);
  29.         funDigitalWrite(PIN_5, FUN_LOW);
  30.         funDigitalWrite(PIN_6, FUN_LOW);
  31.         funDigitalWrite(PIN_7, FUN_LOW);
  32.         Delay_Ms(500);
  33.     }
  34. }


レジスタを直接操作
  1. #include "ch32v003fun.h"
  2. #include <stdio.h>

  3. // use defines to make more meaningful names for our GPIO pins
  4. #define PIN_1 PD6
  5. #define PIN_3 PA2
  6. #define PIN_5 PC1
  7. #define PIN_6 PC2
  8. #define PIN_7 PC4

  9. int main()
  10. {
  11.     SystemInit();

  12.     // Enable GPIOD
  13.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOA;
  14.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOC;
  15.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;

  16.     // PA1 output
  17.     // GPIOA->CFGLR &= ~(0xf << (4 * 1));
  18.     // GPIOA->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 1);
  19.     // PA2 output
  20.     GPIOA->CFGLR &= ~(0xf << (4 * 2));
  21.     GPIOA->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 2);
  22.     // PC1 output
  23.     GPIOC->CFGLR &= ~(0xf << (4 * 1));
  24.     GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 1);
  25.     // PC2 output
  26.     GPIOC->CFGLR &= ~(0xf << (4 * 2));
  27.     GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 2);
  28.     // PC4 output
  29.     GPIOC->CFGLR &= ~(0xf << (4 * 4));
  30.     GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 4);
  31.     // PD6 output
  32.     GPIOD->CFGLR &= ~(0xf << (4 * 6));
  33.     GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * 6);
  34.     // ポートが共有されている場合は、片方のみ有効にする。(PD6,PA1) (PD1,PD5,PD4)
  35.     // 2つのポートを両方出力にして、"0","1"をそろえずに出力するとショート(動作しない)
  36.     
  37.     while (1)
  38.     {
  39.         GPIOD->OUTDR &= ~(1 << 6); // PD6 LOW
  40.         GPIOA->OUTDR &= ~(1 << 2); // PA2 LOW
  41.         GPIOC->OUTDR &= ~(1 << 1); // PC1 LOW
  42.         GPIOC->OUTDR &= ~(1 << 2); // PC2 LOW
  43.         GPIOC->OUTDR &= ~(1 << 4); // PC4 LOW
  44.         Delay_Ms(100);
  45.         GPIOD->OUTDR |= (1 << 6); // PD6 HIGH
  46.         GPIOA->OUTDR |= (1 << 2); // PA2 HIGH
  47.         GPIOC->OUTDR |= (1 << 1); // PC1 HIGH
  48.         GPIOC->OUTDR |= (1 << 2); // PC2 HIGH
  49.         GPIOC->OUTDR |= (1 << 4); // PC4 HIGH
  50.         Delay_Ms(500);
  51.     }
  52. }



これでもOKです
 
  1.   while (1)
  2.   {
  3.     GPIOD->BSHR = (1 << (6 + 16)); // PD6 LOW
  4.     GPIOA->BSHR = (1 << (2 + 16)); // PA2 LOW
  5.     GPIOC->BSHR = (1 << (1 + 16)); // PC1 LOW
  6.     GPIOC->BSHR = (1 << (2 + 16)); // PC2 LOW
  7.     GPIOC->BSHR = (1 << (4 + 16)); // PC4 LOW
  8.     // GPIOC->BSHR = (1 << (1 + 16)) | (1 << (2 + 16)) | (1 << (4 + 16));でもOK
  9.     Delay_Ms(500);
  10.     GPIOD->BSHR = (1 << (6)); // PD6 HIGH
  11.     GPIOA->BSHR = (1 << (2)); // PA2 HIGH
  12.     GPIOC->BSHR = (1 << (1)); // PC1 HIGH
  13.     GPIOC->BSHR = (1 << (2)); // PC2 HIGH
  14.     GPIOC->BSHR = (1 << (4)); // PC4 HIGH
  15.     Delay_Ms(500);
  16.   }

参考URL

CH32V003J4M6でprintfデバッグ

2024-12-27 08:31:16 | ch32v003
8pinのRISC-VマイコンCH32V003J4M6でuartを使用いprintfを使おうとするとプログラミング端子とuartのTX端子が同じため、一度プログラムを書き込むと次回からプログラムの書き込みができなくなってしまいます。(再度書き込む方法はあるがひと手間かかる)
uartのTX端子を変更することで両方の機能を有効にすることができました。
1pin <- PD6 <- TX
リストを載せておきます。

funconfig.h
 
  1. #ifndef _FUNCONFIG_H
  2. #define _FUNCONFIG_H

  3. #define CH32V003 1
  4. #define FUNCONF_USE_UARTPRINTF 1
  5. // #define FUNCONF_USE_DEBUGPRINTF 1
  6. #endif


main.c
 
  1. #include "ch32v003fun.h"
  2. #include <stdio.h>

  3. int main(void)
  4. {
  5.     int loop = 0;
  6.     SystemInit();

  7.     RCC->APB2PCENR |= RCC_APB2Periph_AFIO; // remap enable
  8.     // Push-Pull, 10MHz Output, GPIO D6, with AutoFunction
  9.     GPIOD->CFGLR &= ~(0xf << (4 * 6));
  10.     GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF) << (4 * 6);
  11.     AFIO->PCFR1 &= ~(1 << 2 | 1 << 21); // remap
  12.     AFIO->PCFR1 |= 1 << 21;
  13.     // GPIO D5 clear
  14.     GPIOD->CFGLR &= ~(0xf << (4 * 5));

  15.     printf("start\n\r");
  16.     while (1)
  17.     {
  18.         Delay_Ms(1000);
  19.         printf("loop %d \n\r", loop);
  20.         loop++;
  21.     }
  22. }

参考URL

40円マイコンch32v003の開発環境を整える

2024-12-27 08:11:07 | ch32v003
risc-vマイコンch32v003の開発環境を構築したのでまとめておきます。
  1. vscodegitをインストール
  2. vscodeの拡張機能からplatformioをインストール
  3. platformioのMiscellaneousメニューからPlatformIO Core CLIをクリック
  4. CLIのプロンプトに
    > pio pkg install -g -p https://github.com/Community-PIO-CH32V/platform-ch32v.git
    と入力すると開発環境一式がインストールされます。
プログラムの書き込みにはWCH-Linkが必要です。

参考URL