一、 概述
官方例程都是適用於單個功能模塊的具體功能,但使用端需要將多個功能模塊移植到一個工程環境,以此來適配不同的硬體環境;本文將以 CAN 驅動移植為例,介紹驅動移植過程中可能存在的問題點,或需要注意的地方,以節省開發時間。
硬體平台:E3640 官方開發板(SD103_E3_GATEWAY_ePOWERTRAIN_A03_019),如下圖所示;
軟體平台:e3_gateway_E3640_mcu_demo_E3_SSDK_PTG3.0 中 app_demo XIP Bootloader、 driver_demo flexcan fifo 兩個例程。
二、 IAR 環境配置
為了方便在 Bootloader 軟體中做功能調試,將屏蔽從 Bootloader 跳轉至 app 函數 sdrv_core_force_remap(SDRV_REMAP_SF, SF_MEM_BASE)。
Bootloader 軟體通過 JTAG 有兩種燒寫方式,方式 1 :軟體選擇 Debug 模式,將開發板的 boot 撥至 1110 模式,直接點擊 將軟體運行在 IRAM 上;方式 2 :軟體選擇 Flashdebug 模式,將開發板的 boot 撥至 1110 模式,直接點擊 Project -> Download -> Erase memory,再點擊 Project -> Download -> Download active application,將軟體燒寫到 Flash 中,給開發板斷電,將 boot 撥至 0000 模式運行。
註:方式 2 ,先編譯一下 sf 軟體,再編譯 bootloader 軟體,否則會出錯。
三、 軟體移植
1. CAN 配置文件添加至工程
將 CAN 驅動配置文件添加至工程中,添加文件的路徑:D:\ e3_gateway_E3640\boards\e3_gateway\driver_demo\flexcan\fifo\configs flexcan_cfg.c、flexcan_cfg.h 兩個文件複製,粘貼至這個路徑 D:\ e3_gateway_E3640\boards\e3_gateway\app_demo\xip\bootloader\configs。
將 flexcan_cfg.c 文件添加至 IAR 編譯環境中,如圖所示,關於配置文件一般建議添加至 boards 文件夾中。
圖2 c 文件添加至 IAR 編譯環境
將 flexcan_cfg.h 頭文件添加至 IAR 編譯環境中,如圖所示, Options for node "bootloader"->Assembler->preprocessor。
圖3 h 頭文件添加至 IAR 編譯環境
2. CAN 驅動文件添加至工程
bootloader–FlashDebug -> drivers -> 右擊 -> Add -> Add files -> sdrv_flexcan.c,為方便管理工程文件,將 sdrv_flexcan.c 文件添加至 drivers 文件中,如圖所示。
圖 4 c 文件添加至 drivers 文件
將 sdrv_flexcan.h 頭文件添加至 IAR 工程文件,在 Options for node "bootloader"->Assembler->preprocessor 如圖所示:
圖 5 h 頭文件添加至 IAR 工程文件
3. reset_cfg.c 文件修改
圖 6 board_reset_array 結構體修改
將 rstsig_canfd3_4 外設添加至系統 reset_cfg.c 文件中,使系統復位時同時將 rstsig_canfd3_4 外設復位,否則會出現 CAN 斷言錯誤。
註:在做底層驅動移植時,要注意這個 board_reset_array 結構體變量的內容,將相應的外設添加至系統復位結構體中,否則系統會出現不穩定錯誤,同時注意 NUM_OF_RSTGEN_SIGS 變量的修改。
4. config.h 文件修改
增加如下兩個宏開關,
#define CONFIG_IRQ 1
#define CONFIG_VIC_IRQ_INTERRUPT_MODE 1
註:如果增加宏開關編譯工程出錯, “no definition for "vectored_irq1_handler"”,在 drivers 中增加 sdrv_vic_s.S 文件,即可編譯通過。
5. 代碼修改
CAN中斷回調函數
static void flexcan_transfer_callback(flexcan_handle_t *handle,flexcan_status_e status, uint32_t result, void *userData)
{
flexcan_frame_t *buf = (flexcan_frame_t *)userData;
switch (status) {
case FLEXCAN_RX_IDLE:
/* CAN接收數據中斷,接收數據buf */
break;
case FLEXCAN_RX_FIFO_IDLE:
/* CAN接收數據中斷,接收數據buf */
break;
case FLEXCAN_TX_IDLE:
/* CAN發送成功中斷 */
break;
case FLEXCAN_WAKEUP_TIMEOUT:
break;
case FLEXCAN_WAKEUP_MATCH:
break;
case FLEXCAN_ERROR_STATUS:
break;
default:
break;
}
}
6. 代碼測試
6.1 CAN 數據發送
周期發送代碼如下:
static void flexcan_send_demo(flexcan_handle_t *handle, uint8_t tx_index)
{
flexcan_frame_t frame = {.id = 0x327,
.length = 8,
.type = FLEXCAN_FrameTypeData,
.format = FLEXCAN_STANDARD_FRAME,
.dataBuffer = &send_data[0]};
flexcan_mb_transfer_t xfer = {&frame, tx_index};
if (flexcan_get_mb_state(handle, tx_index) == FLEXCAN_StateIdle) {
flexcan_send_nonblocking(handle, &xfer, TX_PADDING_VAL);
} else {
ssdk_printf(SSDK_NOTICE,
"controller_id=%d mb%d is not available for send\r\n",
handle->controller_id, tx_index);
}
}
用 CAN 盒接收的數據如下:
圖7 CAN 盒接收的數據
圖 8 串口助手列印CAN發送數據幀圖
6.2 CAN 數據接收
軟體例程採用硬體濾波方式對數據進行過濾,用 CAN 盒模擬發送數據幀,0x327 00 11 22 33 44 55 66 77,如下圖所示,通過串口調試助手列印輸出的 CAN 接收幀信息如下圖所示。
圖 9 CAN 模擬數據幀發送
圖 10 串口助手列印 CAN 接收數據幀圖
四、 參考文檔
《AppNote_E3_Boot_and_OTA_Rev01.05》
《AppNote_E3_燒錄流程_Rev2.0》
歡迎在博文下方留言評論,我們會及時回復您的問題。如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com
作者:Linna / 王麗娜
評論
Corgi
2 個月前
佚枫
6 個月前