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

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 <stdio.h>
#include <string.h>

#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

以上是关于CH559l单片机入门篇通过串口打印内部ID信息的主要内容,如果未能解决你的问题,请参考以下文章

CH559L单片机基于Arduino框架下实现USB CDC虚拟串口打印ADC数据

CH559L单片机串口下载程序说明

CH559L单片机常用外设功能-串口介绍

CH559L单片机CDC虚拟串口下数据环路测试案例

CH559单片机 USB CDC虚拟串口收发回环测试+调试信息输出改进版

CH559单片机 USB CDC虚拟串口调试信息输出案例