高级会员 
  
	- 积分
 - 890
 
        - 金钱
 - 890 
 
       - 注册时间
 - 2014-8-16
 
      - 在线时间
 - 193 小时
 
 
 
 | 
 
 本帖最后由 Theone 于 2017-8-25 11:30 编辑  
 
之前一直想使用一种新的风格写代码,就是将硬件配置与平台区分开,同时与应用部分也区分开。当更换平台后,只需要修改使用到的硬件资源就可以正常跑了。第一次尝试,可能写的有些乱,封装的不是很好。有更好想法的人可以提出来进行改进。以下是移植文档: 
 
[mw_shl_code=c,true]//1.把两个C文件包含到相应的工程目录中 
//2.如果提示u8等未定义,请在NRF24L01.h文件中添加相应的定义头文件 
//3.修改NRF_USER.c文件中的USER_Config_NRF_Device函数,将所用到的硬件资源修改为你所在平台的引脚跟外设。默认的是原子的F4平台。 
//4.修改NRF_USER.c文件中的USER_Init_RCC函数,将所用到的外设时钟开启。 
//5.修改NRF_USER.c文件中的USER_Init_IRQ函数,将所用到的中断资源进行初始化。 
//6.将USER_NRF_IRQ与USER_NRF_TIM_IRQ两个中断函数放到对应的中断函数里边。如果不想使用外部中断处理数据,可在该函数中注释外部中断的配置。定时器中断还没有用到。 
//7. 
//发送函数示例: 
        NRF_Data.TX.Data.Protocol.MoreData = 0;//表示该数据帧后没有数据了 
    NRF_Data.TX.Data.Protocol.Type = 1;//数据类型为1,自己定制协议内容,写逻辑把 
    NRF_Data.TX.Data.Protocol.Length = 2;//数据帧数据长度为2,最大帧数据长度28 
    NRF_Data.TX.Data.Protocol.TotalLength = 2;//数据包数据长度为2,理论最大(64K-1) 
    NRF_Data.TX.Data.Protocol.Content[0] = 2;//第一个数据 
    NRF_Data.TX.Data.Protocol.Content[1] = 3;//第二个数据 
        NRF_Tx_Data((_nrf_data_packet_*)&NRF_Data.TX); 
         
//接收函数示例:(数据接收在中断部分处理) 
        value = NRF_Get_Status(); 
        if (value & (1 << RX_IT)) 
        { 
                //接收中断 
                channel = (value & 0x0e) >> 1; 
                NRF_Rx_Data((_nrf_data_packet_*)(&NRF_Data.RX[channel])); 
        } 
         
//main函数中处理数据,这只是通道0,其他的类似 
        if(NRF_Data.RX[0].Update_Flag == TRUE) 
        { 
                NRF_Data.RX[0].Update_Flag = FALSE; 
                for (i = 0; i < NRF_Data.RX[0].Data.Protocol.Length; i++) 
                { 
                        //处理接收到的真正数据部分 
                } 
                UART1_Send("\r\n"); 
        } 
//8.数据帧协议结构体 
 
/* 
 *        Type:判断数据包类型 
 *        MoreData:判断完整的数据包是否发送完成,如果不为1,则表示数据包还未发送完成,还有更多的数据需要发送。多个数据帧组合成一个完整的数据包,数据包的逻辑还没写,有能力的自己写吧。 
 *        Length:数据帧的数据长度 
 *        TotalLength:数据包长度 
 *        Content:数据帧数据内容 
 */ 
typedef struct 
{ 
    u8 Type : 7; 
    u8 MoreData : 1; 
    u8 Length; 
    u16 TotalLength; 
    u8 Content[NRF_DATA_LENGTH-4]; 
}_nrf_protocol_;//真正的发送协议 
 
typedef union 
{ 
    u8 Raw[NRF_DATA_LENGTH]; 
    _nrf_protocol_ Protocol; 
}nrf_protocol;//对协议进行封装,使用Raw可按字节读取或发送 
 
typedef struct 
{ 
    u8 Update_Flag; 
    nrf_protocol Data; 
}_nrf_data_packet_;//将协议封装成数据包。加入更新标志位,如果接收完成一帧数据,使用标记位判断 
 
volatile _nrf_data_ NRF_Data = { 
    { 0 },//TX_Data 
    { 
        { 0 },//RX_Data[0],接收通道0 
        { 0 },//RX_Data[1],接收通道1 
        { 0 },//RX_Data[2],接收通道2 
        { 0 },//RX_Data[3],接收通道3 
        { 0 },//RX_Data[4],接收通道4 
        { 0 },//RX_Data[5],接收通道5 
    }, 
};//该结构体是所有发送与接收通道的第一次数据存放区域 
 
//9.位段操作指针 
/* 
 *        GET_BITBAND_READ_POINTER(GPIO,PIN) 
 *        这个宏定义会返回一个能够才做IO口电平状态的指针,原理就是位段操作,让一个指针指向操作该io口的位段地址,然后改变值,就可以改变io口状态了 
 */ 
 
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 [/mw_shl_code] 
 
 |   
 
 
 
 |