⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 str710系列的hdlc协议的通信
💻 C
字号:
/******************** (C) COPYRIGHT 2006 STMicroelectronics ********************
* File Name          : main.c
* Author             : jrl
* Date First Issued  : 4/1/05
* Description        : HDLC example software
********************************************************************************/


#include "71x_lib.h"
#include "timers.h"

#include <stdarg.h>
#include <stdio.h>

//for UART
#define Use_UART0
#define UARTX UART0
#define UART0_Rx_Pin (0x0001<<8)   // TQFP 64: pin N?63 , TQFP 144 pin N?143
#define UART0_Tx_Pin (0x0001<<9)   // TQFP 64: pin N?64 , TQFP 144 pin N?144
#define UARTX_Rx_Pin UART0_Rx_Pin
#define UARTX_Tx_Pin UART0_Tx_Pin

void UART_Printf(const char *format, ...)
{
	static char buf[256];
	va_list args;
	va_start(args, format);
	vsprintf(buf, format, args);
	va_end(args);
	
	// Configure the GPIO pins
	GPIO_Config(GPIO0, UARTX_Tx_Pin, GPIO_AF_PP);
	GPIO_Config(GPIO0, UARTX_Rx_Pin, GPIO_IN_TRI_CMOS);

	// Configure the UART X
	UART_OnOffConfig(UARTX, ENABLE);		// Turn UARTX on
	UART_FifoConfig(UARTX, DISABLE);		// Disable FIFOs
	UART_FifoReset(UARTX, UART_RxFIFO);		// Reset the UART_RxFIFO
	UART_FifoReset(UARTX, UART_TxFIFO);		// Reset the UART_TxFIFO
	UART_LoopBackConfig(UARTX, DISABLE);	// Disable Loop Back
		/* Configure the UARTX as following:
			- Baudrate = 57600 Bps
			- No parity
			- 8 data bits
			- 1 stop bit */
	UART_Config(UARTX, 57600, UART_NO_PARITY, UART_1_StopBits, UARTM_8D);
	UART_RxConfig(UARTX, ENABLE);          // Enable Rx

	UART_StringSend(UARTX, (u8 *)buf);
}
/*******************************************************************************
* Function Name  : clks_init
* Description    : Initialize device clocks
* Input          : None
* Return         : None
*******************************************************************************/

void CLKS_Init(void)
{
  
  	RCCU_MCLKConfig(RCCU_DEFAULT);					// Configure MCLK = RCLK = 48M
	RCCU_FCLKConfig(RCCU_RCLK_4);					// Configure FCLK = RCLK / 4 = 12M
	RCCU_PCLKConfig(RCCU_RCLK_2);					// Configure PCLK = RCLK / 2
	
	RCCU_Div2Config (ENABLE);  		  //OSC input is divide by 2
	RCCU_PLL1Config(RCCU_Mul_12, RCCU_Div_2);		// Configure the PLL1 ( * 12 , / 2 )
	while(RCCU_FlagStatus(RCCU_PLL1_LOCK) == RESET);// Wait PLL to lock
	RCCU_RCLKSourceConfig(RCCU_PLL1_Output);
	
	RCCU_PLL2Config(0x01, RCCU_Div_2); //configure PLL2 for HDLC clock

        //setup timer2 (P0.13) for external HDLC clock connected to HCLK
//	TIM_ClockSourceConfig (TIM2, TIM_INTERNAL );
//	TIM_PrescalerConfig (TIM2,10 ); //24Mhz/77 = 312KHz
//	TIM_PWMOModeConfig (TIM2,0x7,TIM_LOW,0x7,TIM_HIGH); //square wave output
//	TIM_CounterConfig(TIM2, TIM_START);
}
 
void IO_Init(void)
{
	// setup GPIO 1.13 (HDLC HCLK pin) as input Tristate CMOS
	 GPIO_Config (GPIO1, 0x2000, GPIO_IN_TRI_CMOS);

	// setup GPIO 1.14 (HDLC HRXD pin) as input Tristate CMOS
	GPIO_Config (GPIO1, 0x4000, GPIO_IN_TRI_CMOS);

	// setup GPIO 1.15 (HDLC HTXD pin) as output alternate Push-pull
	GPIO_Config (GPIO1, 0x8000, GPIO_AF_PP);

    // setup GPIO 0.13 (T2 OCMPA pin) as output alternate Push-pull
	//GPIO_Config (GPIO0, 0x2000, GPIO_AF_PP);
} 

/*******************************************************************************
* Function Name  : EIC_Config
* Description    : Enable the HDLC IRQChannel
* Input          : None
* Return         : None
*******************************************************************************/
void EIC_Config()
{
	EIC_Init();
	//EIC_FIQConfig(DISABLE);
	
	HDLC_ClearInterruptStatus(0xFF);
	EIC_IRQChannelConfig(XTI_IRQChannel, ENABLE);   //changed本来是HCLD的终端编号
	EIC_IRQChannelPriorityConfig(XTI_IRQChannel, 10);
	EIC_IRQConfig(ENABLE);
}

void HDLC_XmitConfig(HDLC_TCKS Clock_Src, u16 Div, u8 Pre_Len, u8 Post_Len, HDLC_TCOD_ENC TCod, u16 Flag)
{
	HDLC_XmitClockSourceConfig(Clock_Src); 
	Div = Div & 0x0FFF;
	HDLC_XmitBaudrateConfig(Div-1);	     
	HDLC_PreambleSequenceConfig(0xAAAA);
	HDLC_PostambleSequenceConfig(0xAAAA);
	
	Flag = Flag | TCod ;
	
	if (Pre_Len > 0)
	{
		Pre_Len = Pre_Len - 1;
		Flag |= HDLC_PREE;
		Flag = Flag | ((Pre_Len<<4) & HDLC_NPREB_mask);
	}
	if (Post_Len > 0)
	{
		Post_Len = Post_Len -1;
		Flag |= HDLC_POSE;
		Flag = Flag | (Post_Len & HDLC_NPOSB_mask);			
	}
	
	HDLC_Init_Xmit(Flag);
}

void HDLC_RecvConfig(HDLC_RCLKS Clock_Src, u8 Div, HDLC_TCOD_ENC TCod, u16 Flag, u32 PAdrress, u32 PMask)
{
	u16 PAddressH = (PAdrress & 0xFFFF0000) >> 16;
	u16 PAddressL = (PAdrress & 0x0000FFFF);
	u16 PMaskH = (PMask & 0xFFFF0000) >> 16;
	u16 PMaskL = (PMask & 0x0000FFFF);
	HDLC_PAddressConfigH(PAddressH);
	HDLC_PAddressMaskConfigH(PMaskH);
	HDLC_PAddressConfigL(PAddressL);
	HDLC_PAddressMaskConfigL(PMaskL);

	//Set up Receiver
	HDLC_Init_Recv(HDLC_PAE | TCod | HDLC_DPLLE | Flag);

	HDLC_RecvClockSourceConfig(Clock_Src);
	HDLC_RecvClockPrescalerConfig(Div-1);       //APB1 PCLK1/3 = 4M
	*(u32*)HDLC_RECEIVEBUFFER_BASE_LO = 0; //clear so a frame reject prints 0 data.
}

u8 RecvBuffer[256];
//u8 XmitBuffer[]={0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
u8 XmitBuffer[] = "aAAAAAbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyZZZZZ"; 		 
u16 xmitRemain = 0, totalRecv = 0;
u8 *xmitAddr, *RecvAddr;
// for test
u16 frameSend = 0, XmitCount=0;
u16 frameRecv = 0, RecvCount=0;
//******************************************************************************
int Main(void)
{
	//u32 byteSend = 0;
	u16 RFlag = 0;	
	u16 IntMask = 0;
	u32 i = 0;
	u32 j = 0;
	#ifdef DEBUG
	  debug();
	#endif
	
                                 //先前用中断实现拉底WENB
/////////
  EIC_Config();
// Initialize the XTI 
  XTI_Init();
  // Set Line 3 edge 
  XTI_LineModeConfig(XTI_Line9, XTI_RisingEdge);//对应P0.1口的中断
  // Enable the External interrupts on line 3 
  XTI_LineConfig(XTI_Line9, ENABLE);
  // Set the XTI mode 
  XTI_ModeConfig(XTI_Interrupt, ENABLE);
  
  //Configure the P0.1
  //GPIO_Config(GPIO0,0x0001<<0x01,GPIO_OUT_PP); 
  LCD_Test();
  GPIO_Config(GPIO1, 0x1, GPIO_OUT_PP);
	while(1)
	{
		for(i=0; i<0xffff; i++)
			;
		GPIO_WordWrite(GPIO1, GPIO_WordRead(GPIO1) ^ 0x1);
	}
    //PCU->PWRCR |= PCU_WREN_Mask;	// Unlock Power Control Register
	//PCU->PWRCR |= PCU_PWRDWN_Mask;// Set the Power Down flag
    //+
    //__asm {NOP};  

///////////////
    /*    

      PCU->PWRCR |= PCU_WREN_Mask;	// Unlock Power Control Register
	  PCU->PWRCR |= PCU_PWRDWN_Mask;// Set the Power Down flag
	  __asm {NOP};
	  while(1);
    */




	//LED speed up
	//RCCU_PLL1Config(RCCU_Mul_12, RCCU_Div_4);
	//while(RCCU_FlagStatus(RCCU_PLL1_LOCK) == RESET);// Wait PLL to lock
	//RCCU_RCLKSourceConfig(RCCU_PLL1_Output);
	
//GPIO_Config(GPIO1, 0x1, GPIO_OUT_PP);
//GPIO_Config(GPIO0, 0x2, GPIO_OUT_PP); 
	//GPIO_Config(GPIO0, 0x8000, GPIO_INOUT_WP);
	
	//while(1)
	//{
		//for(i=0; i<0xffff; i++);
		//GPIO_WordWrite(GPIO1, GPIO_WordRead(GPIO1) ^ 0x1);
		//for(i=0; i<0xffff; i++);
		//GPIO_WordWrite(GPIO1, GPIO_WordRead(GPIO1) ^ 0x1);
	//}
	
	//PCU_LPMEnter(PCU_STANDBY);
	
	
	/*
	CLKS_Init();
	HDLC_Init();	//set all HDLC regs to 0
	IO_Init();      //GPIO set to HDLC AF
	EIC_Config();

	//IntMask = HDLC_TMCM;
	//IntMask = HDLC_TMCM | HDLC_TBEM | HDLC_TDUM;
	IntMask = HDLC_TMCM | HDLC_TBEM | HDLC_TDUM;
	IntMask = IntMask | HDLC_RBFM | HDLC_RFOM | HDLC_RMCM | HDLC_RMEM;
	HDLC_InterruptMaskBit(IntMask, ENABLE);

	HDLC_XmitConfig(HDLC_CKSource, 48, 0, 0, HDLC_FM0, 0);

	RFlag = HDLC_RCME;
	HDLC_RecvConfig(HDLC_CK, 6, HDLC_R_FM0, RFlag, 0x00000061, 0x000000FF);

	HDLC_Xmit_Control(DISABLE);
	//HDLC_Xmit_Frame (XmitBuffer,6);
	
	//UART_Printf("byteRecv= %d; byteSend = %d \n",byteRecv, byteSend); //print received buffer
	//while(1)
	//{
	//	if (HDLC_ReadPCRStatus(HDLC_TEN)==1)
	//		continue;
	RecvAddr = RecvBuffer;
	xmitRemain = 200;
	xmitAddr = XmitBuffer;
	HDLC_Xmit_Frame (&xmitAddr, &xmitRemain, 0, 1);
	frameSend++;
	//}*/
	//while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -