|
5 днів тому | |
---|---|---|
STM32F10x_FWLib | 7 місяців тому | |
app | 7 місяців тому | |
core | 7 місяців тому | |
keil_v5 | 5 днів тому | |
peripheral | 7 місяців тому | |
project | 5 днів тому | |
radio | 7 місяців тому | |
.gitignore | 7 місяців тому | |
README.md | 5 днів тому | |
gitFocePushRemote.bat | 7 місяців тому | |
keilkilll.bat | 7 місяців тому |
[toc]
软件开发移植,先看这里 跳转
..\VGKitBoard_xxxxx
├──app \\常用应用模块封装
| └──
├──core \\MCU内核文件
| └──
├──STM32F10x_FWLib \\MCU官方库函数
└──
├──image \\md文件显示用的图片
| └──
├──keil_v5 \\keil编译器工程文件,包含编译生成的HEX文件
| └──Object \\编译生成的HEX文件在此文件夹
├──peripheral \\项目用到的MCU外设
| └──
├──project \\项目的主函数和GPIO定义包含文件
| └──
├──radio \\射频底层驱动文件
| ├──myRadio_gpio.c \\射频驱动接口硬件初始化
| └──myRadio.c \\为无线应用通用封装API
| └──...
448MHz
的中心频点SPI驱动调试
直观判断可以通过以下代码判断spi是否正常,如果spi操作失败,需要检查硬件连接或者spi的时序是否正确。
//读取版本号,可用于测试spi是否正常
uint16_t reversion = 0;
RF_ReadBuf(REV, (uint8_t *)&reversion, 2);
if (reversion != 0X503C)
{
while(1);
}
通讯距离 影响无线传输距离的因素
Micro-B USB 座子,可以用于测试板的供电;连接电脑可以做 TTL 转 USB 功 能,测试板内含 CP2102N 芯片
keil工程已经设置了4个选项:
projecet_AT
:表示该工程的MCU型号选择的是雅特力AT32F413RCT7单片机,不带自定义boot功能,即不设置偏移地址projecet_ST
:表示该工程的MCU型号选择的是ST意法半导体STM32F103RCT6单片机,不带自定义boot功能,即不设置偏移地址projecet_AT_APP
:表示该工程的MCU型号选择的是雅特力AT32F413RCT7单片机,带自定义boot功能,设置偏移地址为0x000C800
projecet_ST_APP
:表示该工程的MCU型号选择的是ST意法半导体STM32F103RCT6单片机,带自定义boot功能,设置偏移地址为0x000C800
模块演示板出厂默认烧录projecet_ST_APP
工程,该工程是带boot功能的,默认选择的Debug工具是CMSIS-DAP Debugger
工具,在Option->Debug->Setting->Flash Download->Programming Algorithm->Start
中设置了起始地址,如果更换了Debug工具,起始地址会恢复默认,需要重新设置起始地址。
keil_v5\Listings\*.bin
软件功能框图
软件开发主要就是涉及射频模块驱动
,与硬件相关的主要就是SPI接口和一些辅助IO口(比如中断信号脚),这部分软件主要放在./radio/myRadio_gpio.c
中。
中断信号是通过回调函数RADIO_GPIO_CALLBACK
的方式从./radio/myRadio_gpio.c
回调到./radio/myRadio.c
中处理,回调函数的方式只是为了方便软件编写,用户可以直接把外部中断函数直接放在./radio/myRadio.c
中处理。
所有的中断入口函数放在.\project\stm32f10x_it.c
,在需要的地方通过回调注册的方式回调中断状态,比如注册回调PB0的中断函数回调:
void rfIrq_callback(uint8_t status, uint32_t param)
{
}
myIrqCallback_rfIrq.thisCb = rfIrq_callback;
EXTILINE0_callbackRegiste(&myIrqCallback_rfIrq);
也可以把void EXTI0_IRQHandler(void)
中断入口函数直接拿来用,注册回调的方式只是为了方便调用。
SPI_HARD
来选择,具体见./radio/myRadio_gpio.c/void myRadio_gpio_init(RADIO_GPIO_CALLBACK cb)
调用./radio/myRadio.c/myRadio_abort()
函数,将射频模块进入低功耗模式,进入低功耗模式后,射频模块将不接收任何无线信号,只有当射频模块进入接收状态后,才能再次接收无线信号。
void myRadio_abort(void)
{
if (rf_handle == 0)
{
return;
}
RF_EXT_PA_TO_IDLE();
rf_workProcess = 0;
if (rf_workProcess == 0xa5)
{
RF_Init(rfBaudrate, chipType);
}
RF_powerDown();
}
调用./radio/myRadio.c/myRadio_receiver()
函数,将射频模块进入接收状态,进入接收状态后,射频模块将接收周围环境中的无线信号,并可以接收数据包。在接收状态或者发送过程不能重新调用该函数,发送需要等待发送完成才能再次调用该函数,不然会打断无线发送。接收到无线数据后,射频模块会通过IRQ
引脚产生输出个信号,然后在./radio/myRadio.c/myRadio_process(void)
函数中读取fifo中的数据包。
void myRadio_receiver(void)
{
if (rf_handle == 0)
{
return;
}
RF_EXT_PA_TO_RX();
rf_workProcess = 2;
RF_RxMode();
}
调用./radio/myRadio.c/myRadio_transmit(rfTxPacket_ts *packet)
函数,将射频模块进入发送状态,进入发送状态后,射频模块将发送数据包,发送完成后才可以调用接收函数进入接收状态,发送完成后,射频模块会通过IRQ
引脚产生输出个信号,然后在./radio/myRadio.c/myRadio_process(void)
函数中读取发送完成状态。
void myRadio_transmit(rfTxPacket_ts *packet)
{
if (rf_handle == 0)
{
return;
}
RF_EXT_PA_TO_TX();
if (rf_workProcess != 1)
{
rf_workProcess = 1;
RF_TxMode();
}
rf_workProcess = 1;
RF_Tx_TransmintData(packet->payload, PAYLOAD_WIDTH);
}
调用./radio/myRadio.c/myRadio_init(int agr0, void *agr1_ptr)
函数,将射频模块初始化,初始化完成后,射频模块将进入接收状态,该函数会初始化一个默认的参数,如果需要自定义参数,比如频率信道,发射功率,无线波特率等参数,可以调用相关函数接口重新设置:
./radio/myRadio.c/myRadio_setFrequency(uint32_t freq)
:设置射频模块工作频率./radio/myRadio.c/myRadio_setTxPower(uint8_t power)
:设置射频模块发射功率./radio/myRadio.c/void myRadio_setBaudrate(uint32_t br)
:设置射频模块无线波特率,该接口需要再初始化之前调用初始化完成后就可以进入接收状态或者发送无线数据包了
调用./radio/myRadio.c/myRadio_process(void)
函数,该函数需要放在主函数中不断判断检测是否有中断触发(可以放在while循环中执行),然后根据中断标志来解析处理。状态处理可以直接在相应的位置处理,或者通过回调函数rxCb
将结果返回上一层处理
void myRadio_process(void)
{
uint8_t bMain_IT_Status;
rfRxPacket_ts rfRxPacket;
status_tu status;
if (rf_handle == 0)
{
return;
}
if (rf_irq == false)
{
return;
}
rf_irq = false;
if ((rf_workProcess != 1) && (rf_workProcess != 2))
{
return;
}
rf_workProcess = 0;
status.value = RF_GetStatus();
if (status.bits.RX_DR)
{
status.bits.RX_DR = 0;
rfRxPacket.len = 12;
RF_ReadBuf(R_RX_PAYLOAD, rfRxPacket.payload, rfRxPacket.len);
rfRxPacket.rssi = 127;
RF_ClearFIFO();
RF_ClearStatus ();
rxCb(RX_STA_SECCESS, rfRxPacket);
}
//发送成功中断
//或者发送后收到ACK中断
if (status.bits.TX_DS)
{
status.bits.TX_DS = 0;
RF_ClearFIFO();
RF_ClearStatus ();
rxCb(TX_STA_SECCESS, rfRxPacket);
}
//发送fifo溢出中断
if (status.bits.TX_FULL)
{
}
//发送重传次数完成中断
if (status.bits.MAX_RT)
{
}
//可以读取pipe 号中断
if (status.bits.RX_P_NO <= 0x05)
{
}
//RX fifo为空中断
if (status.bits.RX_P_NO == 0x07)
{
}
if (status.value)
{
RF_ClearFIFO();
RF_ClearStatus ();
}
}
1、本工程驱动软件只提供做演示项目使用,未经过大批量项目验证,客户需谨慎使用,如果使用在正式项目中引发的所有问题,本司概不负责。使用过程若发现任何问题,可及时与本司相关人员联系。 2、本工程所有文件可以用于商业性项目移植,无需向本司申请。