七步實現(xiàn)STM32MP157多核協(xié)同工作(Cortex-A7與CortexM4通信)
寫在前面:
STM32MP157是ST進軍Linux的首款微處理器,采用MCU+MPU的組合,集成兩顆主頻微800MHz的Cortex-A7應用處理器內(nèi)核(支持開源linux操作系統(tǒng)),和一顆主頻微209M的Cortex-M4微控制器內(nèi)核(完美沿用現(xiàn)有的STM32 MCU生態(tài)系統(tǒng)),既充分滿足多種應用的靈活性需求,又實現(xiàn)了最佳性能和低功耗特性,還支持3D圖形處理單元(3D GPU)。
那STM32MP1系列A核和M核是如何進行通信的呢?
簡單的說,A7和M4兩個核心的通信,是通過底層的IPCC控制器(Inter-Processor communication controller)去通信的,linux中使用RPMsg框架與用戶進行交互。
RPMsg框架(Remote Processor Messaging Framework)是實現(xiàn)對遠程處理器信息傳遞。它是基于VirtIO的消息總線,允許內(nèi)核驅(qū)動程序與系統(tǒng)上可用的遠程處理器進行通信。
STM32MP1多核通信框架如下圖。

A7在RPMsg和Virtio框架創(chuàng)建一個面向用戶態(tài)的/dev/ttyRPMSG接口,ST提供OpenAMP相關庫,M4在OpenAMP上創(chuàng)建虛擬串口,兩個內(nèi)核之間通過串口通信模式,速度非??臁?/p>
Linux系統(tǒng)都封裝好了,ST官方提供的內(nèi)核已經(jīng)默認配置了RPMSG_TTY驅(qū)動,這個環(huán)節(jié)我們就不需要做什么了。
下面我們就通過七個步驟來實現(xiàn)A7和M4之間的通信。
1. 啟動STM32CubeIDE

2. 導入已有工程
點擊File->Import…,選擇Existing Projects into Workspace,點擊NEXT。

瀏覽目錄選擇工程OpenAMP_ TTY _echo,光盤路徑為:
【華清遠見-FS-MP1A開發(fā)資料\02-程序源碼\ARM體系結(jié)構(gòu)與接口技術\Cortex-M4\STM32Cube_FW_MP1_V1.2.0\Projects\STM32MP157C-FSMP1\Applications\OpenAMP\OpenAMP_TTY_echo\STM32CubeIDE】

3. 編譯工程
選擇項目OpenAMP_ TTY _echo_CM4并單擊Build按鈕

4. 開發(fā)板連接
這里使用的是華清遠見FS-MP1A開發(fā)板。
確認開發(fā)板已燒寫系統(tǒng),可運行l(wèi)inux,啟動撥碼撥至010。
開發(fā)板上電,并如下圖連接開發(fā)板USB和ST-Link至PC。

可通過點擊STM32 butterfly按鈕來打開串口控制臺

如果控制臺窗口顯示linux日志或提示信息,則連接成功

5. USB虛擬網(wǎng)線網(wǎng)絡配置
打開控制面板的網(wǎng)絡連接界面,在使用USBmini線連接開發(fā)板和PC后可以在網(wǎng)絡連接界面可看到多了一個Remote NDIS網(wǎng)卡,如下圖。

選中Remot NDIS網(wǎng)卡,右鍵選擇屬性,配置IPv4,選中后點擊屬性,配置IP地址為192.168.7.100,如下圖。

6. 下載固件
選擇項目OpenAMP_ TTY _echo_CM4
選擇Debug按鍵

選擇STM32 Cortex-M C/C++ Application
調(diào)試器 下選擇thru Linux core(Production mode)
選擇Serial Port,可打開設備管理器查看
檢查IP地址,可通過串口控制臺輸入ifconfig指令查看usb0網(wǎng)卡IP地址

如下圖,配置完成后點擊Debug

提示關閉控制臺,點擊Yes

彈出如下窗口,默認無密碼,直接點擊OK
點擊Switch

7. 測試固件
OpenAMP_ TTY _echo_CM4固件主要功能:
CPU2(CM4)初始化OpenAMP MW,后者通過HAL初始化/配置IPCC外設并設置openamp-rpmsg框架基礎結(jié)構(gòu)
CPU2(CM4)為2個虛擬UART實例(UART0和UART1)創(chuàng)建2個 rpmsg通道
CPU2(CM4)在這兩個通道上等待來自CPU1(CA7)的消息
當CPU2(CM4)在1個虛擬UART實例/ rpmsg通道上收到消息時,它將消息發(fā)送回同一虛擬UART實例上的CPU1(CA7)
加載完固件后,重新打開STM32CubeIDE的串行控制臺。

輸入以下命令
初始化ttyRPMSG0配置
stty -onlcr -echo -F /dev/ttyRPMSG0
不斷讀取ttyRPMSG0通道
cat /dev/ttyRPMSG0 &
在一個ttyRPMSG0通道上發(fā)送消息”LED ON”或”LED OFF”可控制開發(fā)板上LED燈點滅狀態(tài),并在同一ttyRPMSG0通道上同時接收回顯
echo "LED ON" > /dev/ttyRPMSG0

本文摘自《華清遠見FS-MP1A開發(fā)板實驗指導手冊》第42章