• 【CH559l单片机入门篇】通过串口打印内部ID信息


    【CH559l单片机入门篇】通过串口打印内部ID信息


    知识内容摘要

    • 调整工程项目结构(重点
    • 使用内部或者外部晶振作为时钟源代码要点分别说明。
    调整工程项目结构

    从官网下载下来的资源中的参考代码,是一个将外设资源整合到一块的目录,主要是整理和调整头文件(.h)和源文件(.C)中的相关内容,让其更合理,方便更好的调用。

    • 资源架构
      在这里插入图片描述

    • 添加所需的源文件到工程项目里面来
      在这里插入图片描述

    • 将源文件(.C)加载进来编译是没有什么问题的,忽略没有调用的函数报警信息
      在这里插入图片描述

    • 修改CH559时钟选择和配置函数:CfgFsys( )

    原来的代码如下,这样子定义,对于使用外部晶振的配置选项很不合理,稍不注意就掉坑里面去了,如果只是修改相关宏来启用外部晶振,那么程序烧录后,串口打印回事乱码。时钟配置函数内部的宏定义并不健全。

    /*******************************************************************************
    * Function Name  : CfgFsys( )
    * Description    : CH559时钟选择和配置函数,默认使用内部晶振12MHz,如果定义了FREQ_SYS可以
                       根据PLL_CFG和CLOCK_CFG配置得到,公式如下:
                       Fsys = (Fosc * ( PLL_CFG & MASK_PLL_MULT ))/(CLOCK_CFG & MASK_SYS_CK_DIV);
                       具体时钟需要自己配置
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/ 
    void CfgFsys( )  
    {
    #if OSC_EN_XT
    	SAFE_MOD = 0x55;                                                           //开启安全模式
        SAFE_MOD = 0xAA;                                                 
    	CLOCK_CFG |= bOSC_EN_XT;                                                   //使能外部晶振
        mDelaymS(10);
    	SAFE_MOD = 0x55;                                                           //开启安全模式
        SAFE_MOD = 0xAA;   
    	CLOCK_CFG &= ~bOSC_EN_INT;
    	SAFE_MOD = 0x00; 
    #endif 
    
    	SAFE_MOD = 0x55;                                                           //开启安全模式
        SAFE_MOD = 0xAA;                                                 
    // 	CLOCK_CFG &= ~MASK_SYS_CK_DIV;
    //  CLOCK_CFG |= 6;                                                            //配置系统时钟48MHz
    //  CLOCK_CFG |= 8;                                                            //配置系统时钟36MHz
    //  CLOCK_CFG |= 10;                                                           //配置系统时钟28.8MHz
    //  CLOCK_CFG |= 12;                                                           //配置系统时钟24MHz
    //  CLOCK_CFG |= 16;                                                           //配置系统时钟18MHz  
    /*56MHz
    // 	CLOCK_CFG &= ~MASK_SYS_CK_DIV;
    //  CLOCK_CFG |= 6;                                                            //配置系统时钟56MHz    
        PLL_CFG = 0xFC;
    */	
        SAFE_MOD = 0xFF;                                                           //关闭安全模式  
    //  如果修改主频,要同时修改FREQ_SYS,否则会造成延时函数不准
    
    }
    

    将原来的#if……#endif修改成:#if……#else……#endif修改如下:

    void	CfgFsys( )  
    {
    #if OSC_EN_XT
    	SAFE_MOD = 0x55; //开启安全模式
        SAFE_MOD = 0xAA;                                                 
    	CLOCK_CFG |= bOSC_EN_XT;   //使能外部晶振
    //    mDelaymS(10);
    //	SAFE_MOD = 0x55;//开启安全模式
    //    SAFE_MOD = 0xAA;   
    	CLOCK_CFG &= ~bOSC_EN_INT;//关闭内部晶振
    	SAFE_MOD = 0x00; 
    #else
    	SAFE_MOD = 0x55;                                                           //开启安全模式
        SAFE_MOD = 0xAA; 	
     	CLOCK_CFG &= ~MASK_SYS_CK_DIV;
    //  CLOCK_CFG |= 6;//配置系统时钟48MHz
    //  CLOCK_CFG |= 8; //配置系统时钟36MHz
    //  CLOCK_CFG |= 10; //配置系统时钟28.8MHz
      CLOCK_CFG |= 12; //配置系统时钟24MHz
    //  CLOCK_CFG |= 16; //配置系统时钟18MHz  
    /*56MHz
    // 	CLOCK_CFG &= ~MASK_SYS_CK_DIV;
    //  CLOCK_CFG |= 6;                                                            //配置系统时钟56MHz    
        PLL_CFG = 0xFC;
    */	
        SAFE_MOD = 0xff;                                                           //关闭安全模式  
    //  如果修改主频,要同时修改FREQ_SYS,否则会造成延时函数不准
    #endif 
    }
    

    配置时钟频率和波特率

    #define	 FREQ_SYS	24000000	 //系统主频24MHz
    #define  OSC_EN_XT 1 //使能外部晶振,如果使用内部晶振就是:0
    
    #ifndef  BUAD
    #define  BUAD    57600
    #endif
    

    设置内部时钟频率时需要调整时钟配置函数中相对应的语句

    //  CLOCK_CFG |= 6;//配置系统时钟48MHz
    //  CLOCK_CFG |= 8; //配置系统时钟36MHz
    //  CLOCK_CFG |= 10; //配置系统时钟28.8MHz
      CLOCK_CFG |= 12; //配置系统时钟24MHz
    //  CLOCK_CFG |= 16; //配置系统时钟18MHz  
    /*56MHz
    // 	CLOCK_CFG &= ~MASK_SYS_CK_DIV;
    //  CLOCK_CFG |= 6;                                                            //配置系统时钟56MHz    
        PLL_CFG = 0xFC;
    */	
    

    GETID.C代码

    
    /********************************** (C) COPYRIGHT *******************************
    * File Name          :GETID.C
    * Author             : WCH
    * Version            : V1.3
    * Date               : 2016/06/24
    * Description        :获取芯片唯一ID号和ID号校验功能
                          ROM_CHIP_ID_ADDR起始4字节ID号,接下来2字节是ID和校验
    *******************************************************************************/
    
    #include "..\DEBUG.C"  //调试信息打印
    #include "..\DEBUG.H"
    //#include 
    #include 
    
    #pragma NOAREGS
    
    #define ROM_CHIP_ID_ADDR 0x20
    
    /*******************************************************************************
    * Function Name  : GetChipID(void)
    * Description    : 获取ID号和ID号和校验
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    UINT32 GetChipID( void )
    {
    	UINT8	d0, d1;
    	UINT16	xl, xh;
    	E_DIS = 1;                                                                  //避免进入中断
    	d0 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 0 );
    	d1 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 1 );                                    //ID号低字
    	xl = ( d1 << 8 ) | d0;
    	d0 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 2 );
    	d1 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 3 );                                    //ID号高字
    	xh = ( d1 << 8 ) | d0;
    	d0 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 6 );
    	d1 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 7 );                                    //ID校验和
    	E_DIS = 0;
    	if ( (UINT16)( xl + xh ) != (UINT16)( ( d1 << 8 ) | d0 ) ) return( 0xFFFFFFFF );//校验ID号
    	return( ( (UINT32)xh << 16 ) | xl );
    }
    
    /*******************************************************************************
    * Function Name  : CopyChipID(void)
    * Description    : 获取ID号,因为Flash双字节访问,低字节在前,使用时要注意
    * Input          : PUINT32X buf
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void CopyChipID( PUINT32X buf )
    {
    	E_DIS = 1;
    	*( (PUINT16X)buf + 0 ) = *(const unsigned short code *)( ROM_CHIP_ID_ADDR + 0 );
    	*( (PUINT16X)buf + 1 ) = *(const unsigned short code *)( ROM_CHIP_ID_ADDR + 2 );
    	E_DIS = 0;
    }
    
    void main()
    {
        UINT32 x;
      CfgFsys( );    
      mDelaymS(5);                                                               //等待外部晶振稳定
        
        mInitSTDIO( );                                                             //串口0,可以用于调试
        printf( "Start @ChipID=%02X\n", (UINT16)CHIP_ID );	
        printf("ID+CRC:%lx\n",GetChipID());
        CopyChipID(&x);
        printf("ID:%lx\n",x);	
        while(1){
    		    printf( "Start @ChipID=%02X\n", (UINT16)CHIP_ID );	
        printf("ID+CRC:%lx\n",GetChipID());
        CopyChipID(&x);
        printf("ID:%lx\n",x);	
    		mDelaymS(1000);
    		}
    }
    
    • 串口打印信息:波特率:57600
      在这里插入图片描述

    示例工程源码

    链接:https://pan.baidu.com/s/17oHyczjuOy1b3Z2kMVa46Q 
    提取码:01cn
    
  • 相关阅读:
    第三章 组合逻辑电路
    物联网助力智慧农业,农民也能成为科技工作者
    spring cloud 官方文档如何阅读
    【MySQL】索引
    51基于matlab模拟退火算法矩形排样
    自然语言处理从零到入门 自然语言理解NLU
    day4作业
    QT - 模型与视图
    耳机类型分类
    基于GoFrame+Vue+ElementUI的电商后台管理系统
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/127098774