CH559l单片机入门篇通过串口打印内部ID信息
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CH559l单片机入门篇通过串口打印内部ID信息相关的知识,希望对你有一定的参考价值。
【CH559l单片机入门篇】通过串口打印内部ID信息
- ✨本示例基于Keil开发环境下开发。
- 相关篇《【硬件开源电路】CH559L开发板和CH55x_DAP-Link二合一开发板分享》
- 相关的CH559L参考案例在官网有下载:
https://www.wch.cn/download/CH559EVT_ZIP.html
知识内容摘要
- 调整工程项目结构(
重点
)- 使用内部或者外部晶振作为时钟源代码要点分别说明。
调整工程项目结构
从官网下载下来的资源中的参考代码,是一个将外设资源整合到一块的目录,主要是整理和调整头文件(.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数据