m0_71661142 2023-12-06 18:56 采纳率: 40%
浏览 27
已结题

stm32编程实现按键电子琴,程序无报错但是实验箱连线后按下按键蜂鸣器无反应

stm32编程实现按键电子琴,程序无报错但是实验箱连线后按下按键蜂鸣器无反应
用的芯片应该是stm32f103r6,至少学校发的代码里的环境配的都是f103r6,硬件应该是没有问题
后面有附上硬件连线图,想实现的功能是按下前七个按键后,蜂鸣器发出对应音符(频率)的声音;按下第8个按键后,各音符上升一个音调(既数组调用下一行)。但是连线后没有任何反应,编译软件keil5中,程序build后0error,0warning,download也正常,但是实验箱上没有任何反应(按过复位键了)
希望各位能帮忙看看是程序中还有哪些错误并帮助改正一下,谢谢了

img


#include <stm32f10x_conf.h>
#include <SysTick.h>
#define PBeep PCout(0)
EXTI_InitTypeDef EXTI_init;
NVIC_InitTypeDef NVIC_ini;
int yd=0;
//定义A-G音调低音音符频率
int yinfu[7][7]={{262,294,330,349,392,440,494},{294,330,370,392,440,494,554},{330,370,415,440,494,554,622},
{349,392,440,466,523,587,659},{392,440,494,523,587,659,740},{440,494,554,587,659,740,831},{494,554,622,659,740,831,932}};
//定义按键映射表
uint8_t button_map[2][4]={{1,2,3,4},{5,6,7,8}};

//初始化IO接口
void IO_init(void){
    GPIO_InitTypeDef  GPIOA_Init,GPIOB_Init,GPIOC_Init;
    //使能A、B、C三组端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); 
    //PB0-7-推挽输出-连接LED灯
    GPIOB_Init.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIOB_Init.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIOB_Init.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIOB_Init);
    //PC0-推挽输出-连接蜂鸣器
    GPIOC_Init.GPIO_Pin=GPIO_Pin_0;
    GPIOC_Init.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIOC_Init.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIOC_Init);
    //PA-上拉输入-连接按键
    GPIOA_Init.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIOA_Init.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_Init(GPIOA,&GPIOA_Init);
}
void NVIC_init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
    EXTI_init.EXTI_Line=EXTI0_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI0_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
    EXTI_init.EXTI_Line=EXTI1_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI1_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
    EXTI_init.EXTI_Line=EXTI2_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI2_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource3);
    EXTI_init.EXTI_Line=EXTI3_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI3_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
    EXTI_init.EXTI_Line=EXTI4_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI4_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource5);
    EXTI_init.EXTI_Line=EXTI9_5_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI9_5_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);
    EXTI_init.EXTI_Line=EXTI9_5_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI9_5_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=1;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7);
    EXTI_init.EXTI_Line=EXTI9_5_IRQn;
    EXTI_init.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_init.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_init.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_init);
    NVIC_ini.NVIC_IRQChannel=EXTI9_5_IRQn;
    NVIC_ini.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_ini.NVIC_IRQChannelSubPriority=0;
    NVIC_ini.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_ini);
}
void sound(int mst, int f)//第一个参数为响的时间(ms),第二个参数确定音符
{
    int t=(int)1000000.0/f-10;//计算时间间隔
    int n=mst*1000;//转微秒
    while(n>0)//响的时间每次循环减去时间间隔,小于0时跳出
    {
        GPIO_SetBits(GPIOC,GPIO_Pin_0);
                delay_us(5);
        GPIO_ResetBits(GPIOC,GPIO_Pin_0);
                delay_us(5);
        delay_us(t);
        n-=t+10;
        
    }
    GPIO_ResetBits(GPIOC,GPIO_Pin_0);
            delay_ms(100);
        
        
}
void EXTI0_IRQHandler(void){
    sound(400,yinfu[yd][0]);
    EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI1_IRQHandler(void){
    sound(400,yinfu[yd][1]);
    EXTI_ClearITPendingBit(EXTI_Line1);
}
void EXTI2_IRQHandler(void){
    sound(400,yinfu[yd][2]);
    EXTI_ClearITPendingBit(EXTI_Line2);
}
void EXTI3_IRQHandler(void){
    sound(400,yinfu[yd][3]);
    EXTI_ClearITPendingBit(EXTI_Line3);
}
void EXTI4_IRQHandler(void){
    sound(400,yinfu[yd][4]);
    EXTI_ClearITPendingBit(EXTI_Line4);
}
void EXTI9_5_IRQHandler(void){
    if(EXTI_GetITStatus(EXTI_Line5)==1){
        sound(400,yinfu[yd][5]);
        EXTI_ClearITPendingBit(EXTI_Line5);
    }
    if(EXTI_GetITStatus(EXTI_Line6)==1){
        sound(400,yinfu[yd][6]);
        EXTI_ClearITPendingBit(EXTI_Line6);
    }
    if(EXTI_GetITStatus(EXTI_Line7)==1){
        if(yd<7){
            yd++;
        }else{
            yd=0;
        }
        EXTI_ClearITPendingBit(EXTI_Line7);
    }

}

int main(void){

    IO_init();
    NVIC_init();
    while(1){

    
    }

}


  • 写回答

15条回答 默认 最新

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月13日
  • 创建了问题 12月6日