91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解極海G32R501 MCU的兩核外設(shè)分配

Geehy極海半導(dǎo)體 ? 來源:21ic論壇極海半導(dǎo)體專區(qū) ? 2026-01-13 12:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

《極海芯得》系列內(nèi)容為用戶使用極海系列產(chǎn)品的經(jīng)驗(yàn)總結(jié),均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū),全文未作任何修改,未經(jīng)原文作者授權(quán)禁止轉(zhuǎn)載。

你有沒有遇到過這樣的尷尬場(chǎng)景:當(dāng)你想讓CPU0和CPU1“好好相處”,卻發(fā)現(xiàn)它倆居然會(huì)搶外設(shè)用?一邊還在想“我的GPIO在哪?為什么跑到另一個(gè)核上了?”一邊翻著用戶手冊(cè),看著漫天寄存器名稱腦殼疼。

如果你也有這種體驗(yàn),那么恭喜你,說明你已經(jīng)開始入坑G32R501這款雙核MCU啦!今天咱們就來聊一聊,G32R501到底是如何讓兩核共享、分配外設(shè)的,順便也整點(diǎn)代碼案例,讓你的雙核之路不再迷茫。

1、雙核背景:G32R501長(zhǎng)啥樣?

在這顆稱為G32R501Dx的MCU里,最顯著的特征當(dāng)然是雙核配置。該芯片的硬件方框圖里,CPU0和CPU1像一對(duì)“歡喜冤家”,帶著各自的Cache、RAM,整整齊齊地駐扎在芯片內(nèi)部。

e18bc702-ed25-11f0-92de-92fbcf53809c.png

那么問題來了:既然是兩核,那么外設(shè)該給誰用?假設(shè)把GPIO都分給CPU1了,那CPU0干瞪眼怎么辦?這就需要寄存器來進(jìn)行訪問控制啦。

2、外設(shè)訪問控制:PERIPH_AC

如果你去翻《G32R501用戶手冊(cè)V1.5.pdf》,在12.10章節(jié)就能看到一個(gè)叫“PERIPH_AC”的訪問控制寄存器。它的作用是給各大外設(shè)(例如ADCA、ADCB等)指定訪問權(quán)限。可以簡(jiǎn)單理解為:“CPU0能不能讀寫這個(gè)外設(shè)?”、“CPU1有沒有權(quán)限?”、“DMA能不能參與進(jìn)來?”等。

2.1 寄存器結(jié)構(gòu)

以ADCB為例,手冊(cè)里對(duì)它的訪問控制寄存器(ADCB_AC)是這樣描述的:

? CPU0_ACC、CPU1_ACC、DMA1_ACC這幾位,分別控制了 CPU0、CPU1和DMA1的讀寫權(quán)限。

? 如果組合值是00,就完全禁止讀寫;

? 10就是“只讀+清除類訪問,但禁寫”;

? 11就是讀寫全開,好比“VIP通道”。

手冊(cè)上寫的比我說的要嚴(yán)謹(jǐn)許多,歡迎自行參閱。大概的寄存器表長(zhǎng)這樣:

e1e52ee6-ed25-11f0-92de-92fbcf53809c.png

2.2 庫函數(shù)調(diào)用

如果嫌翻寄存器表累,SDK已經(jīng)貼心地給你封裝好了函數(shù)。在driverlib庫里,你能看到類似如下的函數(shù)原型

(SysCtl_setPeripheralAccessControl):

static inline void

SysCtl_setPeripheralAccessControl(SysCtl_AccessPeripheral peripheral,

SysCtl_AccessMaster master,

SysCtl_AccessPermission permission)

{

//

// Set master permissions for specified peripheral. Each master has

// two bits dedicated to its permission setting.

//

WRPRT_DISABLE;

HWREG(PERIPHAC_BASE + (uint16_t)peripheral * 2) =

(HWREG(PERIPHAC_BASE + (uint16_t)peripheral * 2) &

~(0x3U << (uint16_t)master)) |

((uint16_t)permission << (uint16_t)master);

WRPRT_ENABLE;

}

如果想快速禁止CPU1對(duì)ADCB的讀寫,只要一個(gè)函數(shù)調(diào)用搞定。這樣的封裝對(duì)于新手異常友好,再也不怕記不住寄存器偏移了!

3、GPIO訪問控制:主核歸誰?

GPIO對(duì)MCU來說簡(jiǎn)直是門面擔(dān)當(dāng)!想拿一個(gè)MCU“亮燈”(HelloWorld)的第一步,一般就是點(diǎn)GPIO嘛。這時(shí),如果你拿到G32R501,會(huì)發(fā)現(xiàn)它可以對(duì)GPIO做“主核”綁定——告訴芯片,這個(gè)GPIO到底是歸CPU0還是CPU1來管理。

3.1 GPxCSELx寄存器

在用戶手冊(cè)21.9.16和21.9.36等章節(jié)里,你能找到GPxCSELx之類的寄存器說明,比如“GPACSEL1”,它里面每?jī)晌痪涂刂埔粋€(gè)GPIO引腳的主核。00代表CPU0,01代表CPU1。

e245fd52-ed25-11f0-92de-92fbcf53809c.png

3.2驅(qū)動(dòng)庫函數(shù):GPIO_setMasterCore

驅(qū)動(dòng)庫同樣貼心地幫你把“燒腦寄存器”給封裝起來了:

void

GPIO_setMasterCore(uint32_t pin, GPIO_CoreSelect core)

{

volatile uint32_t *gpioBaseAddr;

uint32_t cSelIndex;

uint32_t shiftAmt;

//

// Check the arguments.

//

ASSERT(GPIO_isPinValid(pin));

gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE +

((pin / 32U) * GPIO_CTRL_REGS_STEP);

shiftAmt = (uint32_t)GPIO_GPACSEL1_GPIO1_S * (pin % 8U);

cSelIndex = GPIO_GPxCSEL_INDEX + ((pin % 32U) / 8U);

//

// Write the core parameter into the register.

//

WRPRT_DISABLE;

gpioBaseAddr[cSelIndex] &= ~((uint32_t)GPIO_GPACSEL1_GPIO0_M << shiftAmt);

gpioBaseAddr[cSelIndex] |= (uint32_t)core << shiftAmt;

WRPRT_ENABLE;

}

一句話:傳入你想設(shè)置的pin號(hào)碼,以及指定的CPU是CPU0還是CPU1,函數(shù)就會(huì)幫你把寄存器給改好,能省不少功夫。

4、外部中斷分配:EXTI_xMASKx

被搶得最慘的除了GPIO,另一個(gè)八成就是中斷了。你肯定不想讓A核測(cè)溫度時(shí)觸發(fā)的外部中斷,把B核的運(yùn)動(dòng)控制流程打斷了吧?因此,需要由寄存器來控制“這個(gè)中斷我想讓誰來響應(yīng)”,把中斷優(yōu)雅地“送”到某個(gè)核心。

4.1 EXTI_IMASKx、EXTI_EMASKx

在14.6.5章節(jié),官方給我們準(zhǔn)備了 EXTI_IMASK0、EXTI_IMASK1以及 EMASK0、EMASK1等寄存器。它們就是中斷、事件屏蔽寄存器,用來控制相應(yīng)的外部中斷或外部事件是否允許CPU0或CPU1進(jìn)行響應(yīng)。屏蔽位為0時(shí)就啥也收不到,置1就能開啟。

e2a0aed2-ed25-11f0-92de-92fbcf53809c.png

對(duì)應(yīng)的driverlib函數(shù)舉個(gè)栗子:

static inline void

EXTI_enableInterrupt(EXTI_CoreSelect core, EXTI_LineNumber lineNumber)

{

WRPRT_DISABLE;

if(core == EXTI_CORE_CPU0)

{

HWREG(EXTI_BASE + EXTI_O_IMASK0) |= (1U << (uint32_t)lineNumber);

}

else

{

HWREG(EXTI_BASE + EXTI_O_IMASK1) |= (1U << (uint32_t)lineNumber);

}

WRPRT_ENABLE;

}

static inline void

EXTI_disableInterrupt(EXTI_CoreSelect core, EXTI_LineNumber lineNumber)

{

WRPRT_DISABLE;

if(core == EXTI_CORE_CPU0)

{

HWREG(EXTI_BASE + EXTI_O_IMASK0) &= ~(1U << (uint32_t)lineNumber);

}

else

{

HWREG(EXTI_BASE + EXTI_O_IMASK1) &= ~(1U << (uint32_t)lineNumber);

}

WRPRT_ENABLE;

}

static inline void

EXTI_enableEvent(EXTI_CoreSelect core, EXTI_LineNumber lineNumber)

{

WRPRT_DISABLE;

if(core == EXTI_CORE_CPU0)

{

HWREG(EXTI_BASE + EXTI_O_EMASK0) |= (1U << (uint32_t)lineNumber);

}

else

{

HWREG(EXTI_BASE + EXTI_O_EMASK1) |= (1U << (uint32_t)lineNumber);

}

WRPRT_ENABLE;

}

static inline void

EXTI_disableEvent(EXTI_CoreSelect core, EXTI_LineNumber lineNumber)

{

WRPRT_DISABLE;

if(core == EXTI_CORE_CPU0)

{

HWREG(EXTI_BASE + EXTI_O_EMASK0) &= ~(1U << (uint32_t)lineNumber);

}

else

{

HWREG(EXTI_BASE + EXTI_O_EMASK1) &= ~(1U << (uint32_t)lineNumber);

}

WRPRT_ENABLE;

}

只要指定core(CPU0orCPU1)和外部中斷線,就可以輕松讓中斷“跑”到想去的核。

5、CPU1響應(yīng)外部中斷示例

既然說到這里,咱們就結(jié)合SDK例程來場(chǎng)“真刀真槍”。SDK里有兩個(gè)經(jīng)典示例:

1.CPU1基礎(chǔ)例程(ipc_ex2_mailbox_pollingcpu1)

2.外部中斷例程(interrupt_ex1_external)

假設(shè)我們想在CPU1那邊也玩外部中斷,咔咔地檢測(cè)某個(gè)輸入腳“電平墜落”。那就需要做哪些修改呢?

5.1 修改代碼

ipc_ex2_mailbox_pollingcpu1原始代碼里只是一個(gè)單純的IPC消息收發(fā)demo,沒有外部中斷,我們新增了CPU1對(duì)于XINT1(等效EXTI_LINE_4)的中斷響應(yīng)。要點(diǎn)如下:

1.注冊(cè)并開啟INT_XINT1中斷向量

2.在初始化階段,禁用CPU0對(duì)XINT1的中斷,啟用CPU1對(duì)XINT1的中斷

3.將GPIO0配置為觸發(fā)XINT1

4.在ISR中,通過EXTI_getInterruptStatus等方法判斷并清除中斷,順便做點(diǎn)LED狀態(tài)改變、計(jì)數(shù)打印等事情。

5.2 實(shí)際代碼

復(fù)現(xiàn)時(shí)可以把下面的代碼全部復(fù)制至ipc_ex2_mailbox_pollingcpu1sourceipc_ex2_mailbox_polling_cpu1.c

//#############################################################################

//

// FILE: ipc_ex2_mailbox_polling_cpu1.c

//

// TITLE: IPC Mailbox with Polling Example

//

// VERSION: 1.0.0

//

// DATE: 2025-01-15

//

//! addtogroup driver_example_list

//!

IPC Mailbox with Polling

//!

//! This example demonstrates how to use the mailbox mechanism of the Inter-Processor

//! Communication (IPC) module, to send and receive data between two CPUs in polling mode.

//!

//! In this example:

//! 1. CPU0 sends a message to CPU1 via the IPC module in polling mode.

//! 2. CPU1 sends a message back to CPU0 in polling mode.

//! 3. CPU0 receives the message sent from CPU1 in polling mode, and so on.

//!

//! ote Note: The IPC example includes both CPU0 and CPU1 projects.

//! Please compile the CPU1 project before compiling the CPU0 project.

//!

//! Running the Application

//! Open a COM port with the following settings using a terminal:

//! - Find correct COM port

//! - Bits per second = 115200

//! - Data Bits = 8

//! - Parity = None

//! - Stop Bits = 1

//! - Hardware Control = None

//!

//! External Connections

//! Connect the UART-A port to a PC via a transceiver and cable.

//! - GPIO28 is UART_RXD (Connect to Pin3, PC-TX, of serial DB9 cable)

//! - GPIO29 is UART_TXD (Connect to Pin2, PC-RX, of serial DB9 cable)

//!

//! Watch Variables

//! - None.

//!

//

//#############################################################################

//

//

// $Copyright:

// Copyright (C) 2024 Geehy Semiconductor - http://www.geehy.com/

//

// You may not use this file except in compliance with the

// GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).

//

// The program is only for reference, which is distributed in the hope

// that it will be useful and instructional for customers to develop

// their software. Unless required by applicable law or agreed to in

// writing, the program is distributed on an "AS IS" BASIS, WITHOUT

// ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.

// See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions

// and limitations under the License.

// $

//#############################################################################

//

// Included Files

//

#include"driverlib.h"

#include"device.h"

#include"board.h"

#include

//

// How many message is used to test mailbox sending and receiving

//

#defineMESSAGE_LENGTH 4U

//

// Variables

//

static uint32_t g_msgRecv[MESSAGE_LENGTH];

volatile uint32_t xint1Count;

//

// Function Prototypes

//

void clearMsgRecv(void);

void UART_Init(void);

void xint1ISR(void);

//

// Main

//

void example_main(void)

{

//

// Initialize device clock and peripherals

//

Device_init();

//

// Initialize NVIC and clear NVIC registers. Disables CPU interrupts.

//

Interrupt_initModule();

//

// Initialize the NVIC vector table with pointers to the shell Interrupt

// Service Routines (ISR).

//

Interrupt_initVectorTable();

//

// Interrupts that are used in this example are re-mapped to

// ISR functions found within this file.

//

Interrupt_register(INT_XINT1, &xint1ISR);

//

// Board Initialization

//

Board_init();

//

// Enables CPU interrupts

//

Interrupt_enableMaster();

//

// UART initialize

//

UART_Init();

xint1Count = 0; // Count XINT1 interrupts

//

// CPU1 Print information

//

printf("CPU1 has completed booting, Interrupt. ");

//

// Clear the g_msgRecv array before receive

//

clearMsgRecv();

//

// CPU1 receive message from CPU0

//

while (IPC_isRxBufferFull(IPC_RX_0) != true);

g_msgRecv[0] = IPC_receive32Bits(IPC_RX_0);

while (IPC_isRxBufferFull(IPC_RX_1) != true);

g_msgRecv[1] = IPC_receive32Bits(IPC_RX_1);

while (IPC_isRxBufferFull(IPC_RX_2) != true);

g_msgRecv[2] = IPC_receive32Bits(IPC_RX_2);

while (IPC_isRxBufferFull(IPC_RX_3) != true);

g_msgRecv[3] = IPC_receive32Bits(IPC_RX_3);

//

// CPU1 send message back to CPU0

//

while (IPC_isTxBufferEmpty(IPC_TX_0) != true);

IPC_transmit32Bits(IPC_TX_0, g_msgRecv[0]);

while (IPC_isTxBufferEmpty(IPC_TX_1) != true);

IPC_transmit32Bits(IPC_TX_1, g_msgRecv[1]);

while (IPC_isTxBufferEmpty(IPC_TX_2) != true);

IPC_transmit32Bits(IPC_TX_2, g_msgRecv[2]);

while (IPC_isTxBufferEmpty(IPC_TX_3) != true);

IPC_transmit32Bits(IPC_TX_3, g_msgRecv[3]);

//

// Set the priority group to indicate the PREEMPT and SUB priortiy bits.

//

Interrupt_setPriorityGroup(INTERRUPT_PRIGROUP_PREEMPT_7_6_SUB_5_0);

//

// Set the global and group priority to allow CPU interrupts

// with higher priority

//

Interrupt_setPriority(INT_XINT1,1,0);

//

// Enable XINT1 and XINT2 in the NVIC.

// Enable INT1 which is connected to WAKEINT:

//

Interrupt_enable(INT_XINT1);

//

// Enable Global Interrupt and real time interrupt

//

EINT;

ERTM;

//

// GPIO0 is mapped to XINT1

//

GPIO_setMasterCore(0, GPIO_CORE_CPU1);

GPIO_setInterruptPin(0, GPIO_INT_XINT1);

EXTI_disableInterrupt(EXTI_CORE_CPU0, EXTI_LINE_4);

EXTI_enableInterrupt(EXTI_CORE_CPU1, EXTI_LINE_4);

//

// Configure falling edge trigger for XINT1

//

GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);

//

// Enable XINT1

//

GPIO_enableInterrupt(GPIO_INT_XINT1); // Enable XINT1

//

// Loop.

//

for(;;)

{

}

}

//

// xint1ISR - External Interrupt 1 ISR

//

void xint1ISR(void)

{

//

// Get External Interrupt 1 status

//

if(EXTI_getInterruptStatus(EXTI_CORE_CPU1, EXTI_LINE_4))

{

GPIO_togglePin(myGPIOOutput_LED2);

xint1Count++;

printf("CPU1 EXTI Interrupt: %02d ",xint1Count);

//

// Clear external interrupt 1 status

//

EXTI_clearInterruptStatus(EXTI_CORE_CPU1, EXTI_LINE_4);

}

}

//

// Function to clear the g_msgRecv array.

// This function set g_msgRecv to be 0.

//

void clearMsgRecv(void)

{

uint32_t i;

for (i = 0U; i < MESSAGE_LENGTH; i++)

{

g_msgRecv[i] = 0U;

}

}

//

// UART initialize

//

void UART_Init(void)

{

//

// GPIO28 is the UART Rx pin.

//

GPIO_setMasterCore(DEVICE_GPIO_PIN_UARTRXDA, GPIO_CORE_CPU1);

GPIO_setPinConfig(DEVICE_GPIO_CFG_UARTRXDA);

GPIO_setDirectionMode(DEVICE_GPIO_PIN_UARTRXDA, GPIO_DIR_MODE_IN);

GPIO_setDrivingCapability(DEVICE_GPIO_PIN_UARTRXDA,GPIO_DRIVE_LEVEL_VERY_HIGH);

GPIO_setPadConfig(DEVICE_GPIO_PIN_UARTRXDA, GPIO_PIN_TYPE_STD);

GPIO_setQualificationMode(DEVICE_GPIO_PIN_UARTRXDA, GPIO_QUAL_ASYNC);

//

// GPIO29 is the UART Tx pin.

//

GPIO_setMasterCore(DEVICE_GPIO_PIN_UARTTXDA, GPIO_CORE_CPU1);

GPIO_setPinConfig(DEVICE_GPIO_CFG_UARTTXDA);

GPIO_setDirectionMode(DEVICE_GPIO_PIN_UARTTXDA, GPIO_DIR_MODE_OUT);

GPIO_setDrivingCapability(DEVICE_GPIO_PIN_UARTTXDA,GPIO_DRIVE_LEVEL_VERY_HIGH);

GPIO_setPadConfig(DEVICE_GPIO_PIN_UARTTXDA, GPIO_PIN_TYPE_STD);

GPIO_setQualificationMode(DEVICE_GPIO_PIN_UARTTXDA, GPIO_QUAL_ASYNC);

//

// Initialize UARTA and its FIFO.

//

UART_performSoftwareReset(UARTA_BASE);

//

// Configure UARTA for echoback.

//

UART_setConfig(UARTA_BASE, DEVICE_LSPCLK_FREQ, 115200, (UART_CONFIG_WLEN_8 |

UART_CONFIG_STOP_ONE |

UART_CONFIG_PAR_NONE));

UART_resetChannels(UARTA_BASE);

UART_resetRxFIFO(UARTA_BASE);

UART_resetTxFIFO(UARTA_BASE);

UART_clearInterruptStatus(UARTA_BASE, UART_INT_TXFF | UART_INT_RXFF);

UART_enableFIFO(UARTA_BASE);

UART_enableModule(UARTA_BASE);

UART_performSoftwareReset(UARTA_BASE);

}

#ifdefined(__CC_ARM) || defined(__ARMCC_VERSION)

//

// Redefine the fputc function to the serial port

//

int fputc(int ch, FILE* f)

{

if (ch == ' ')

{

UART_writeCharBlockingNonFIFO(UARTA_BASE, (uint8_t)' ');

}

UART_writeCharBlockingNonFIFO(UARTA_BASE, (uint8_t)ch);

return (ch);

}

#elifdefined(__ICCARM__)

int __io_putchar(int ch)

{

if (ch == ' ')

{

UART_writeCharBlockingNonFIFO(UARTA_BASE, (uint8_t)' ');

}

UART_writeCharBlockingNonFIFO(UARTA_BASE, (uint8_t)ch);

return (ch);

}

int __write(int file, char* ptr, int len)

{

int i;

for (i = 0; i < len; i++)

{

__io_putchar(*ptr++);

}

return len;

}

#elifdefined (__clang__) && !defined (__ARMCC_VERSION)

int uart_putc(char ch, FILE *file)

{

if (ch == ' ')

{

UART_writeCharBlockingNonFIFO(UARTA_BASE, (uint8_t)' ');

}

UART_writeCharBlockingNonFIFO(UARTA_BASE, (uint8_t)ch);

return (ch);

}

static FILE __stdio = FDEV_SETUP_STREAM(uart_putc, NULL, NULL, _FDEV_SETUP_WRITE);

FILE *const stdin = &__stdio;

__strong_reference(stdin, stdout);

__strong_reference(stdin, stderr);

#endif

//

// End of File

//

5.3 運(yùn)行效果

如果一切順利,當(dāng)GPIO0產(chǎn)生上下跳沿時(shí),CPU1的XINT1服務(wù)例程會(huì)被觸發(fā)。

LED隨之閃爍,串口打印出類似“CPU1EXTIInterrupt:01”“CPU1EXTIInterrupt:02”等等。

當(dāng)你看到CPU1自信地響應(yīng)外部中斷,CPU0則不為所動(dòng),就說明“多核外部中斷獨(dú)立控制”成功啦!

e300f9cc-ed25-11f0-92de-92fbcf53809c.png

6、踩坑

凡事說起來都挺美好,可實(shí)際開發(fā)過程中,踩坑是免不了的。下面就分享一些常見“翻車”瞬間,讓各位少走點(diǎn)彎路:

1. 開小差就忘了WRPRT_DISABLE/WRPRT_ENABLE

在寫各種訪問控制寄存器時(shí),經(jīng)常需要先“解鎖”再寫,然后再“上鎖”。如果忘了在修改前后來一句

WRPRT_DISABLE;

…(寄存器操作)…

WRPRT_ENABLE;

那么你會(huì)發(fā)現(xiàn)自己改了半天沒生效。這個(gè)“解鎖-上鎖”機(jī)制就像給寄存器設(shè)置了“防熊孩子模式”,不解鎖是改不動(dòng)的。沒做對(duì)的話,一定會(huì)抓瞎很久。

2. 訪問權(quán)限沒開足

你可能會(huì)納悶:“為什么CPU0能讀寫外設(shè),CPU1卻獲取不到數(shù)據(jù)?”別苦惱,先檢查一下PERIPH_AC里面有沒有給CPU1設(shè)置Full Access。要是權(quán)限只開了半截(Protected Read之類),CPU1寫不進(jìn)去也正常??!

3. GPIO主核選擇忘了改

當(dāng)你興致勃勃地在CPU1里調(diào)用GPIO_writePin(XX, HIGH),結(jié)果測(cè)量腳位卻毫無波動(dòng)——很可能是GPIO主核依然掛在CPU0身上… 莫名其妙,就像你在隔壁家燈的開關(guān)上亂按,當(dāng)然亮不了自家燈。

所以一定別忘了GPIO_setMasterCore(pin, GPIO_CORE_CPU1)或GPIO_CORE_CPU0!

歡迎各位在評(píng)論區(qū)留下配置雙核訪問不同外設(shè)的小tip吧!

原文地址:https://bbs.21ic.com/icview-3501421-1-1.html?_dsign=fe2bb841

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18934

    瀏覽量

    398544
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5608

    瀏覽量

    130016
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1329

    瀏覽量

    56236

原文標(biāo)題:極海芯得 EP.71 | G32R501的兩核外設(shè)分配,竟然還能這么玩!

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用vscode和cmake工具開發(fā)G32R501 MCU

    目前官方提供的 IDE 開發(fā)環(huán)境有 Keil/IAR/Eclipse。都能很好的完成開發(fā),但是 VS Code 配合 CMake 工具是更加“現(xiàn)代”的C/C++開發(fā)環(huán)境,本文提供了在 VS Code 環(huán)境下的開發(fā)經(jīng)驗(yàn),以供參考。
    的頭像 發(fā)表于 11-25 14:45 ?3131次閱讀
    使用vscode和cmake工具開發(fā)<b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b> <b class='flag-5'>MCU</b>

    G32R501數(shù)據(jù)手冊(cè)# 內(nèi)置FPU,支持 Arm Helium,實(shí)時(shí)控制 MCU

    G32R501實(shí)時(shí)控制MCU : 基本信息 : G32R5系列實(shí)時(shí)控制MCU搭載Arm v8
    的頭像 發(fā)表于 02-19 13:58 ?3279次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>數(shù)據(jù)手冊(cè)# 內(nèi)置FPU,支持 Arm Helium,實(shí)時(shí)控制 <b class='flag-5'>MCU</b>

    使用CMake+VSCode環(huán)境移植ThreadX到G32R501 MCU

    我本人是 cmake+vscode 組合的忠實(shí)用戶,之前寫了一篇文章介紹了在 cmake+vscode 環(huán)境下開發(fā) G32R501 的一些實(shí)踐經(jīng)驗(yàn)。這篇文章準(zhǔn)備更進(jìn)一步:移植一個(gè)ThreadX。
    的頭像 發(fā)表于 03-09 14:04 ?683次閱讀
    使用CMake+VSCode環(huán)境移植ThreadX到<b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b> <b class='flag-5'>MCU</b>

    Cortex-M52內(nèi)核MCU G32R501在CoreMark的表現(xiàn)如何

    要真正衡量一顆MCU的運(yùn)算實(shí)力,CoreMark成績(jī)往往是一個(gè)比較客觀、公認(rèn)的參考指標(biāo)。到底這個(gè)G32R501跑起CoreMark來能交出怎樣的成績(jī)單?今天就讓我們一起“探秘”一番,看這款Cortex-M52 MCU在CoreM
    的頭像 發(fā)表于 03-09 14:09 ?688次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b>Cortex-M52內(nèi)核<b class='flag-5'>MCU</b> <b class='flag-5'>G32R501</b>在CoreMark的表現(xiàn)如何

    G32R501實(shí)時(shí)控制 MCU 跨域新境界丨面向新一代高效能高實(shí)時(shí)控制設(shè)備

    首款基于Arm? Cortex?-M52雙架構(gòu)的實(shí)時(shí)控制MCU——G32R501
    發(fā)表于 01-07 18:06 ?1604次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>實(shí)時(shí)控制 <b class='flag-5'>MCU</b> 跨域新境界丨面向新一代高效能高實(shí)時(shí)控制設(shè)備

    實(shí)時(shí)自控 精準(zhǔn)調(diào)速 | G32R501 2.2kW高性能矢量變頻器參考方案

    和穩(wěn)定性,同時(shí)降低能耗和排放。這些特性使其更符合國(guó)際節(jié)能減排目標(biāo)要求。 2.2kW高性能 矢量變頻器參考方案介紹 G32R501 2
    發(fā)表于 03-10 18:18 ?1314次閱讀
    實(shí)時(shí)自控 精準(zhǔn)調(diào)速 | <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b> 2.2kW高性能矢量變頻器參考方案

    于electronica 2024展示G32R5高性能實(shí)時(shí)控制MCU

    近日,在2024德國(guó)慕尼黑國(guó)際電子元器件博覽會(huì)(electronica 2024)上大放異彩,展示了其最新的G32R5高性能實(shí)時(shí)控制MCU。 在此次博覽會(huì)上,
    的頭像 發(fā)表于 12-16 13:42 ?1411次閱讀

    高效雙控 精準(zhǔn)卓越 | G32R501低壓無感雙電機(jī)參考方案

    降低成本、提高系統(tǒng)可靠性以及簡(jiǎn)化電機(jī)結(jié)構(gòu)方面具有顯著優(yōu)勢(shì)。 隨著無傳感器電機(jī)控制技術(shù)的逐步成熟,其在工業(yè)自動(dòng)化、旋翼飛行器、空調(diào)外機(jī)等領(lǐng)域迎來廣闊的市場(chǎng)應(yīng)用前景。緊跟行業(yè)技術(shù)發(fā)展趨勢(shì),推出G32R501低壓無感雙
    發(fā)表于 01-16 16:12 ?744次閱讀
    高效雙控 精準(zhǔn)卓越 | <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>低壓無感雙電機(jī)參考方案

    高效轉(zhuǎn)換 實(shí)時(shí)調(diào)控 | 基于G32R501的800W雙路MPPT微型逆變器參考方案

    ,更是推動(dòng)綠色能源普及的重要技術(shù)載體。 推出G32R501 800W雙路MPPT微型逆變器參考方案,旨在以更高效、更智能的量產(chǎn)級(jí)技術(shù)方案,助力全球能源轉(zhuǎn)型。該方案通過G32R501
    發(fā)表于 02-26 11:07 ?669次閱讀
    高效轉(zhuǎn)換 實(shí)時(shí)調(diào)控 | 基于<b class='flag-5'>G32R501</b>的800W雙路MPPT微型逆變器參考方案

    半導(dǎo)體榮登2025中國(guó)IC設(shè)計(jì)Fabless100排行榜之TOP10微控制器公司

    近日,在“中國(guó)IC設(shè)計(jì)成就獎(jiǎng)”頒獎(jiǎng)典禮中,微上榜中國(guó)微控制器公司Top 10,G32R501實(shí)時(shí)控制MCU斬獲“2025年度MCU”獎(jiǎng),
    的頭像 發(fā)表于 04-01 09:43 ?2005次閱讀

    半導(dǎo)體全數(shù)字雙向電源參考方案助力能效躍升

    半導(dǎo)體憑借在工業(yè)應(yīng)用領(lǐng)域深厚的技術(shù)積累,推出了基于G32R501實(shí)時(shí)控制MCU的全數(shù)字雙向電源參考方案,該方案具備高效率、高可靠、高轉(zhuǎn)換率、低噪聲和高性價(jià)比等特點(diǎn),為企業(yè)應(yīng)對(duì)關(guān)稅沖
    的頭像 發(fā)表于 04-12 14:15 ?1030次閱讀

    半導(dǎo)體G32R501:面向具身機(jī)器人的高性能、高安全實(shí)時(shí)控制MCU/DSP

    要求。 ? ? 今天,在第十五屆松山湖中國(guó)IC創(chuàng)新高峰論壇中,珠海半導(dǎo)體有限公司實(shí)時(shí)控制MCU/DSP產(chǎn)品線高級(jí)產(chǎn)品經(jīng)理盧鵬升帶來了面向具身機(jī)器人的高性能、高安全實(shí)時(shí)控制MCU/D
    發(fā)表于 05-13 12:12 ?1586次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b>半導(dǎo)體<b class='flag-5'>G32R501</b>:面向具身機(jī)器人的高性能、高安全實(shí)時(shí)控制<b class='flag-5'>MCU</b>/DSP

    G32R501工業(yè)六軸機(jī)械臂參考方案釋放工業(yè)4.0產(chǎn)業(yè)價(jià)值

    揮著重要作用,是現(xiàn)代工業(yè)自動(dòng)化和智能化生產(chǎn)的核心工具。據(jù)Grand View Research數(shù)據(jù)分析,2024年全球工業(yè)機(jī)器人市場(chǎng)規(guī)模約為340億美元,預(yù)計(jì)2025年至2030年將以9.9%的復(fù)合年增長(zhǎng)率持續(xù)增長(zhǎng),展現(xiàn)出巨大的市場(chǎng)潛力。 工業(yè)六軸機(jī)械臂參考方案,采用
    發(fā)表于 06-23 13:52 ?1836次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>工業(yè)六軸機(jī)械臂參考方案釋放工業(yè)4.0產(chǎn)業(yè)價(jià)值

    特來電攜手半導(dǎo)體推出G32R501T實(shí)時(shí)控制MCU

    聯(lián)合開發(fā)的G32R501T實(shí)時(shí)控制MCU,這不僅是對(duì)AI智能充電與新能源領(lǐng)域核心技術(shù)的一次深度定義,更標(biāo)志著高端電源主控芯片朝著自主化、智能化邁出堅(jiān)實(shí)一步。
    的頭像 發(fā)表于 11-04 09:21 ?832次閱讀

    G32R501芯片與Jlink適配的過程解析

    適配芯片至Jlink,網(wǎng)上已經(jīng)有許許多多的博客介紹了,但今天我們的主角G32R501不太一般,要是我們按照普通的芯片適配流程,大家會(huì)發(fā)現(xiàn)在最終對(duì)芯片進(jìn)行程序進(jìn)行下載的時(shí)候無法成功,那這是為什么呢?本文給大家介紹一下G32R501芯片,在適配Jlink的正確姿勢(shì)!
    的頭像 發(fā)表于 02-25 13:47 ?313次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>芯片與Jlink適配的過程解析