Keil配合CubeMX实现C和C++混合编程(附详细代码教程)

众所周知,keil是一个支持C和C++的编译平台。

但是,真要用起来C和C++混合编程,真是蜜蜂触电——麻了个bee。。

那么,该怎么做呢?

注意,本笔记输出日期为:2024.5.25,后面可能会出现版本更迭造成方法的部分改变,一定要注意!

现在,且听我慢慢道来。

第一步,掏出CubeMX生成的工程,打开.uvprojx,这里我点灯大师用我心爱的电灯程序做示例。

然后,新增.cpp文件以及其对应的.h文件,新建完之后就是这样的(新增文件为:led.cpp、led_control.cpp、led.h)

第二步,填入点灯代码

这里我用的自制的板子,芯片为STM32F103,点亮PB6对应引脚连接的小灯。

//led.cpp

#include "led.h"

LED::LED(GPIO_TypeDef* port, uint16_t pin)
    : m_port(port), m_pin(pin)
{
}

void LED::Init()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // GPIO时钟使能
    if (m_port == GPIOA) {
        __HAL_RCC_GPIOA_CLK_ENABLE();
    } else if (m_port == GPIOB) {
        __HAL_RCC_GPIOB_CLK_ENABLE();
    } else if (m_port == GPIOC) {
        __HAL_RCC_GPIOC_CLK_ENABLE();
    } // 根据需要添加更多的GPIO端口

    // 配置GPIO引脚
    GPIO_InitStruct.Pin = m_pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(m_port, &GPIO_InitStruct);

    // 默认设置引脚为低电平(LED灭)
    HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_RESET);
}

void LED::On()
{
    HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_SET);
}

void LED::Off()
{
    HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_RESET);
}

void LED::Toggle()
{
    HAL_GPIO_TogglePin(m_port, m_pin);
}

//led.h

#ifndef __LED_H
#define __LED_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stm32f1xx_hal.h"

class LED {
public:
    LED(GPIO_TypeDef* port, uint16_t pin);
    void Init();
    void On();
    void Off();
    void Toggle();

private:
    GPIO_TypeDef* m_port;
    uint16_t m_pin;
};

#ifdef __cplusplus
}
#endif

#endif /* __LED_H */
//led_control.cpp

#include "led.h"

static LED led(GPIOB, GPIO_PIN_6);

extern "C" void LED_Init()
{
    led.Init();
}

extern "C" void LED_On()
{
    led.On();
}

extern "C" void LED_Off()
{
    led.Off();
}

extern "C" void LED_Toggle()
{
    led.Toggle();
}

第三步,在主函数里面调用

#include "led.h"

#ifdef __cplusplus
extern "C" {
#endif

void LED_Init();
void LED_On();
void LED_Off();
void LED_Toggle();

#ifdef __cplusplus
}
#endif

UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  while (1)
  {
    // 点亮LED
	LED_On();
	HAL_Delay(500); // 延迟500ms
		
	// 关闭LED
	LED_Off();
	HAL_Delay(500); // 延迟500ms
  }
}

第四步,在设置MiscControls里面加入:--cpp11

很好,下面请编译并运行,得到闪亮的小灯一盏。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值