Part Number:CC2340R5Other Parts Discussed in Thread:UNIFLASH,
想請問一下,CC2340除了CCS以外是否有其他專門的燒錄軟體?
我想要燒錄兩個程式進去,但其中一個我想要設定讓他在後面一點才開始寫入
例如:有一主程式以及一個判斷是否要更新的小程式,一開始會先執行判斷更新的小程式,如果沒有要更新就直接跳到主程式開始執行,反之如果要更新就會複寫主程式
Yolande Wang:
您好,
Ryan 说:CC2340除了CCS以外是否有其他專門的燒錄軟體?
建议使用 Uniflash 软件 :https://www.ti.com.cn/tool/cn/download/UNIFLASH
,
Ryan:
UniFlash 有提供使用者自己設定 從記憶體的哪個位址開始燒錄程式嗎
,
Yolande Wang:
可以的,请参考这份使用指南:https://software-dl.ti.com/ccs/esd/uniflash/docs/v8_1/uniflash_quick_start_guide.html#multiple-launchpads
,
Ryan:
那有辦法利用Code的方式,進行更新燒錄HEX檔嗎?
例如:第一部份的小程式裡的Code判斷要更新,那麼我就更新第二部分主程式的HEX檔
,
Yolande Wang:
从描述来看,似乎 OAD 可以满足您的需求,可以看看这个 example :https://dev.ti.com/tirex/explore/node?node=A__AL5n1L3QNp84tENGHkLmqw__com.ti.SIMPLELINK_LOWPOWER_F3_SDK_BLE5STACK_MODULE__58mgN04__LATEST
,
Ryan:
那有辦法產生出bin檔嗎? release裡面只有hex檔,我查看了example也沒有發現有哪邊可以產生bin檔
,
Yolande Wang:
可以的,参考这篇文章:https://zhuanlan.zhihu.com/p/158154724
,
Ryan:
我參考了文章,並依照文章去設置,但Release裡面並沒有成功產生出bin檔
,
Yolande Wang:
您看看 CCS 安装路径下是否有 mkhex4bin,位于C:\ti\ccs1010\ccs\utils\tiobj2bin文件夹下
,
Ryan:
是有mkhex4bin
,
Yolande Wang:
看一下你的 build log,里面应该会有出错提示,方便的话贴上来一下。
,
Ryan:
看起來沒甚麼異常,我設置的指令是"${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/armofd" "${CG_TOOL_ROOT}/bin/armhex" "${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"
,
Yolande Wang:
昨天我这边试了下,一开始也没有生成 .bin 文件。
看 build log 里面有个 failed:
"C:/Users/X1122803/ccs/utils/tiobj2bin/tiobj2bin" "basic_ble_CC26X2R1_LAUNCHXL_tirtos7_ticlang.out" "basic_ble_CC26X2R1_LAUNCHXL_tirtos7_ticlang.bin" "C:/Users/X1122803/ccs/tools/compiler/ti-cgt-armllvm_2.1.3.LTS/bin/armofd" "C:/Users/X1122803/ccs/tools/compiler/ti-cgt-armllvm_2.1.3.LTS/bin/armhex" "C:/Users/X1122803/ccs/utils/tiobj2bin/mkhex4bin"tiobj2bin.bat failed on C:/Users/X1122803/ccs/tools/compiler/ti-cgt-armllvm_2.1.3.LTS/bin/armofdPlease see processors.wiki.ti.com/…/Tiobj2bin_Failedtiobj2bin.bat failed on C:/Users/X1122803/ccs/tools/compiler/ti-cgt-armllvm_2.1.3.LTS/bin/armhexPlease see processors.wiki.ti.com/…/Tiobj2bin_FailedC:/Users/X1122803/ccs/utils/tiobj2bin/mkhex4bin failure occurred. Giving up.
我是这样解决的:
armofd 和 armhex 两个文件在这里:C:\Users\X1122803\ccs\tools\compiler\ti-cgt-arm_20.2.7.LTS\bin
将 armofd 和 armhex 复制到此路径下:C:\Users\X1122803\ccs\tools\compiler\ti-cgt-armllvm_2.1.3.LTS\bin
rebuild project 一下就可以了:
,
Ryan:
我嘗試了你的方法,確實可以產生bin檔,但是bin檔的大小好像有點異常?正常來說檔案大小應該會跟HEX檔差不多大
,
Yolande Wang:
我这边是正常的:
,
Ryan:
你那邊的post-build steps 設置的跟我一樣嗎
,
Yolande Wang:
我是复制这个链接中的:https://zhuanlan.zhihu.com/p/158154724
${CG_TOOL_HEX} -order MS --memwidth=8 --romwidth=8 --intel -o ${ProjName}.hex ${ProjName}.out "${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/armofd" "${CG_TOOL_ROOT}/bin/armhex" "${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"
,
Ryan:
我重新rebuild一次,跳出來的build log也沒甚麼問題出來的bin檔大小還是異常,但看起來設置上跟你的應該是一樣的
,
Yolande Wang:
点这个地方,把 build log 文件帖上来看下:
,
Yolande Wang:
打开项目选项->输出转换器并检查输出格式是否为“Raw binary”
,
Ryan:
我沒有找到哪裡有options->linker->output
,
Yolande Wang:
抱歉造成了混乱。
CC2340 的地址不是连续的,后面有一块在0x4002E000,所以转成 .bin 的话就很大,这是正常的。
如果需要,可以参考这个例程把 .bin 和最后的 ccfg 分开:C:\ti\simplelink_lowpower_f3_sdk_7_40_00_64\examples\rtos\LP_EM_CC2340R5\ble5stack\basic_ble_oad_onchip
参考文档:https://dev.ti.com/tirex/explore/content/simplelink_lowpower_f3_sdk_7_40_00_64/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/ble5-oad-index-mcuboot.html
,
Ryan:
1.想請問一下為何CC2340的地址會跳到0x4E020000,是基於什麼樣的規則導致他在燒錄時會跳到那邊嗎?2.是否能讓CC2340的地址能夠依序燒錄,而不會燒錄到一半跳到類似0x4E020000的位址
,
Yolande Wang:
1.请参阅 Technical Reference Mannual 8.5.4 章节,.bin 文件包括了最后扇区 ccfg 的大小,因此会大很多:
可以使用uniFlash导出数据看看:
host_test_512k.bin(512K字节),地址范围:0x0 – 0x7FFFF
ccfg.bin(2K字节),地址范围:0x4e020000 – 0x4E0207FF
2.
Ryan 说:2.是否能讓CC2340的地址能夠依序燒錄,而不會燒錄到一半跳到類似0x4E020000的位址
上面建议您把 .bin 和最后的 ccfg 分开,这样就不会包括 ccfg 的大小
,
Ryan:
我想要燒錄兩個project,(1)bootloader的小程式:用於之後更新主程式 (2) 主程式目前嘗試了幾個方法:
1.使用uniFlash 同時Load 兩個hex檔
結果如下:
2.使用uniFlash 並在其中一個hex 設置起始位址
結果如下:
設置起始位址的HEX檔,LOAD進去的值是錯的
3.把兩個project的HEX檔合併在一起(包含CCFG的部分),之後只LOAD一個HEX檔結果會跳出CRC32的錯誤
,
Yolande Wang:
Ryan 说:1.使用uniFlash 同時Load 兩個hex檔
请查看 OAD 上的 simplelink academy 实验,以及如何创造image:
https://dev.ti.com/tirex/explore/node?node=A__AbMoFvWD.bZAg65tD.7NsQ__SIMPLELINK-ACADEMY-CC23XX__gsUPh5j__LATEST
Ryan 说:3.把兩個project的HEX檔合併在一起,之後只LOAD一個HEX檔結果會跳出CRC32的錯誤
您是如何合并的?可以看下这个和您一样问题的帖子:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1243866/cc2340r5-basic-ble-example-public-address-mode/4710196
,
Ryan:
第2.方法是我搞錯,我勾選到了bin檔才能夠輸入起始位址,hex檔本身似乎不給輸入起始位址第3.方法,我嘗試把其中一個Hex檔的CCFG部分刪除,只留Flash的部分,之後複製到另一個Hex檔的CCFG前面
,
Yolande Wang:
Yolande Wang 说:您是如何合并的?可以看下这个和您一样问题的帖子
抱歉,这个链接是:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1276345/cc2340r5-how-to-merge-two-projects/4869260
,
Ryan:
謝謝你的建議,目前我找到另一個方法,先利用UniFlash燒錄Project的hex檔,之後到UniFlash的Memory右上有個Export,它可以選擇要從記憶體位址的start到End去擷取,並且匯出成bin檔。我利用這個方法測試,將uartcallback這個Project產出一個bin檔(沒有CCFG部分),以及basic_ble這個Project產出一個bin檔(沒有CCFG部分),最後再另外產出一個bin檔是"只有CCFG"的,因為我發現兩個Project的CCFG都一樣,但我不確定會不會有問題。再來我做了2個測試:
1.讓uartcallback的bin檔從0x00000000開始燒錄,接續才燒錄basic_ble的bin檔,最後再0x4E020000燒錄CCFG的bin檔,燒錄完成後按UniFlash左上的Session-> Load Session。
測試結果 : 燒錄成功,不會廣播資料(因為basic_ble這個Project正常是會廣播的,但由於是uartcallback先執行,所以不會廣播資料)
2.讓basic_ble的bin檔從0x00000000開始燒錄,接續才燒錄uartcallback的bin檔,最後再0x4E020000燒錄CCFG的bin檔,燒錄完成後按UniFlash左上的Session-> Load Session。
測試結果 : 燒錄成功,會廣播資料(因為basic_ble這個Project正常是會廣播的)
,
Ryan:
但是這樣子的作法,我還無法確認位址比較後面才燒錄的那個Project能不能成功執行,我測試了先燒錄uartcallback,並且在0x00004000位址燒錄basic_ble,然後使用組合語言嘗試讓他跳過去0x00004000開始執行,如下圖
測試結果沒有成功,有甚麼建議嗎? 或是我Register寫錯呢?
,
Yolande Wang:
Ryan 说:無法確認位址比較後面才燒錄的那個Project能不能成功執行
确保地址0x00004000 处是正确的应用程序入口点,这个地址应该是 basic_ble项目的起始地址。
确保在跳转之前,已经关闭了可能影响程序执行的中断或其他设置。如何设置跳转指令?这个问题查看链接回复:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1328704/cc2340r5-jump-to-address
另外,建议请参阅命令行中使用 UniFlash 读取其 MAC 地址:https://software-dl.ti.com/ccs/esd/uniflash/docs/v7_0/uniflash_quick_start_guide.html#memory-mode
dslite 可以在内存模式下使用来读取特定范围的内存,选择正确的内存范围。
,
Ryan:
1. 有使用uniFlash看過Memory,在0x00004000的位址的值與basic_ble项目的bin檔開頭內容是一樣的。
2.例如GPIO . NVS . LPGTimer等等嗎?
3.命令行中使用 UniFlash 读取其 MAC 地址,是為了能夠正確的擷取每個Project的位址範圍並匯出嗎?
,
Yolande Wang:
是的,您的理解是对的。
第二个.bin 文件没有执行的原因可能有:
第二个 .bin 文件没有被正确烧录到设备的内存中,和其它程序发生地址冲突。
确保 CCFG 的设置正确,没有阻止第二个 .bin 文件的执行
查阅项目的 .map 文件以查看内存内容并确保跳转到您期望的位置。另外,这个链接中的解决方案或许对您有帮助:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1048479/cc2640r2l-updateable-firmware-does-not-start/3887618
,
Ryan:
1.CCFG要去哪裡設置? 2.我目前燒錄兩個Project,是可以共用CCFG的嗎,會不會有可能出錯?3.CCFG區域存的是甚麼? Syscfg的設定嗎? 是否有CCFG裡面儲存內容的資料
,
Yolande Wang:
参考 CC2340 reference manual 第九章节:https://www.ti.com/lit/ug/swcu193/swcu193.pdf?ts=1708925534712&ref_url=https%253A%252F%252Fe2e.ti.com%252F
,
Ryan:
謝謝,我嘗試設中斷點執行到跳位址的地方,單步執行後就進入faultISR的while裡面,而我參考了你給我的文章,進入faultISR有可能是進入無效的位址,但我使用uniFlash看過確實是有值的我查看了.map並沒有任何相關的指令,我上傳了.map檔,裡面似乎沒有有關JUMP_TO_APPLICATION這個函式的相關Assembly
我jump到0x4804這個address有可能是因為CC2340並沒有成功執行asm的code嗎?uart2callback_LP_EM_CC2340R5_freertos_ticlang.map
,
Ryan:
還有個問題,CCS無法使用asm讓暫存器去加常數嗎?像下面這個例子,我讓R0暫存器+4 存到R0 卻編譯失敗
我參考了這個文章ARM Assembly Language Tools v20.2.0.LTS User's Guide (Rev. Z) (ti.com)看起來應該要是可以才對
,
Yolande Wang:
您现在两个 .bin 文件的大小是多少?
怀疑文件太大,导致第二个 project 没有完整烧录进去,所以两次测试结果都是第二个.bin文件没有执行。
,
Ryan:
我使用uniFlash的Memory的Export功能,分別擷取(1)test_ble_1是basic_ble_LP 的 主程式(2)test_ble_2是basic_ble_LP 的 NVS區域
(3) test_ccfg 是 CCFG部分
(4) test_uart_1 是 uartcallback的我在英文論壇中提問 連結 :CC2340R5: Jump to address – Bluetooth forum – Bluetooth®︎ – TI E2E support forums他們回覆說JUMP_TO_APPLICATION" is not an API referenced by the SDK.
是否有可能是我的uartcallback那個process並沒有中斷導致他進入faultISR ,而無法從0x4800開始往下執行嗎?PS.我附上了我的bin檔
test_ble_2.bin test_ccfg_1.bintest_uart_1.bintest_ble_1.bin
,
Yolande Wang:
正如英文论坛工程师所说:“JUMP_TO_APPLICATION”不是SDK引用的API,创建自定义引导加载程序,建议从 mcuboot 和basic_ble_off_chip项目开始。此方法使用两个单独的应用程序/项目从 mcuboot 中的重置开始并跳转到有效的 basic_ble 项目。
可以重点查看学习一下这部分内容: Bluetooth LE SimpleLink Academy Labs
,
Ryan:
1.mcuboot只能跟basic_ble_off_chip這個項目進行搭配嗎?
2.mcuboot似乎是使用OAD進行更新,但是我想要使用uart進行更新,也是一樣嗎?
,
Yolande Wang:
1.不一定,只要项目支持 MCUboot 的引导和固件更新流程即可。根据需要配置和集成到项目中。
2.可以配置 MCUboot ,使它支持通过 uart 接口进行固件更新。
另外您是否可以考虑将你需要的这两个 project 合并到一个项目中。
,
Ryan:
我想先釐清幾個點
1. 目前來說燒錄兩個Project,並使用ARM Assembly的BX直接跳至第二個Project的起始位址,這個方法是完全不可行的?
2.如果使用mcuboot_LP_EM_CC2340R5_nortos_ticlang這個Project,是有辦法跳到basic_ble這個Project的起始位址?
,
Yolande Wang:
想要解决两个不同 project 链接到一起进行烧录的问题,建议还是询问一下 E2E 的资深工程师:CC2340R5: Jump to address – Bluetooth forum – Bluetooth®︎ – TI E2E support forums
如果基于目前遇到的困难给出的解决方案不清晰,您可以把具体需求告诉工程师,看看是否有其它更好的方案。
1.您上面提到的第一种方式,目前没有实际应用过,或者您是从哪里得知的?
2.可以,但是具体实现方式您需要再了解一下。
,
Ryan:
了解,謝謝1. 第一種方法是參考以前的公司專案進行嘗試(但不是CC23XX系列),如果能直接跳轉過去,相對來說會簡易一些2.有關於MCUboot這個Project的相關文章或資料能查閱嗎? 例如之前是否有人能夠成功從MCUboot去跳轉到別的Project等等
,
Yolande Wang:
1.明白您的需求,建议还是等一下 E2E 回复,看如何实现吧
2.上面回答中的链接针对 MCUboot 的介绍很详细,实现的细节也可以看一下这个链接:https://docs.mcuboot.com/
Ryan 说:之前是否有人能夠成功從MCUboot去跳轉到別的Project等等
有的,可以在E2E搜索一下相关问题。
另外,可以看下这个链接:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1253232/cc2340r5-how-about-mcuboot-over-the-uart-download/4758802
,
Ryan:
1.針對MCUBoot有實際操作的文章嗎,這個連結https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1253232/cc2340r5-how-about-mcuboot-over-the-uart-download/4758802我已經看過,但是是技術文章,是否有實際操作的範例之類的?
2.Syscfg裡面的Device Configuration -> Bootloader Configuration也是Bootloader的嗎?
,
Yolande Wang:
1.最直接的例程就是上述提到过的,文章中的类似范例应该没有的。
2.是的,属于 Bootloader 功能范畴
,
Ryan:
1.了解 謝謝
2.那麼Syscfg裡面的Bootloader,他是會額外幫你設置一個區塊是Bootloader的Code嗎?
,
Yolande Wang:
2.会的,您是可以查看的