一、开发板简介
图上面是沁恒CH573F的官方最小系统板,直接找沁恒申请CH573F/CH571F样品大概率会拿到这块板子,板子上有USB-C口、电源开关、两个按键和所有IO口引出插针。
1、USB-C口:可用于下载程序和验证CH573F的USB通信功能
2、按键:下载按键、复位按键
3、LED0、LED1:独立的LED灯,可用杜邦线连接到任意IO口
板子下面是沁恒提供的仿真器WCH-LINK,可用于沁恒RISC-V内核和任意品牌ARM-M内核MCU的仿真调试。
WCH-LINK具体资料请看:https://download.csdn.net/download/m0_46513394/16679823
沁恒的MCU既可以通过芯片的USB口或者串口配合沁恒提供的上位机ISP软件直接下载程序,也可以通过仿真器下载程序。
二、开发环境:MounRiver Studio
MounRiver Studio是一款面向RISC-V内核单片机的集成开发环境。为用户提供专业嵌入式项目所需的开发、调试环境,烧录工具及完善的项目管理功能。代码编辑,工程模板导入、导出,单步调试,代码烧录,IDE在线、离线升级…MounRiver Studio为单片机开发提供了完整的解决方案。
MounRiver Studio的详细介绍可以看:https://blog.csdn.net/qq_36353650/article/details/108321298
MounRiver下载地址:
三、跑定时器点灯例程
例程代码官网可下载,见:CH573EVT\EVT\EXAM\TMR,演示包含PB15闪灯
/********************************** (C) COPYRIGHT *******************************
* File Name : Main.c
* Author : WCH
* Version : V1.0
* Date : 2020/08/06
* Description : 定时器例子
*******************************************************************************/
#include "CH57x_common.h"
__attribute__((aligned(4))) UINT32 CapBuf[100];
UINT8V capFlag = 0;
void DebugInit( void )
{
GPIOA_SetBits( GPIO_Pin_9 );
GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
UART1_DefInit();
}
int main()
{
UINT8 i;
SetSysClock( CLK_SOURCE_PLL_60MHz );
/* 配置串口调试 */
DebugInit();
PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );
#if 1 /* 定时器0,设定100ms定时器进行IO口闪灯, PB15-LED */
GPIOB_SetBits( GPIO_Pin_15 );
GPIOB_ModeCfg( GPIO_Pin_15, GPIO_ModeOut_PP_5mA );
TMR0_TimerInit( FREQ_SYS / 10 ); // 设置定时时间 100ms
TMR0_ITCfg( ENABLE, TMR0_3_IT_CYC_END ); // 开启中断
PFIC_EnableIRQ( TMR0_IRQn );
#endif
#if 1 /* 定时器3,PWM输出 */
GPIOB_ResetBits( GPIO_Pin_22 ); // 配置PWM口 PB22
GPIOB_ModeCfg( GPIO_Pin_22, GPIO_ModeOut_PP_5mA );
TMR3_PWMInit( High_Level, PWM_Times_1 );
TMR3_PWMCycleCfg( 6000 ); // 周期 100us
TMR3_PWMActDataWidth( 3000 ); // 占空比 50%
#endif
#if 1 /* 定时器1,CAP捕捉, */
PWR_UnitModCfg( DISABLE, UNIT_SYS_LSE ); // 注意此引脚是LSE晶振引脚,要保证关闭才能使用其他功能
GPIOA_ResetBits( GPIO_Pin_10 ); // 配置PWM口 PA10
GPIOA_ModeCfg( GPIO_Pin_10, GPIO_ModeIN_PU );
TMR1_CapInit( Edge_To_Edge );
TMR1_CAPTimeoutCfg( 0xFFFFFFFF ); // 设置捕捉超时时间
TMR1_DMACfg( ENABLE, ( UINT16 ) ( UINT32 ) &CapBuf[0], ( UINT16 ) ( UINT32 ) &CapBuf[100], Mode_Single );
TMR1_ITCfg( ENABLE, TMR1_2_IT_DMA_END ); // 开启DMA完成中断
PFIC_EnableIRQ( TMR1_IRQn );
while( capFlag == 0 )
;
capFlag = 0;
for ( i = 0; i < 100; i++ )
{
printf( "%08ld ", CapBuf[i] & 0x1ffffff ); // bit26 最高位表示 高电平还是低电平
}
printf( "\n" );
#endif
#if 1 /* 定时器2,计数器, */
GPIOB_ModeCfg( GPIO_Pin_11, GPIO_ModeIN_PD );
GPIOPinRemap( ENABLE, RB_PIN_TMR2 );
TMR2_EXTSingleCounterInit( FallEdge_To_FallEdge );
TMR2_CountOverflowCfg( 1000 ); // 设置计数上限1000
/* 开启计数溢出中断,计慢1000个周期进入中断 */
TMR2_ClearITFlag( TMR0_3_IT_CYC_END );
PFIC_EnableIRQ(TMR2_IRQn);
TMR2_ITCfg( ENABLE, TMR0_3_IT_CYC_END);
do
{
/* 1s打印一次当前计数值,如果送入脉冲频率较高,可能很快计数溢出,需要按实际情况修改 */
mDelaymS(1000);
printf("=%ld \n", TMR2_GetCurrentCount());
}while(1);
#endif
while( 1 )
;
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR0_IRQHandler( void ) // TMR0 定时中断
{
if ( TMR0_GetITFlag( TMR0_3_IT_CYC_END ) )
{
TMR0_ClearITFlag( TMR0_3_IT_CYC_END ); // 清除中断标志
GPIOB_InverseBits( GPIO_Pin_15 );
}
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR1_IRQHandler( void ) // TMR1 定时中断
{
if ( TMR1_GetITFlag( TMR1_2_IT_DMA_END ) )
{
TMR1_ITCfg( DISABLE, TMR1_2_IT_DMA_END ); // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。
TMR1_ClearITFlag( TMR1_2_IT_DMA_END ); // 清除中断标志
capFlag = 1;
printf( "*\n" );
}
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR2_IRQHandler(void)
{
if( TMR2_GetITFlag(TMR0_3_IT_CYC_END) )
{
TMR2_ClearITFlag( TMR0_3_IT_CYC_END );
/* 计数器计满,硬件自动清零,重新开始计数 */
/* 用户可自行添加需要的处理 */
}
}
三、将程序下载到CH573F
1、使用CH573F的USB口或串口配合官网提供的ISP软件下载,具体操作可见开发包中的:CH573EVT使用说明.PDF
编译生成HEX后用以下软件下载:
注意步骤:连接板子USB到电脑,按住板子下载按键,打开开关,ISP软件会识别到USB设备,用户程序文件选择对应HEX,点下载,软件会提示下载成功。
2、也可以通过WCH-LINK连接芯片SWD调试脚下载,和ARM-M方式一样。
下载成功后将PB15连接到LED,效果如下。