沁恒微USB蓝牙单片机CH573F初步熟悉

一、开发板简介


沁恒微USB蓝牙单片机CH573F初步熟悉

图上面是沁恒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蓝牙单片机CH573F初步熟悉
注意步骤:连接板子USB到电脑,按住板子下载按键,打开开关,ISP软件会识别到USB设备,用户程序文件选择对应HEX,点下载,软件会提示下载成功。

2、也可以通过WCH-LINK连接芯片SWD调试脚下载,和ARM-M方式一样。

下载成功后将PB15连接到LED,效果如下。
沁恒微USB蓝牙单片机CH573F初步熟悉

上一篇:2021-05-28_蓝桥杯嵌入式拓展板STM32G431--数码管


下一篇:蓝桥杯嵌入式第12届模拟赛