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

📄 candrv.c

📁 vxWorks下的can总线驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
		can_chan_dev[i].mb11ID = M523X_CAN_MBUF11_ID(IPS_BASE,i);        
		can_chan_dev[i].mb11data0 = M523X_CAN_MBUF11_BYTE0(IPS_BASE,i);     
		can_chan_dev[i].mb11data1 = M523X_CAN_MBUF11_BYTE1(IPS_BASE,i);     
		can_chan_dev[i].mb11data2 = M523X_CAN_MBUF11_BYTE2(IPS_BASE,i);     
		can_chan_dev[i].mb11data3 = M523X_CAN_MBUF11_BYTE3(IPS_BASE,i);     
		can_chan_dev[i].mb11data4 = M523X_CAN_MBUF11_BYTE4(IPS_BASE,i);     
		can_chan_dev[i].mb11data5 = M523X_CAN_MBUF11_BYTE5(IPS_BASE,i);     
		can_chan_dev[i].mb11data6 = M523X_CAN_MBUF11_BYTE6(IPS_BASE,i);     
		can_chan_dev[i].mb11data7 = M523X_CAN_MBUF11_BYTE7(IPS_BASE,i);

		can_chan_dev[i].mb12code = M523X_CAN_MBUF12_CTRL(IPS_BASE,i);      
		can_chan_dev[i].mb12length = M523X_CAN_MBUF12_CTRL(IPS_BASE,i);    
		can_chan_dev[i].mb12timestamp = M523X_CAN_MBUF12_TMSTP(IPS_BASE,i); 
		can_chan_dev[i].mb12ID = M523X_CAN_MBUF12_ID(IPS_BASE,i);        
		can_chan_dev[i].mb12data0 = M523X_CAN_MBUF12_BYTE0(IPS_BASE,i);     
		can_chan_dev[i].mb12data1 = M523X_CAN_MBUF12_BYTE1(IPS_BASE,i);     
		can_chan_dev[i].mb12data2 = M523X_CAN_MBUF12_BYTE2(IPS_BASE,i);     
		can_chan_dev[i].mb12data3 = M523X_CAN_MBUF12_BYTE3(IPS_BASE,i);     
		can_chan_dev[i].mb12data4 = M523X_CAN_MBUF12_BYTE4(IPS_BASE,i);     
		can_chan_dev[i].mb12data5 = M523X_CAN_MBUF12_BYTE5(IPS_BASE,i);     
		can_chan_dev[i].mb12data6 = M523X_CAN_MBUF12_BYTE6(IPS_BASE,i);     
		can_chan_dev[i].mb12data7 = M523X_CAN_MBUF12_BYTE7(IPS_BASE,i);

		can_chan_dev[i].mb13code = M523X_CAN_MBUF13_CTRL(IPS_BASE,i);      
		can_chan_dev[i].mb13length = M523X_CAN_MBUF13_CTRL(IPS_BASE,i);    
		can_chan_dev[i].mb13timestamp = M523X_CAN_MBUF13_TMSTP(IPS_BASE,i); 
		can_chan_dev[i].mb13ID = M523X_CAN_MBUF13_ID(IPS_BASE,i);        
		can_chan_dev[i].mb13data0 = M523X_CAN_MBUF13_BYTE0(IPS_BASE,i);     
		can_chan_dev[i].mb13data1 = M523X_CAN_MBUF13_BYTE1(IPS_BASE,i);     
		can_chan_dev[i].mb13data2 = M523X_CAN_MBUF13_BYTE2(IPS_BASE,i);     
		can_chan_dev[i].mb13data3 = M523X_CAN_MBUF13_BYTE3(IPS_BASE,i);     
		can_chan_dev[i].mb13data4 = M523X_CAN_MBUF13_BYTE4(IPS_BASE,i);     
		can_chan_dev[i].mb13data5 = M523X_CAN_MBUF13_BYTE5(IPS_BASE,i);     
		can_chan_dev[i].mb13data6 = M523X_CAN_MBUF13_BYTE6(IPS_BASE,i);     
		can_chan_dev[i].mb13data7 = M523X_CAN_MBUF13_BYTE7(IPS_BASE,i);

		can_chan_dev[i].mb14code = M523X_CAN_MBUF14_CTRL(IPS_BASE,i);      
		can_chan_dev[i].mb14length = M523X_CAN_MBUF14_CTRL(IPS_BASE,i);    
		can_chan_dev[i].mb14timestamp = M523X_CAN_MBUF14_TMSTP(IPS_BASE,i); 
		can_chan_dev[i].mb14ID = M523X_CAN_MBUF14_ID(IPS_BASE,i);        
		can_chan_dev[i].mb14data0 = M523X_CAN_MBUF14_BYTE0(IPS_BASE,i);     
		can_chan_dev[i].mb14data1 = M523X_CAN_MBUF14_BYTE1(IPS_BASE,i);     
		can_chan_dev[i].mb14data2 = M523X_CAN_MBUF14_BYTE2(IPS_BASE,i);     
		can_chan_dev[i].mb14data3 = M523X_CAN_MBUF14_BYTE3(IPS_BASE,i);     
		can_chan_dev[i].mb14data4 = M523X_CAN_MBUF14_BYTE4(IPS_BASE,i);     
		can_chan_dev[i].mb14data5 = M523X_CAN_MBUF14_BYTE5(IPS_BASE,i);     
		can_chan_dev[i].mb14data6 = M523X_CAN_MBUF14_BYTE6(IPS_BASE,i);     
		can_chan_dev[i].mb14data7 = M523X_CAN_MBUF14_BYTE7(IPS_BASE,i);

		can_chan_dev[i].mb15code = M523X_CAN_MBUF15_CTRL(IPS_BASE,i);      
		can_chan_dev[i].mb15length = M523X_CAN_MBUF15_CTRL(IPS_BASE,i);    
		can_chan_dev[i].mb15timestamp = M523X_CAN_MBUF15_TMSTP(IPS_BASE,i); 
		can_chan_dev[i].mb15ID = M523X_CAN_MBUF15_ID(IPS_BASE,i);        
		can_chan_dev[i].mb15data0 = M523X_CAN_MBUF15_BYTE0(IPS_BASE,i);     
		can_chan_dev[i].mb15data1 = M523X_CAN_MBUF15_BYTE1(IPS_BASE,i);     
		can_chan_dev[i].mb15data2 = M523X_CAN_MBUF15_BYTE2(IPS_BASE,i);     
		can_chan_dev[i].mb15data3 = M523X_CAN_MBUF15_BYTE3(IPS_BASE,i);     
		can_chan_dev[i].mb15data4 = M523X_CAN_MBUF15_BYTE4(IPS_BASE,i);     
		can_chan_dev[i].mb15data5 = M523X_CAN_MBUF15_BYTE5(IPS_BASE,i);     
		can_chan_dev[i].mb15data6 = M523X_CAN_MBUF15_BYTE6(IPS_BASE,i);     
		can_chan_dev[i].mb15data7 = M523X_CAN_MBUF15_BYTE7(IPS_BASE,i);
		
		InitCan(&can_chan_dev[i]);
	}
	

}
/******************************************************************************
*
* InitCan - 初始化Flex_can 在默认状态下
*初始化CAN设备结构寄存器地址,并调用Initcan函数对CAN寄存器进行初始化
*
*返回:无
* 
*参数:无
******************************************************************************/
LOCAL STATUS InitCan(Can_DEV *pcan_chan)
{
	register int i;
	int oldlevel;
	i = 0;

	oldlevel = intLock();
	//打开can,设置FRZ和HALT位,使CAN进入Freeze模式,MB数目为2
	CANDEV_WRITE(pcan_chan->mcr,
		MCR_MENE | MCR_FRZ | MCR_HALT | MCR_SUPV | MCR_MAXMB);

	while((CANDEV_READ(pcan_chan->mcr) & MCR_FRZACK) == 0x00000000) //等待can进入Freeze模式
	{
		i++;
		if(i >= 40000)
		{
			return ERROR;
		}
	}

	/*配置S_CLK的预除因子,时钟源及时间分额数量*/
	CANDEV_WRITE(pcan_chan->ctrl,
		CTRL_PRESDIV | CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG);
    
	/*初始化MB0作为发送缓冲区,MB1作为接收缓冲区*/
    CANDEV_WRITE(pcan_chan->txcode,
		TX_NOTENABLE | DEFAULT_LENGTH);
	CANDEV_WRITE(pcan_chan->rxcode,
		RX_NOTENABLE | DEFAULT_LENGTH);

	/*初始化发送缓冲区及接收缓冲区ID*/
	CANDEV_WRITE(pcan_chan->txID,(pcan_chan->TxID)<<18);
	CANDEV_WRITE(pcan_chan->rxID,(pcan_chan->RxID)<<18);

	/*清除发送缓冲区数据*/
	CANDEV_WRITE(pcan_chan->txdata0,0x00);
	CANDEV_WRITE(pcan_chan->txdata1,0x00);
	CANDEV_WRITE(pcan_chan->txdata2,0x00);
	CANDEV_WRITE(pcan_chan->txdata3,0x00);
	CANDEV_WRITE(pcan_chan->txdata4,0x00);
	CANDEV_WRITE(pcan_chan->txdata5,0x00);
	CANDEV_WRITE(pcan_chan->txdata6,0x00);
	CANDEV_WRITE(pcan_chan->txdata7,0x00);

	/*清除接收缓冲区数据*/
	CANDEV_WRITE(pcan_chan->rxdata0,0x00);
	CANDEV_WRITE(pcan_chan->rxdata1,0x00);
	CANDEV_WRITE(pcan_chan->rxdata2,0x00);
	CANDEV_WRITE(pcan_chan->rxdata3,0x00);
	CANDEV_WRITE(pcan_chan->rxdata4,0x00);
	CANDEV_WRITE(pcan_chan->rxdata5,0x00);
	CANDEV_WRITE(pcan_chan->rxdata6,0x00);
	CANDEV_WRITE(pcan_chan->rxdata7,0x00);

	/*不用的缓冲区2~15全部作为接受缓冲区,并且不使能和清零缓冲区的数据*/
	/*MB2*/
	CANDEV_WRITE(pcan_chan->mb2code,
		TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb2ID,0);
	CANDEV_WRITE(pcan_chan->mb2data0,0x00);
	CANDEV_WRITE(pcan_chan->mb2data1,0x00);
	CANDEV_WRITE(pcan_chan->mb2data2,0x00);
	CANDEV_WRITE(pcan_chan->mb2data3,0x00);
	CANDEV_WRITE(pcan_chan->mb2data4,0x00);
	CANDEV_WRITE(pcan_chan->mb2data5,0x00);
	CANDEV_WRITE(pcan_chan->mb2data6,0x00);
	CANDEV_WRITE(pcan_chan->mb2data7,0x00);

	/*MB3*/
	CANDEV_WRITE(pcan_chan->mb3code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb3ID,0);
	CANDEV_WRITE(pcan_chan->mb3data0,0x00);
	CANDEV_WRITE(pcan_chan->mb3data1,0x00);
	CANDEV_WRITE(pcan_chan->mb3data2,0x00);
	CANDEV_WRITE(pcan_chan->mb3data3,0x00);
	CANDEV_WRITE(pcan_chan->mb3data4,0x00);
	CANDEV_WRITE(pcan_chan->mb3data5,0x00);
	CANDEV_WRITE(pcan_chan->mb3data6,0x00);
	CANDEV_WRITE(pcan_chan->mb3data7,0x00);

	/*MB4*/
	CANDEV_WRITE(pcan_chan->mb4code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb4ID,0);
	CANDEV_WRITE(pcan_chan->mb4data0,0x00);
	CANDEV_WRITE(pcan_chan->mb4data1,0x00);
	CANDEV_WRITE(pcan_chan->mb4data2,0x00);
	CANDEV_WRITE(pcan_chan->mb4data3,0x00);
	CANDEV_WRITE(pcan_chan->mb4data4,0x00);
	CANDEV_WRITE(pcan_chan->mb4data5,0x00);
	CANDEV_WRITE(pcan_chan->mb4data6,0x00);
	CANDEV_WRITE(pcan_chan->mb4data7,0x00);

	/*MB5*/
	CANDEV_WRITE(pcan_chan->mb5code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb5ID,0);
	CANDEV_WRITE(pcan_chan->mb5data0,0x00);
	CANDEV_WRITE(pcan_chan->mb5data1,0x00);
	CANDEV_WRITE(pcan_chan->mb5data2,0x00);
	CANDEV_WRITE(pcan_chan->mb5data3,0x00);
	CANDEV_WRITE(pcan_chan->mb5data4,0x00);
	CANDEV_WRITE(pcan_chan->mb5data5,0x00);
	CANDEV_WRITE(pcan_chan->mb5data6,0x00);
	CANDEV_WRITE(pcan_chan->mb5data7,0x00);

	/*MB8*/
	CANDEV_WRITE(pcan_chan->mb6code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb6ID,0);
	CANDEV_WRITE(pcan_chan->mb6data0,0x00);
	CANDEV_WRITE(pcan_chan->mb6data1,0x00);
	CANDEV_WRITE(pcan_chan->mb6data2,0x00);
	CANDEV_WRITE(pcan_chan->mb6data3,0x00);
	CANDEV_WRITE(pcan_chan->mb6data4,0x00);
	CANDEV_WRITE(pcan_chan->mb6data5,0x00);
	CANDEV_WRITE(pcan_chan->mb6data6,0x00);
	CANDEV_WRITE(pcan_chan->mb6data7,0x00);

	/*MB7*/
	CANDEV_WRITE(pcan_chan->mb7code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb7ID,0);
	CANDEV_WRITE(pcan_chan->mb7data0,0x00);
	CANDEV_WRITE(pcan_chan->mb7data1,0x00);
	CANDEV_WRITE(pcan_chan->mb7data2,0x00);
	CANDEV_WRITE(pcan_chan->mb7data3,0x00);
	CANDEV_WRITE(pcan_chan->mb7data4,0x00);
	CANDEV_WRITE(pcan_chan->mb7data5,0x00);
	CANDEV_WRITE(pcan_chan->mb7data6,0x00);
	CANDEV_WRITE(pcan_chan->mb7data7,0x00);

	/*MB8*/
	CANDEV_WRITE(pcan_chan->mb8code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb8ID,0);
	CANDEV_WRITE(pcan_chan->mb8data0,0x00);
	CANDEV_WRITE(pcan_chan->mb8data1,0x00);
	CANDEV_WRITE(pcan_chan->mb8data2,0x00);
	CANDEV_WRITE(pcan_chan->mb8data3,0x00);
	CANDEV_WRITE(pcan_chan->mb8data4,0x00);
	CANDEV_WRITE(pcan_chan->mb8data5,0x00);
	CANDEV_WRITE(pcan_chan->mb8data6,0x00);
	CANDEV_WRITE(pcan_chan->mb8data7,0x00);

	/*MB9*/
	CANDEV_WRITE(pcan_chan->mb9code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb9ID,0);
	CANDEV_WRITE(pcan_chan->mb9data0,0x00);
	CANDEV_WRITE(pcan_chan->mb9data1,0x00);
	CANDEV_WRITE(pcan_chan->mb9data2,0x00);
	CANDEV_WRITE(pcan_chan->mb9data3,0x00);
	CANDEV_WRITE(pcan_chan->mb9data4,0x00);
	CANDEV_WRITE(pcan_chan->mb9data5,0x00);
	CANDEV_WRITE(pcan_chan->mb9data6,0x00);
	CANDEV_WRITE(pcan_chan->mb9data7,0x00);

	/*MB10*/
	CANDEV_WRITE(pcan_chan->mb10code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb10ID,0);
	CANDEV_WRITE(pcan_chan->mb10data0,0x00);
	CANDEV_WRITE(pcan_chan->mb10data1,0x00);
	CANDEV_WRITE(pcan_chan->mb10data2,0x00);
	CANDEV_WRITE(pcan_chan->mb10data3,0x00);
	CANDEV_WRITE(pcan_chan->mb10data4,0x00);
	CANDEV_WRITE(pcan_chan->mb10data5,0x00);
	CANDEV_WRITE(pcan_chan->mb10data6,0x00);
	CANDEV_WRITE(pcan_chan->mb10data7,0x00);

	/*MB11*/
	CANDEV_WRITE(pcan_chan->mb11code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb11ID,0);
	CANDEV_WRITE(pcan_chan->mb11data0,0x00);
	CANDEV_WRITE(pcan_chan->mb11data1,0x00);
	CANDEV_WRITE(pcan_chan->mb11data2,0x00);
	CANDEV_WRITE(pcan_chan->mb11data3,0x00);
	CANDEV_WRITE(pcan_chan->mb11data4,0x00);
	CANDEV_WRITE(pcan_chan->mb11data5,0x00);
	CANDEV_WRITE(pcan_chan->mb11data6,0x00);
	CANDEV_WRITE(pcan_chan->mb11data7,0x00);

	/*MB12*/
	CANDEV_WRITE(pcan_chan->mb12code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb12ID,0);
	CANDEV_WRITE(pcan_chan->mb12data0,0x00);
	CANDEV_WRITE(pcan_chan->mb12data1,0x00);
	CANDEV_WRITE(pcan_chan->mb12data2,0x00);
	CANDEV_WRITE(pcan_chan->mb12data3,0x00);
	CANDEV_WRITE(pcan_chan->mb12data4,0x00);
	CANDEV_WRITE(pcan_chan->mb12data5,0x00);
	CANDEV_WRITE(pcan_chan->mb12data6,0x00);
	CANDEV_WRITE(pcan_chan->mb12data7,0x00);

	/*MB13*/
	CANDEV_WRITE(pcan_chan->mb13code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb13ID,0);
	CANDEV_WRITE(pcan_chan->mb13data0,0x00);
	CANDEV_WRITE(pcan_chan->mb13data1,0x00);
	CANDEV_WRITE(pcan_chan->mb13data2,0x00);
	CANDEV_WRITE(pcan_chan->mb13data3,0x00);
	CANDEV_WRITE(pcan_chan->mb13data4,0x00);
	CANDEV_WRITE(pcan_chan->mb13data5,0x00);
	CANDEV_WRITE(pcan_chan->mb13data6,0x00);
	CANDEV_WRITE(pcan_chan->mb13data7,0x00);

	/*MB14*/
	CANDEV_WRITE(pcan_chan->mb14code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb14ID,0);
	CANDEV_WRITE(pcan_chan->mb14data0,0x00);
	CANDEV_WRITE(pcan_chan->mb14data1,0x00);
	CANDEV_WRITE(pcan_chan->mb14data2,0x00);
	CANDEV_WRITE(pcan_chan->mb14data3,0x00);
	CANDEV_WRITE(pcan_chan->mb14data4,0x00);
	CANDEV_WRITE(pcan_chan->mb14data5,0x00);
	CANDEV_WRITE(pcan_chan->mb14data6,0x00);
	CANDEV_WRITE(pcan_chan->mb14data7,0x00);

	/*MB15*/
	CANDEV_WRITE(pcan_chan->mb15code,TX_NOTENABLE | 0);
	CANDEV_WRITE(pcan_chan->mb15ID,0);
	CANDEV_WRITE(pcan_chan->mb15data0,0x00);
	CANDEV_WRITE(pcan_chan->mb15data1,0x00);
	CANDEV_WRITE(pcan_chan->mb15data2,0x00);
	CANDEV_WRITE(pcan_chan->mb15data3,0x00);
	CANDEV_WRITE(pcan_chan->mb15data4,0x00);
	CANDEV_WRITE(pcan_chan->mb15data5,0x00);
	CANDEV_WRITE(pcan_chan->mb15data6,0x00);
	CANDEV_WRITE(pcan_chan->mb15data7,0x00);

	/*设置ID屏蔽寄存器,检查所有的标准格式的ID位*/
	CANDEV_WRITE(pcan_chan->rxgmask,0x1FFFFFFF);

	/*屏蔽除MBO和MB1外的所有中断*/
	CANDEV_WRITE(pcan_chan->imask,0x0003);

	/*清除中断标志*/
	CANDEV_WRITE(pcan_chan->iflag,0xFFFF);

	/*退出FREEZE模式,退出管理模式*/
	CANDEV_WRITE(pcan_chan->mcr,
		MCR_MENE | MCR_MAXMB);
   intUnlock (oldlevel);

   /*创建发送接收信号量*/
   printf("Create Sem...\n\r");
   pcan_chan->tx_semSync = semBCreate(SEM_Q_FIFO,SEM_FULL); /*发送信号量初始状态为满*/
   
   if(pcan_chan->tx_semSync == NULL)
   {
	   printf("tx_semSync creat error\n");
	   return ERROR;
   }
   pcan_chan->rx_semSync = semBCreate(SEM_Q_FIFO,SEM_EMPTY);/*接收信号量初始状态为空*/
   if(pcan_chan->rx_semSync == NULL)
   {
	   printf("rx_semSync creat error\n");
	   return ERROR;
   }
   
   printf("Done.\n\r");

   return OK;

}

/******************************************************************************
*
* WriteByte - 写字节到Flex_can的信息缓冲区中
*
*返回:成功返回OK,否则返回ERROR
* 
*参数:
      pcan_chan  --  要写入字节的can设备
	  byte       --  要写入的字节
	  num        --  该字节在信息缓冲区中的位置
******************************************************************************/

LOCAL STATUS WriteByte(Can_DEV *pcan_chan,UCHAR byte,int num)
{
	if(num >= 8) return ERROR;
	switch (num)
	{
	case 0:
		CANDEV_WRITE(pcan_chan->txdata0,byte);
		break;
	case 1:
		CANDEV_WRITE(pcan_chan->txdata1,byte);
		break;
	case 2:
		CANDEV_WRITE(pcan_chan->txdata2,byte);
		break;
	case 3:
		CANDEV_WRITE(pcan_chan->txdata3,byte);
		break;
	case 4:
		CANDEV_WRITE(pcan_chan->txdata4,byte);
		break;
	case 5:
		CANDEV_WRITE(pcan_chan->txdata5,byte);
		break;
	case 6:
		CANDEV_WRITE(pcan_chan->txdata6,byte);
		break;
	case 7:
		CANDEV_WRITE(pcan_chan->txdata7,byte);
		break;
	default:
		return ERROR;
	}
	return OK;


}

/******************************************************************************
*
* Can0TxInterrupt - Flex_can0模块发送中断函数,调用相应的中断例程
*
*返回:无
* 
*参数:无
******************************************************************************/
void Can0TxInterrupt (void)
{
	UINT16        intStatus;
    //logMsg("#can0 Tx Int!T#", 1, 2, 3, 4, 5, 6);

	intStatus = CANDEV_READ(can_chan_dev[0].iflag);/*读中断状态标志*/
	if((intStatus & 0x0001) == 0x0001)
	{
		CanTxInterrupt(&can_chan_dev[0]);
	}
	else
	{		
		logMsg("#can0 Tx vacant Int!T#", 1, 2, 3, 4, 5, 6);
	}
	/*
	if(intStatus & CAN0_TX_INT_STATUS)
	{
		CanTxInterrupt(&can_chan_dev[0]);
	}
	if(intStatus & CAN0_RX_INT_STATUS)
	{
		CanRxInterrupt(&can_chan_dev[0]);
	}
	*/
    CANDEV_WRITE(can_chan_dev[0].iflag,0x0001);/*清除中断状态标志*/
}
/******************************************************************************
*
* Can0RxInterrupt - Flex_can0模块接收中断函数,调用相应的中断例程
*
*返回:无

⌨️ 快捷键说明

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