众所周知,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
很好,下面请编译并运行,得到闪亮的小灯一盏。