NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0列印除錯資訊,UART1和其他設備收發資料
- 一、JN-AN-1189 介紹
- 二、匯入工程
- 三、修改工程
- 1、典型系統啟動流程
- 2、添加 Task
- 3、添加 Software Timer
- 4、添加 ISR
- 5、配置 ISR
- 6、配置 Task
- 7、初始化 UART1
- 8、禁用 RGB
- 9、啟動 Task
- 10、編譯工程
- 11、演示效果
一、JN-AN-1189 介紹
JN-AN-1189-ZigBee-HA-Demo 提供并描述了可以在JN516x-EK001評估套件上運行的示例家庭自動化應用程式,
ZigBee家庭自動化(HA)是一種全球標準,用于確保對電燈、加熱器、窗簾、百葉窗和門鎖等家用電器的靈活控制,家用電器可以通過各種器件進行無線控制,如開關、傳感器、遙控單元、手機和計算機等,ZigBee HA所具有的創新功能可用于裝配家庭,利用智能手機、平板電腦和筆記本電腦等現有消費電子技術可實作完全集成控制,采用ZigBee家庭自動化應用規范中的ZigBee PRO協議,可在家庭中實施ZigBee HA系統,
恩智浦為JN5169和JN5168微控制器提供了一套完整的ZigBee家庭自動化軟體解決方案,其中包括ZigBee PRO協議、HA應用組態檔、ZigBee群組庫(ZCL)和JenOS(Jennic作業系統),ZigBee家庭自動化解決方案可以使用HA組態檔中的HA專用“集群”和ZCL中的通用集群,
JN-AN-1189-ZigBee-HA-Demo 使用 BeyondStudio for NXP 開發,SDK 為 JN-SW-4168,JN-AN-1189-ZigBee-HA-Demo 使用的是 JenOS ,
BeyondStudio for NXP 下載地址:JN-SW-4141.zip
JN-SW-4168 下載地址:JN-SW-4168 ZigBee-HA-LL v2162.zip
安裝 JN-SW-4168 方法與安裝 JN-SW-4170 一樣,安裝教程:NXP JN5169 ZigBee 3.0開發環境搭建
二、匯入工程
在 BeyondStudio for NXP 匯入工程,匯入教程:BeyondStudio for NXP匯入工程
JN-AN-1189-ZigBee-HA-Demo 有個小 bug ,需要修改 Common/Source 檔案夾下的 haEzJoin.c 檔案

需要把 u8FilterMap 全部替換成 u16FilterMap,共有 5 處地方需要修改,

分別在 365、368、370、393、418 行,

三、修改工程
這里以 DimmableLight 1(DR1175)為例,修改完的效果為 UART0 列印除錯資訊,UART1 每隔一秒列印一次資訊,同時可以接收資料,由 UART0 列印 UART1 接收到的資料,UART1 重定向到 DIO9、DIO11
1、典型系統啟動流程

2、添加 Task
雙擊打開 Common_Light/Source 檔案夾下的 App_ZHA_Light_JN516x_mono.oscfgdiag 檔案

放置一個 Task 到 Cooperative Tasks 里,設定 Task 的名字(例如:APP_Uart1Send)、優先級(例如:90、210等)

3、添加 Software Timer
放置一個 Software Timer 到 Software Timers 里,設定軟體定時器名字(例如:APP_Uart1SendTimer)

把 APP_Uart1Send 和 APP_Uart1SendTimer連接起來,由 APP_Uart1SendTimer 指向 APP_Uart1Send

4、添加 ISR
由于在 JenOS 不能直接注冊回呼函式,所以需要添加ISR,先添加一個 Interrupt Source,設定名字(例如:UART1),再添加一個 ISR ,設定名字(例如:APP_ISRUart1),設定 ISR 優先級(例如:5),再把 Interrupt Source 和 ISR 連接起來,由 Interrupt Source 指向 ISR,

5、配置 ISR
打開 Common_Light/Source 檔案夾下的 app_zcl_light_task.c 檔案

在 app_zcl_light_task.c 檔案頂部包含該頭檔案:
#include <AppHardwareApi.h>

在 app_zcl_light_task.c 檔案底部添加以下代碼:
OS_ISR(APP_ISRUart1)//該處引數必須和上面添加的ISR名稱一致
{
uint8 sta;
sta = u8AHI_UartReadInterruptStatus(E_AHI_UART_1);
DBG_vPrintf(TRUE, "debug:Uart1 interrupt %x\n", sta);
//接收資料可用中斷
if(sta & 0x04){
DBG_vPrintf(TRUE, "debug:Receive data available interrupt (next highest priority) !\n");
sta = u8AHI_UartReadData(E_AHI_UART_1);
DBG_vPrintf(TRUE, "debug:Uart1 Recv: %c \n", sta);
}
}

6、配置 Task
打開 Common_Light/Source 檔案夾下的 app_zcl_light_task.c 檔案(和ISR在同一檔案),在 app_zcl_light_task.c 檔案底部添加以下代碼:
/*發送單個字符*/
PRIVATE void vPutChar(unsigned char c)
{
while (!(u8AHI_UartReadLineStatus(E_AHI_UART_1) & E_AHI_UART_LS_THRE)); /*發送FIFO為空*/
vAHI_UartWriteData(E_AHI_UART_1, c); /*寫入要發送的字符*/
/*
發送移位暫存器為慷訓者發送FIFO為空,即等待發送完畢
E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT = 0x20 | 0x40 = 0x60
*/
while ((u8AHI_UartReadLineStatus(E_AHI_UART_1) & (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT))
!= (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT));
}
/*發送字串*/
PRIVATE void vPutStrs(unsigned char *str)
{
while(*str){
vPutChar(*str++);
}
}
OS_TASK(APP_Uart1Send)
{
uint8 sta;
sta = u8AHI_UartReadLineStatus(E_AHI_UART_1);
DBG_vPrintf(TRUE, "debug:u8AHI_UartReadLineStatus: %x\n", sta);
//vAHI_UartWriteData(E_AHI_UART_1, 'A');
vPutStrs((uint8*)"Uart1 Send!\n");
if(OS_eGetSWTimerStatus(APP_Uart1SendTimer) != OS_E_SWTIMER_STOPPED){
OS_eStopSWTimer(APP_Uart1SendTimer);
}
OS_eStartSWTimer(APP_Uart1SendTimer, APP_TIME_MS(1000), NULL );
}

7、初始化 UART1
打開 Common_Light/Source 檔案夾下的 app_start_light.c 檔案

因為在 DimmableLight1 MONO DR1175 中 UART1 的 DIO14、DIO15 被占用,所以需要重定向 UART1 到 DIO9、DIO11,
輸入以下代碼:
/*初始化串口*/
PUBLIC void vUartInit(void)
{
vAHI_UartSetLocation(E_AHI_UART_1, TRUE);//重定向uart1到DIO9、11
vAHI_UartEnable(E_AHI_UART_1);
//復位指定UART的發送和接收FIFO,并將FIFO觸發級別設定為單位元組觸發
vAHI_UartReset(E_AHI_UART_1,
TRUE, /* 復位收發FIFO*/
TRUE);
vAHI_UartReset(E_AHI_UART_1, FALSE, FALSE);
vAHI_UartSetBaudRate(E_AHI_UART_1, E_AHI_UART_RATE_115200); /* 設定波特率*/
//設定Uart1 none校驗,字長為8,停止位為1
vAHI_UartSetControl(E_AHI_UART_1,
E_AHI_UART_ODD_PARITY,
E_AHI_UART_PARITY_DISABLE,
E_AHI_UART_WORD_LEN_8,
E_AHI_UART_1_STOP_BIT,
E_AHI_UART_RTS_LOW);
//設定Uart1 接收資料可用中斷為1
vAHI_UartSetInterrupt(E_AHI_UART_1, FALSE, FALSE, FALSE, TRUE, E_AHI_UART_FIFO_LEVEL_1);
}

在方法 PUBLIC void vAppMain(void) 中呼叫

8、禁用 RGB
打開 Common_Light/Source/DriverBulb 檔案夾下的 DriverBulb_DR1175.c 檔案

加一個宏禁用 RGB,此處修改方法為網友:yilonglucky 提供,

此處大力感謝網友:yilonglucky 提供的資料,


9、啟動 Task
打開 Common_Light/Source 檔案夾下的 app_start_light.c 檔案

在方法 PUBLIC void vAppMain(void) 中啟動 RTOS 之后啟動 Task
OS_eActivateTask(APP_Uart1Send);

10、編譯工程
保存 所有修改過的檔案,先 Clean Project 再 Build Project,
這里編譯 DimmableLight 1(DR1175)

編譯之后重繪一下工程,打開 DimmableLight/Source 檔案夾下的 os_irq.S 檔案,查看中斷是否自動生成

uart 1 優先級

中斷向量表

中斷函式

打開 DimmableLight/Source 檔案夾下的 os_gen.c 檔案,查看軟體定時器和 Task 是否自動生成

軟體定時器

Task

打開 DimmableLight/Source 檔案夾下的 os_gen.h 檔案,查看軟體定時器和 Task 是否自動生成

Task

軟體定時器

整個編譯流程大概需要 3-5 分鐘,編譯成功后控制臺輸出以下資訊,為編譯生成的 bin 檔案:

燒錄程式:

11、演示效果
打開兩個串口助手:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226294.html
標籤:其他
