主题中讨论的其他器件: CC1312R、 CC1352R、 CC1310
各位专家:
目前我正在使用 CC1350、我想在 UART 中打印射频数据包数据、然后 我想使用静态 UART 写入函数将所有任务中的数据写入 UART。 请指导我完成此任务。
此致
Surya
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您是否打算将其用于调试? 如果是、请记住、打印到 UART 所需的时间最短为1 - 2ms、并且可以轻松地阻止其他任务。
在最新的 SDK 中可能有一个更好的示例、但您可以使用此处发布的 zip 文件中显示的概念: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/636545/rtos-launchxl-cc1310-cc1310-transmit-and-receive-to-rf-from-spi-or-uart 、这意味着您将一个任务用于所有打印、数据将传递给此任务。
是的、您是对的、我在这里附上了我的示例代码供您参考、这里我使用了 Display_printf 函数、但这不起作用、这就是我想要使用 UART 写入函数的原因
/*
*版权所有(c) 2017-2019、德州仪器(TI)公司
*保留所有权利。
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
**源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
**二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
**德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)因使用本软件而以任何方式产生、
*即使被告知可能会发生此类损坏。
*
/*
*==== nvsinternal.c ====
*
#include
#include
#include
/*驱动程序头文件*/
#include
#include
/*驱动程序头文件*/
#include
/*示例/板头文件*/
#include "Board.h"
#define footer ======================================================================================== "
放置在 RAM 中的/*缓冲器,用于保存从非易失性存储器读取的字节。 *
静态字符缓冲区[64];
int 计数= 0;
/*
*某些器件的闪存写入大小最小为4字节(1个字)。 尝试
*写入不是4个数据量的倍数将失败。 该数组是
*向上舍入(4的下一个倍数)以满足此要求。 请参阅 NVS
*驱动程序文档以了解更多详细信息。
*
静态常量字符签名[52]=
{"SimpleLink SDK 非易失性存储(NVS)示例"};
/*
*==== gpioButtonFxn0 ===
* Board_GPIO_BUTTON0上 GPIO 中断的回调函数。
*
void gpioButtonFxn0 (uint_least8_t 索引)
{
Display_Params 参数;
Display_Params_init (¶ms);
params.lineClearMode = display_clear_both;
Display_Handle displayHandle = Display_open (Display_Type_UART、params);
/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Board_GPIO_LED0);
count++;
display_printf (displayHandle、0、0、"key1=%d"、count);
display_close (displayHandle);
}
/*
*==== gpioButtonFxn1 =========
* Board_GPIO_Button1上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn1 (uint_least8_t 索引)
{
Display_Params 参数;
Display_Params_init (¶ms);
params.lineClearMode = display_clear_both;
Display_Handle displayHandle = Display_open (Display_Type_UART、params);
/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Board_GPIO_LED1);
count++;
display_printf (displayHandle、0、0、"key2=%d"、count);
display_close (displayHandle);
}
/*
*==== mainThread ====
*
void * mainThread (void * arg0)
{
NVS_Handle nvsHandle;
NVS_Attrs 区域 Attrs;
NVS_Params nvsParams;
Display_Handle displayHandle;
/*调用驱动程序初始化函数*/
GPIO_init();
/*配置 LED 和按钮引脚*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_LED1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_BUTTON0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);
/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
/*安装按钮回调*/
GPIO_setCallback (Board_GPIO_BUTTON0、gpioButtonFxn0);
/*启用中断*/
GPIO_enableInt (Board_GPIO_BUTTON0);
/*
*如果您的器件有多个输入引脚可用、则会中断
将在 Board_GPIO_Button1上启用*。
*
if (Board_GPIO_BUTTON0!= Board_GPIO_Button1){
/*配置 Button1引脚*/
GPIO_setConfig (Board_GPIO_Button1、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);
/*安装按钮回调*/
GPIO_setCallback (Board_GPIO_Button1、gpioButtonFxn1);
GPIO_enableInt (Board_GPIO_Button1);
}
display_init();
NVS_init();
DisplayHandle = Display_open (Display_Type_UART、NULL);
if (displayHandle == NULL){
/* Display_open()失败*/
while (1);
}
NVS_PARAMS_INIT (_nvsParams);
nvsHandle = NVS_OPEN (Board_NVSIONNAL、_nvsParams);
if (nvsHandle == NULL){
display_printf (displayHandle、0、0、"NVS_open () failed.");
返回(空);
}
display_printf (displayHandle、0、0、"\n");
/*
*这将填充具有特定属性的 NVS_Attrs 结构
*连接到 NVS_Handle、例如区域基地址、区域大小、
和扇区大小。
*
NVS_getAttrs (nvsHandle、®ionAttrs);
/*显示 NVS 区域属性*/
Display_printf (displayHandle、0、0、"区域基址:0x%x"、
区域 Attrs.regionBase);
Display_printf (displayHandle、0、0、"扇区大小:0x%x"、
regionAttrs.sectorSize);
Display_printf (displayHandle、0、0、"区域大小:0x%x\n"、
regionAttrs.regionSize);
/*
*将"sizeof (signature)"字节从 NVS 区域基地址复制到中
*缓冲区。 偏移量为0表示区域基地址的偏移量。
*因此,字节从 regionAttrs.regionBase 复制。
*
NVS_READ (nvsHandle、0、(void *) buffer、sizeof (signature));
/*
*确定 NVS 区域是否包含签名字符串。
*将字符串与复制到缓冲区中的内容进行比较。
*
if (strcmp ((char *) buffer、(char *) signature)==0){
/*将签名直接从 NVS 区域写入 UART 控制台。 *
Display_printf (displayHandle、0、0、"%s"、regionAttrs.regionBase);
Display_printf (displayHandle、0、0、"擦除闪存扇区...");
/*擦除整个闪存扇区。 *
NVS_ERASE (nvsHandle、0、regionAttrs.sectorSize);
}
否则{
/*在 NVS 区域未找到签名。 *
display_printf (displayHandle、0、0、"正在将签名写入闪存...");
/*将签名写入内存。 之前擦除闪存扇区
执行写入操作。 这由指定
* NVS_WRITE_ERASE。
*
NVS_WRITE (nvsHandle、0、(void *) signature、sizeof (signature)、
NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY);
}
display_printf (displayHandle、0、0、"复位器件。");
Display_printf (displayHandle、0、0、页脚);
display_close (displayHandle);
返回(空);
}
此致
Surya
您好 Surya、
您 应该检查 Display_open()返回的 displayHandle 是否有效且不为 NULL。 如果您尝试 使用 NULL 句柄进行打印、Display_printf 将不会向 UART 线打印任何内容。
如果不允许打开第二个显示实例(因为您的 mainThread 中已有一个打开的显示实例)、则可能会收到 NULL 句柄。
此致、
高斯图
如上所述、请尝试在您的两个中断处理程序中验证返回 的 displayHandle 是否与 NULL 不同。 您可能会收到 NULL、因为您同时打开多个 Display UART 实例(mainThread 中的第一个实例和中断处理程序中的另一个实例)、这是不允许的。
如果您收到 NULL 句柄、那么上面的情形就是您的示例所发生的情况。
您可以将 displayHandle 变量移动到 mainThread 外部、并将其作为 mainThread 和中断的全局变量使用。 但是、由于与中断处理程序相关的延迟、强烈建议不要通过 UART 打印、这可能会导致任务被阻止很长时间。 我建议您遵循由 GhostOf 链接的示例、并使用单独的线程来执行所有 UART 打印。
此致、
高斯图
您好 、TheGhostOf
感谢您的澄清、我们将来会有一个 OTA 计划、因此我们将 CC1350用于 我们 的项目、这将使 CC1350变得非常熟悉。
此致
Surya
您好 、Fausto C
感谢您的回复、我已停止使用 cc1350进行开发、现在我购买了 cc1312 Launchpad 进行开发、我需要您提供以下要求的建议。
在这里,我如何做到这一点,哪一个例子适合这项工作。
这些数据根据射频器件希望关断的其他时间间隔进行传输。
可以选择更改频率以避免数据冲突。
此致
Surya
您好 Surya、
很抱歉我的答复很晚。
-如果您在应用中使用射频,我建议您从 rfPacketTx 和 rxPacketTx 这两个示例开始。 熟悉它们的工作原理、然后您可以在其中集成 UART 和 NVS 功能。 要开始使用 UART2和 NVS 驱动程序、我建议您查看 uart2echo/uart2callback 和 nvsinternal/nvsexternal 示例、这些示例应有助于您了解如何通过 TI 驱动程序与两个外设进行交互。
-如果您希望 在运行时在同一频带内进行小幅频率调整,则可以使用 CMD_FS 频率进行此操作( rfPacket 示例中的 RF_cmdFs.frequency)->有关主题 的更多详细信息,请访问 https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/897167/cc1312r-frequency-change-related-questions 。
如果您希望在频率上实现更大的跳转、我认为您必须关闭射频内核并使用不同的中心频率发出新的设置命令(rfPacket 示例中的 RF_cmdPropRadioDivSetup.centerFreq)。
此致、
高斯图