高级会员
- 积分
- 889
- 金钱
- 889
- 注册时间
- 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]
|
|