ch32v003funを用いたLチカのサンプル。(PWMで点滅)(2023.7.23)
[参考資料]はCH32V003RM.PDF
[参考資料]はCH32V003RM.PDF
ファイル一覧
ch32v003fun/examples/blink_pwm/ ├── Makefile ├── blink.c └── funconfig.h
配線図
blink.c
・GPIO可能な6個のピンのうち3ピンを約4Hzで点滅させる(PA1, PA2, PC4 = 1,3,7番ピン)
・コード解説
l.13: PA, PC, タイマー1に電源供給する
l.15-25: PA1(Timer-1, CH2), PA2(Timer-1, CH2N), PC4(Timer-1, CH4)の各ポートをEnableにする
l.35: タイマーの分周値を0x2000(=8192dec)にする
内部クロックが5839[Hz]になる(=48MHz/8192)
l.38: カウンタピリオドを1465decにする
PWM周期が約4[Hz]になる(=5839/1465)
l.81: PA1, PA2のコンペアレジスタを100decにする
PA1(CH2)のPWMのディーティ比が約93%になる(=1.0-100/1465)
PA2(CH2N)はPA1から反転した出力になるためディーティ比は約7%になる
l.82: PC4のコンペアレジスタを732decにする
PC4(CH2)のPWMのディーティ比が約50%になる(=1.0-732/1465)
l.85-89: ダミーコード
TIM1-1-SWEVGRを設定するとwhileループと無関係にPWM発振が継続される。
プログラム中で「待ち(ループ中何もしない)」の記述がわからなかったのでこのように書いた
/* ------------------------------------------------------------
* ch32v003J4M6(8pin)でPWMを用いたLチカを実行するコード
* ------------------------------------------------------------*/
#include "ch32v003fun.h"
#include <stdio.h>
/*
* initialize TIM1 for PWM
*/
void t1pwm_init( void )
{
// Enable GPIOC, GPIOD and TIM1
RCC->APB2PCENR |= RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_TIM1;
// PA1 is T1CH2, 10MHz Output alt func, push-pull
GPIOA->CFGLR &= ~(0xf<<(4*1));
GPIOA->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*1);
// PA2 is T1CH2N, 10MHz Output alt func, push-pull
GPIOA->CFGLR &= ~(0xf<<(4*2));
GPIOA->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*2);
// PC4 is T1CH4, 10MHz Output alt func, push-pull
GPIOC->CFGLR &= ~(0xf<<(4*4));
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*4);
// Reset TIM1 to init all regs
RCC->APB2PRSTR |= RCC_APB2Periph_TIM1;
RCC->APB2PRSTR &= ~RCC_APB2Periph_TIM1;
// CTLR1: default is up, events generated, edge align
// SMCFGR: default clk input is CK_INT
// Prescaler
TIM1->PSC = 0x2000;
// Auto Reload - sets period
TIM1->ATRLR =1465;
// Reload immediately
TIM1->SWEVGR |= TIM_UG;
// Enable CH1 output, positive pol
TIM1->CCER |= TIM_CC2E | TIM_CC2P;
// Enable CH1NE output, positive pol
TIM1->CCER |= TIM_CC2NE | TIM_CC2NP;
// Enable CH4 output, positive pol
TIM1->CCER |= TIM_CC4E | TIM_CC4P;
// CH1 Mode is output, PWM1 (CC1S = 00, OC1M = 110)
TIM1->CHCTLR1 |= TIM_OC2M_2 | TIM_OC2M_1;
// CH1 Mode is output, PWM1 (CC1S = 00, OC1M = 110)
TIM1->CHCTLR1 |= TIM_OC2M_2 | TIM_OC2M_1;
// CH2 Mode is output, PWM1 (CC1S = 00, OC1M = 110)
TIM1->CHCTLR2 |= TIM_OC4M_2 | TIM_OC4M_1;
// Set the Capture Compare Register value to 50% initially
TIM1->CH2CVR = 732;
TIM1->CH4CVR = 732;
// Enable TIM1 outputs
TIM1->BDTR |= TIM_MOE;
// Enable TIM1
TIM1->CTLR1 |= TIM_CEN;
}
int main()
{
//int cnt=0;
SystemInit();
Delay_Ms( 100 );
// init TIM1 for PWM(PC4, pin7 for J4m6)
t1pwm_init();
TIM1->ATRLR =1465;
TIM1->CH2CVR = 100;//PA1, PA2
TIM1->CH4CVR = 732;//PC4
TIM1->SWEVGR |= TIM_UG;//Update event generation bit(automaticallly cleared by hardware)
while(1)
{
printf("delay 5s");
Delay_Ms( 5000 );
}
}
funconfig.h
#ifndef _FUNCONFIG_H #define _FUNCONFIG_H #define CH32V003 1 #endif
Makefile
all : flash TARGET:=blink include ../../ch32v003fun/ch32v003fun.mk flash : cv_flash clean : cv_clean