C++调用单片机中断失败问题原因及其解决办法记录

#错误场景
使用visual studio编辑器Embedded Project Wizard软件模板,在.cpp文件中调用单片机中断(eg:TIM6_IRQHandler)出现错误,无法进入中断或者代码运行挂掉。
#原因
c++编译器编译后无法连接到中断向量表,函数名称无法对应到中断服务名称。
#解决办法
增加 extern “C”,extern "C"会告诉C++编译器,将花括号中的代码按照C语言的规则进行编译与链接。如此就可以正常的链接到中断向量表,亲测成功。
代码如下:

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @brief  This function handles TIM6 global interrupt request.
 */
void TIM6_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIM6, TIM_INT_UPDATE) != RESET)
    {
	}
}
#ifdef __cplusplus
}
#endif
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里给出一个简单的代码示例,使用定时器来控制电机速度,同时使用数码管实时显示速度。代码使用了51单片机的定时器1和P0口来控制电机速度,使用P2口连接数码管,在数码管上显示电机速度。 ```c #include <reg51.h> #define MOTOR_PIN P0 #define DISPLAY_PIN P2 unsigned char speed = 0; // 电机速度 // 数码管显示数字表 unsigned char display_table[] = { 0x3f, // 0 0x06, // 1 0x5b, // 2 0x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f // 9 }; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++); } } void display_speed(unsigned char speed) { unsigned char digit1, digit2; digit1 = speed / 10; // 十位数 digit2 = speed % 10; // 个位数 DISPLAY_PIN = 0xff; // 关闭所有数码管 // 显示十位数 DISPLAY_PIN = ~(1 << 7); MOTOR_PIN = display_table[digit1]; delay_ms(5); // 显示个位数 DISPLAY_PIN = ~(1 << 6); MOTOR_PIN = display_table[digit2]; delay_ms(5); } void timer1_isr() interrupt 3 { static unsigned char counter = 0; counter++; if (counter >= speed) { counter = 0; MOTOR_PIN = ~MOTOR_PIN; // 反转电机输出 } } void main() { TMOD = 0x10; // 定时器1工作在模式1 TH1 = 0xfd; // 计数器初值 TL1 = 0xfd; // 计数器初值 ET1 = 1; // 允许定时器1中断 TR1 = 1; // 启动定时器1 EA = 1; // 允许中断 while (1) { display_speed(speed); // 显示电机速度 if (P1_0 == 0) { // 按键S1按下,加速 if (speed < 10) { speed++; } delay_ms(10); // 延时去抖动 } if (P1_1 == 0) { // 按键S2按下,减速 if (speed > 0) { speed--; } delay_ms(10); // 延时去抖动 } } } ``` 在上面的代码,定时器1的中断服务函数(timer1_isr)用来控制电机速度,每隔一定时间反转电机输出一次,实现电机转速控制。在主循环,通过按键S1和S2来调整电机速度,同时调用display_speed函数将电机速度显示在数码管上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值