主题中讨论的其他器件: CC1310、 BOOSTXL-TLV8544PIR
工具/软件:TI-RTOS
嗨、大家好、
我将 CC1310 Launchpad 和 BOOSTXL-TLV8544PIR 传感器与 TIDA-00489固件搭配使用、基本上可以正常工作。 但我面临一些问题、还有一些问题、因为我想对代码进行一些更改。 作为监听器、我将 SmartRF Studio 与另一个 CC1310 Launchpad 搭配使用。
问题:
- 我认为 PIR-SHIELD 和 Launchpad 之间的连接松动、因此器件有时会检测和发送动作。 当我可以访问某些测试设备时、我会对连接进行一些测试、但以前是否更频繁地注意到这一点? (只有当 Windows 给我声音时、它才起作用、就像我连接了一些 USB 设备一样)
- 我使用"put"向控制台写入一些内容。 这在代码中只能运行一次。 您有什么想法、为什么? (代码如下所示)
- 当检测到运动并通过低于1GHz 传输时、我面临一些非常奇怪的行为。
- 有时、通过发送 AA、而非 FF、然后发送55来立即指示移动(比较器再次变为低电平后发送55)、然后发送后续的封装/秒、之后发送8-10秒、指示没有发生移动。
- 有时我进行移动时、不会发送包裹、但在8-10秒后、他们又来了、尽管没有进一步的移动。
-->有什么想法,为什么有时会有这么大的延迟?
4.当我将 PIR_SALET_TIME 设置为5s、并且我不断进行15秒的移动时、我看到 FF 在 AA 之后像应该那样发送~20秒。 但我不明白为什么第一次检测到移动后再没有 AA 包装发送?!
软件更改:
- 我想更改程序流、对移动进行计数并在1分钟后发送它们。 因此、我想让 Hwi 用于检测移动、我想添加 Swi 来每分钟发送#移动。 您能帮我创建另一个时钟来实现 Swi 吗?
- 你认为一个任务比 Swi 更适合我吗?
- 关于问题4、我希望您能帮我、因为我想、如果 send_package (AA)也不起作用、计数器将不起作用...
- 我使用"move"变量进行计数时会发生什么情况、当系统进入睡眠状态时、它会保持为0、如果我在每次唤醒后不初始化它、会有一些随机数吗?
这是很多问题、但我确实想了解设置、以便在我收到 TIDA-Board 时能够正确使用它。
代码如下:
//
*版权所有(c) 2015,Texas Instruments Incorporated
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在
*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经
事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、
不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*/*****
包括***** /#include
#include
#include
#include
#include
#include
#include
#include
#include
/*驱动程序*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
#include "smartrf_settings/cc13xx_smartrf_settings.h"
/***** 定义了***** /
#define PIR_SETTIN_TIME5000000// 5秒
//#define PIR_SETTIN_TIME30000000 // 30秒(2分钟),索尔特人 SO 拉萨恩,Einschwingzeit beim Einschalten
//#define PIR_SAFE_TIME10000000 // 10秒
#define PIR_SAFE_SAFET_TIME 100000005000000 // 20秒(1分钟),das hier müsste wohl ganz runter auf 1s
#define PIR_SHUTDOWN_TIME 1000000 // 1秒(5秒), beschreibt wie Lange er wartet bevor er nach Senddem en in den sleep geht
#define TX_TASK_STACK_SIZE1024 //每个任务堆栈必须足够大以处理其正常函数调用和两个完全中断 Hwi 上下文。
#define TX_TASK_PRIORITY2 //定义任务的优先级。 较高的优先级(3>2)会导致首选项。
/* TX 配置*/
#define PAYLOAD_LENGTH3. // Vermutlich Angabe in bytes und betrifft Packetgröße beim Senden
#define packet_interval4000000*0.001f // Setzt das intervall auf 1ms,denn f = die Frefrenz des Prozprocessors (=4MHz=250ns)
//#define
move_limit 10. //Anzahl AB wann der Sensor Die Daten schicken soll;
/***** 原型***** //<- sagen Compiler welche Funkionen IHN im Programm erwarten
static void txTaskFunction (UArg0、UArgarg1);// diese Funktion berupttet den kompleten Sende-und Interruptprozess
static void initionalingTask(void); //裸片时钟 für 裸片 Übertragung und 裸片信标未初始化静态
空 radioSyncTxClockCallback (UArg a0);//裸片信标 wrd um einen Wert inkrementiert
static void sendPacket (uint8_t data); // Behandelt explizit den Sendevorgang
void intr_HwiFxn (PIN_Handle hPin、PIN_ID pinId);// Behandelt DEN 中断引脚
/***** 变量声明***** // Variablen werden deklariert
static Task_Params txTaskParams;
static Task_Structt txTask;
static uint8_t txTaskStack[TX_task_stack_size];
static rfObject rfObject;
static rfhandle rfHandle;
静态 RF_Params rfParams;
静态 Semaphore_Structra无线电 SyncTxSem;
静态 Semaphore_Handle 无线电 SyncTxSemHandle;
静态 Clock_StructroSyncTxClock;
静态时钟_Handle 无线电 SyncTxClockHandle;
静态 uint8_t packet[PAYLOAD_LENGTH];
静态 uint8_t 移动; // von MIR definition/*
唤醒引脚表*//未启用输入、未启用下拉线、未启用自动断电线
的芯片 genannen 引脚排列 Flanke PIN_Config PinTableWakeUp[]={Board_PIR_OUT_LO | PIN_INPUT_EN | PIN_PULLUGGE| PIN_PULLUGGE_DOWN | PIN_WAKET_INCC26XX_IN_IN_WAKEUP | IN_IN_INCE_IN_IN_INWAKEUP
| IN_IN_IN_IN_IN_INESDLE_LOW_IN_IN_PUT | PIN_WAKEUP | PIN
PIN_TERMINATE /*终止列表*/
};
//引脚中断*//未启用输入、kein 上拉电阻下
拉、以及 aufwachen bei 正温度器 Flanke PIN_Config intrinoder []={Board_PIR_OUT_LO | PIN_INPULL_EN | PIN_PHYS_INPUT | PIN_HIN_INSIMP_INSIMPSION_INSIMPSION_INSIMPSIMPLE_OUT | PIN_INTENSIMPSIMPSIMP_IN_INSIMPSIMP_INSIMP_INSIMP_INSIMP_INSIMP_INSI
PIN_TERMINATE
};
PIN_Handle intr_Handle;// Pin_State benötigt ein "handle"和 dieses wedes 定义 hiert
PIN_STATE intr_state;
/***** 函数定义***** /
void TxTask_init ()// kann man wohl so Lassen
{
Task_Params_init (&txTaskParams);//"Task_Params_init" Cluster winitrd befüllt
txTaskParams.STACKSIZE = TX_TASK_STACK_SIZE;//栈大小
txTaskParams.priority = TX_TASK_priority;//任务 Priorität
txTaskParams.stack =&txTaskStack; //堆栈 Bezeichnung
txTaskParams.arg0 =(UINT) 1000000; //检查镍铬合金,Steht aber überall
Task_construction (&txTask、txTaskFunction、&txTaskParams、NULL);// Ein Objektwinitrd gebildet und nicht stellt。 UM ES zu Benutzen Muss ein handle rstellt werden
。}
静态空 txTaskFunction (UArg0、UArgarg1)
{
//初
始化任务 TI-RTOS 对象*/初始化任务(); // Der Task wrd initializiert
//后门访问*/
uint8_t modeValue = PIN_getInputValue (Board_Mode);// Der Wert AM 引脚 wrd eingelesen,ist er 1 =高电平,所以在 DEN SHUTDOWN
参数中的 weder das Modes if (model= 1)(model = 1);/?
//此处为陷波代码
while (1);
}
//获取复位原因*/
uint32_t rsrc = SysCtrlResetSourceGet ();// Der Grund für den Reset wird ermittelt
if (rsrc == RSTSRC_WAKEUP_FUT_SHUTDOWN) // Falls Interrupt ausgelöst wurde wrd diese Schleintr ausgeführt
{
/***引脚中断***//
配置 GPIO 中断
intr_handle = PIN_open (&intr_state、intrPinTable);// t durch den "Test Debug" sondern durch den 中断定义 das handle die_PIN_registerIntCb
(&intr_handle、intr_handle、intr_hwiife_intr);// t dr hnichnicht intr // Registerert eine Callback Funktion wenn ein hw-中断 aufgetreten ist
PIN_setConfig (intr_handle、PIN_BM_IRQ、Board_PIR_OUT_Lo | PIN_IRQ_POSedge);// positver Flanke ausgelöst PIN_setConfig
(IRQ_Handle、PIN_OUT_Lo | PIN_IRQ_IQ_FO_Lge);// positver Flanke + PIRQ_MOVIT_1 ausgelöst
+ PI_MOVIT_ON + PIR_ON + PIR_ IN_ON + PIR_ TO_ON + PIR_ TO_ON + PIR_ TO_ON + PIR_
//等待以确保不再有其他移动。
//如果检测到任何移动,则在 ISR
Clock_setTimeout (radioSyncTxClockHandle、PIR_quiet Time / Clock_tickPeriod)中重新启动计数器;// Warte bis 计数器 abgelaufen und geeder viaf inakSemtiv
Clock_start (radioSyncTxClockHandle);
semaphore_wait_off;/switt 等待/
任务0xendt (unift)/t)
//等待传感器稳定
while (1)// Die Komparatorwerte werden getestet
{
uint8_t pirLowValue = PIN_getInputValue (Board_PIR_OUT_Lo);// Checkke 引脚 WValue vom einen 引脚
uint8_t pirthrLowValue = PIN_getInputValue (Board_PIR_OUT_PIR)=
0 & 0_OUT 引脚 WValue = PIN/Ir 引脚 Uint&r 值 //信头波束引脚低,ISD 传感器“gesettelt
”{
sendPacket (0x55);
中断;
}
}否则 // Falls der Reset Anders ausgelöst wurde als durch Interrupt、also durch Einschalten
{ // Den Start sollte man So Lassen!
/***上电复位唤醒***//
发送初始数据包以显示系统已启动
sendPacket (0x00);
P负载("系统已启动!\n");
移动= 0; //始终在开始
时复位移动变量 while (1)
{
//等待传感器启动并稳定
Clock_setTimeout (radioSyncTxClockHandle、PIR_SETTING_TIME / Clock_Period);// Genaiso wie im case Semzuvor
Clock_start (radioSyncTxClockHandle);semaphore_wait_pend
;semine_parators/forever
(t/Check)/paratorse_para. 如果不是低电平、请等待更多时间
uint8_t LowValue = PIN_getInputValue (Board_PIR_OUT_LO);
uint8_t pirHighValue = PIN_getInputValue (Board_PIR_OUT_Hi);
if (LowEE = 0 & pirthide = 0)// Wenn InputValue = PIN_getInputValue (Board_PIR_OUT_Hi);if (LoweT = 0 & pireT = 0)
// Wenpiride = 0)// Wenpirdas 发送
错误数据包/错误数据包/错误:0xnthrendrendt 错误/错误包(低)
}//Send
packet to show system is up and running
sendPacket (0x11);
put("系统正在运行!");
}// nach 中断码器加电例程,以更好地执行此操作!
//等待传感器在射频传输后趋稳*/
Task_sleep (PIR_SHUTDOWN_TIME / Clock_tickPeriod);// Der aktuelle Task wrd geblockt
//转到 SHUTDOWN 等待下一个 PIR 中断*/
PINCC26XX_setWmodel (
NULL TableWakeUp);// ES werdge Die (Pinetzr geden)掉电引脚(pin take up)
/*不应出现在此处,因为关机将重置*/
while (1);
}
static void 初始化任务(void)// sollte man so Lassen können
{
//用于同步 TX 的设置时钟*///时钟参数 wurden gesetzt Syncund 处理初始化
Clock_radioams SyncTxClockParams;
// startClockParclockSram
= 0;clockClockParclockTclockTparams = 0; /*一次性时钟*/
Clock_construct(&radioSyncTxClockCallback、0、&radioSyncTxClockParams);
radioSyncTxClockHandle = Clock_Handle (&radioSyncTxClock);
/*创建信号量以执行同步 TX *// Semaphor und zugehöriges handle wrd initializiert
semaphore_Params radioSyncTxParams;
Semaphore_Params_init (&radioSyncTxParams);
Semaphore_con构(&radioSyncTxSem、0、&radioSyncTxParams);
radioSyncTxSemHandle = Semaphore_handle (&radioSyncTxSem);
}
静态空 radioSyncTxClockCallback (UArg a0)// semaphore_post führt Dazu、dass das SemaphoreHandle um 1 erhöht wrd
{
semaphore_post (radioSyncTxHandle);
}
void dem_Hwifxn (PIN_Handle hPin、PIN_ID pinId)// Wenn DIE 引脚 INR Hi 和 Lo 引脚 entsprict、WIRD 芯片时钟 pestoppt、ein to gesetzt und wieder
{
if (pinId = Board_PIR_out_Lok = Board_Pend_Clockpetr
)}petcheClock (petr_clockpetr)// tuncheClockpetr petr petr petr (petr) // Warte bis modul weder inaktiv wird
Clock_start (radioSyncTxClockHandle);
}
static void sendPacket (uint8_t data)
{
uint32_t time;
// Init Radio 参数*/
rf_params_init (&rfParams);
//构造有效载荷*/[0]=
pcmt_packet
= rf_rf_length;//配置 pcmtrf_packet Paketlänge = 1 = rf_rf_rf_rf_packet = rf_rf_rf_rf_rf_rt;//* rf = rf_rf_rf_rf_r
// Paketarray、dass gesendet werden soll 和 max der gesetzten Paketlänge entspricht
RF_cmdPropTx.startTrigger.triggerType = trig_ABSTIME;// Muss man noch nachlesen was das soll RF_cmdTx.startTrigger.stpritrigger.start=
1;// RadioMuss man noch nachlesen was cmdsoll
//请求访问无线电设备*rf_rf_prutttry.rf*
、rf_rf_rf_rf_rf*、rfrf_prues&rf *(*)、rf_rf_pru&rfrf_rf_rf_pru&rf_pru&rf *、rf_pru&rf_pru&rf)、rfrf_
/*发送数据包*// nach jedem abgelaufenem Interval wrd ein Paket gesendet
time = rf_getCurrentTime();
time += packet_interval;
rf_cmdltx.StartTime = time;
rf_Event results = rf_runCmd (rfHandle、(rf_Op*)&rf_interval;rf_rf_rf_rf
)+ rf_prut1
)+ rf1 (rf_rf_rf)+
rf 1)+ rf 1 rf 1 rf (rf_en/ rf) rf 1)、rf (rf_enf
/*关闭无线电*/
rf_yield (rfHandle);
}
/*
=== main ====
//
int main (void)// Hier geschieht Nur die Initializierung、der eigentliche Code wrd in der startup and Interrupt routine abgerufen
{
/*呼叫板初始化功能。 // Hier werden Die Boardfuncionen initializerert
Board_initGeneral();
/*初始化任务*// Hier wrd der Task 初始化
TxTask_init();
/*启动 BIOS *// Hier winitrd das TI-RTOS gestartet
BIOS_start();
返回(0);
}
此致
Stefan