南京沁恒CH552单片机系列使用教程
第一章 CH552介绍及开发环境搭建
第二章 CH552示例程序编写及下载
第三章 CH552使用代码分析
第四章 基于CH552的USB-HID开发
前言
记录一下开发过程中使用到的代码段。
一、Timer
以Timer0为例,做一个系统内部计时器。
/*初始化*/
mTimer0Clk12DivFsys();//T0定时器时钟设置
mTimer_x_ModInit(0,1);//T0 定时器模式设置:16位定时器
mTimer_x_SetData(0,20000);//T0定时器赋值:20ms
mTimer0RunCTL(1);
ET0 = 1;//t0定时器
/*******************************************************************************
* Function Name : mTimer0Interrupt()
* Description : CH554定时计数器0定时计数器中断处理函数
*******************************************************************************/
void mTimer0Interrupt( void ) interrupt INT_NO_TMR0 //using 1 //timer0中断服务程序,使用寄存器组1
{
if(Timer_Usart1_Switch==1)
{
Timer_Usart1_Count++;
if(Timer_Usart1_Count>=10)
{
Timer_Usart1_Flag=1;
//CH554UART0SendByte(Timer_Usart0_Flag);
Timer_Usart1_Count=0;
Timer_Usart1_Switch=0;
}
}
mTimer_x_SetData(0,20000); //非自动重载方式需重新给TH0和TL0赋值
}
二、UART
Debug.c文件调用的是UART0,printf函数也映射到了UART0;调用UART1,直接添加对应的.UART1.c和UART1.h即可。
1.串口初始化
void UART1Init( )
{
U1SM0 = 0; //UART1选择8位数据位
U1SMOD = 1; //快速模式
U1REN = 1; //使能接收
SBAUD1 = 0 - FREQ_SYS/16/UART1_BUAD;
U1TI = 0;
#if UART1_PINMAP
PIN_FUNC |= bUART1_PIN_X; //映射到P34(R)、P32(T)
#endif
#if UART1_INTERRUPT //开启中断使能
IE_UART1 = 1;
EA = 1;
#endif
}
2.串口接收终中断函数
1.增加定时器,利用超时200ms,完成接收。
/*******************************************************************************
* Function Name : UART1Interrupt(void)
* Description : UART1 中断服务程序
*******************************************************************************/
UINT8 USART1_RecBuff[300]=0;//缓存
UINT8 USART1_NUM=0;//光标
UINT8 USART1_SAT=0;//接收状态
void UART1Interrupt( void ) interrupt INT_NO_UART1 //using 1 //串口1中断服务程序,使用寄存器组1
{
UINT8 dat;
if(U1RI)
{
Timer_Usart1_Count=0;
Timer_Usart1_Switch=1;
dat = SBUF1;
USART1_RecBuff[USART1_NUM++] = dat;
U1RI = 0;
}
}
三、GPIO
以P1.5做输入,P1.6做输出为例。注意端口模式,刚开始P1.5设置了带上拉的模式,导致输入的电阻分压值被钳位。
sbit PW_STA=P1^5;
sbit PW_SW=P1^6;
Port1Cfg(2,5);
Port1Cfg(1,6);
/*******************************************************************************
* Function Name : Port1Cfg()
* Description : 端口1配置
* Input : Mode 0 = 浮空输入,无上拉
1 = 推挽输入输出
2 = 开漏输入输出,无上拉
3 = 类51模式,开漏输入输出,有上拉,内部电路可以加速由低到高的电平爬升
,UINT8 Pin (0-7)
* Output : None
* Return : None
*******************************************************************************/
void Port1Cfg(UINT8 Mode,UINT8 Pin)
{
switch(Mode){
case 0:
P1_MOD_OC = P1_MOD_OC & ~(1<<Pin);
P1_DIR_PU = P1_DIR_PU & ~(1<<Pin);
break;
case 1:
P1_MOD_OC = P1_MOD_OC & ~(1<<Pin);
P1_DIR_PU = P1_DIR_PU | (1<<Pin);
break;
case 2:
P1_MOD_OC = P1_MOD_OC | (1<<Pin);
P1_DIR_PU = P1_DIR_PU & ~(1<<Pin);
break;
case 3:
P1_MOD_OC = P1_MOD_OC | (1<<Pin);
P1_DIR_PU = P1_DIR_PU | (1<<Pin);
break;
default:
break;
}
}
四、PWM
以P3.4(PWM2)输出为例
/*配置引脚*/
P3_MOD_OC &= ~( bPWM2);//设置PWM引脚为推挽输出
P3_DIR_PU |= bPWM2;
/*配置时钟*/
SetPWMClk(30);//PWM时钟配置 ,Fs12ys/256/分频
ForceClearPWMFIFO( ); //强制清除PWM FIFO和COUNT
CancleClearPWMFIFO( ); //取消清除PWM FIFO和COUNT
PWM2OutPolarHighAct( ); //PWM2输出默认高,低有效
SetPWM2Dat(128);//50%占空比 128/256
PWM2OutEnable();//允许PWM2输出
mDelaymS(300);
DisablePWM2Out();//禁止PWM2输出
/*不关闭的话,设置的电路一直导通,增大了功耗,发热严重,通过更改PWM默认的电平应该也可以解决*/
P3_MOD_OC |= bPWM2;
P3_DIR_PU &= ~( bPWM2);
五、WDT看门狗
/*******************************************************************************
* Function Name : CH554WDTModeSelect(UINT8 mode)
* Description : CH554看门狗模式选择
* Input : UINT8 mode
0 timer
1 watchDog
* Output : None
* Return : None
*******************************************************************************/
void CH554WDTModeSelect(UINT8 mode)
{
SAFE_MOD = 0x55;
SAFE_MOD = 0xaa; //进入安全模式
if(mode){
GLOBAL_CFG |= bWDOG_EN; //启动看门狗复位
}
else GLOBAL_CFG &= ~bWDOG_EN; //启动看门狗仅仅作为定时器
SAFE_MOD = 0x00; //退出安全模式
WDOG_COUNT = 0; //看门狗赋初值
}
/*******************************************************************************
* Function Name : CH554WDTFeed(UINT8 tim)
* Description : CH554看门狗定时时间设置
* Input : UINT8 tim 看门狗复位时间设置
00H(6MHz)=2.8s
80H(6MHz)=1.4s
* Output : None
* Return : None
*******************************************************************************/
void CH554WDTFeed(UINT8 tim)
{
WDOG_COUNT = tim; //看门狗计数器赋值
}
/*示例*/
CH554WDTModeSelect(1);//初始化
while(1)
{
CH554WDTFeed(0);
}
总结
文章中提到的相关资料,可从第一章的资料包里提取。
如有表述错误,介绍模糊的地方,欢迎交流指正。