第三章 CH552使用代码分析

南京沁恒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);				
 }

总结

文章中提到的相关资料,可从第一章的资料包里提取
如有表述错误,介绍模糊的地方,欢迎交流指正。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值