完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我写了红外的程序不知道为什么不对
检查很多遍了,但是中断部分可能有问题,大家能帮我看看嘛 不知道为什么遥控器按键没有摁下去,程序就自己跑进中断里了。这就是没解决的问题 #include "STM32f10x_lib.h" #include "LCD_driver.h" /*********************************/ #define uchar unsigned char #define uint unsigned int #define IRIN GPIO_Pin_8 //P3^2; A8 #define Beep GPIO_Pin_7 //P2^0; B7 #define F1 GPIO_Pin_0 //P1^0; A0 #define F2 GPIO_Pin_1 //P1^1; A1 #define F3 GPIO_Pin_2 //P1^2; A2 #define F4 GPIO_Pin_3 //P1^3; A3 #define LCD_cs(x) x ? GPIO_SetBits(GPIOB, LCD_CS) : GPIO_ResetBits(GPIOB, LCD_CS)//自己定义的位函数 unsigned char IRCOM[7] = {0,0,0,0,0,0,0}; unsigned int k,a; unsigned char Val[2]; unsigned char FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转 unsigned char FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转 static vu32 TimingDelay; /*********************************************************************/ unsigned int b; unsigned char biaozhi,bx; /**********************************************************************/ //中断变量定义 /**********************************************************************/ EXTI_InitTypeDef EXTI_InitStructure; ErrorStatus HSEStartUpStatus; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /******************定义函数*******************************************/ void motor_ffw(void); void RCC_Configuration(void); void NVIC_Configuration(void); void delay_us(vu32 nTime); void delay_100us(int count); /**********************************************************************/ //主函数 /**********************************************************************/ int main(void) { // IR_initi() ;中断初始化 #ifdef DEBUG debug(); //在线调试使用 #endif RCC_Configuration(); //系统时钟配置函数 NVIC_Configuration(); //NVIC配置函数 //系统默认SysTick是8分频(HCLK/8)当前系统时钟72M的话 72/8 = 9MHZ SysTick_SetReload(9); //如果设置9000时,计数到9000时,产生1MS中断 //开启SysTick中断 SysTick_ITConfig(ENABLE); //启动GPIO模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //把调试设置普通IO口 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO为同一类型端口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZ GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA端口 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口 /**************************中断配置***********************************************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输入 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; /*******************************************************************************/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;;//IN_FLOATING; //配置浮空输入 /*******************************************************************************/ GPIO_Init(GPIOA, &GPIO_InitStructure); ///*将EXTI线6连接到PB6*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6); /*******************************************************************************/ /* Configure Key Button EXTI Line to generate an interrupt on falling edge */ //配置按钮中断线触发方式 EXTI_InitStructure.EXTI_Line = EXTI_Line6; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能 EXTI_Init(&EXTI_InitStructure); //初始化中断 /* Generate software interrupt: simulate a falling edge applied on Key Button EXTI line */ EXTI_GenerateSWInterrupt(EXTI_Line6); //EXTI_Line6中断允许 到此中断配置完成,可以写中断处理函数。 /********************************************************************************************/ GPIO_Write(GPIOA,0xffff); //将GPIOA 16个端口全部置为高电平 GPIO_Write(GPIOB,0xffff); //将GPIOB 16个端口全部置为高电平 LCD_Init(); //初始化LCD Pant(0x00 , 0x1f); // while(1) // { // } LCD_cs(0); ChineseChar( 4,1,1,colors[0],colors[2], 5); delay_100us(200000); ChineseChar( 29,1,1,colors[0],colors[2], 6); // delay_us(2000000); ChineseChar( 54,1,1,colors[0],colors[2], 7); ChineseChar( 79,1,1,colors[0],colors[2], 8); ChineseChar(104,1,1,colors[0],colors[2], 9); ChineseChar(129,1,1,colors[0],colors[2],10); ChineseChar(154,1,1,colors[0],colors[2],11); ChineseChar(179,1,1,colors[0],colors[2],12); ChineseChar(204,1,1,colors[0],colors[2],13); LCD_ShowString(5,25,colors[0],colors[2],"______"); LCD_cs(1); while(1) { switch(biaozhi) { case 0: break; case 1: switch(bx) { case 0: LCD_cs(0); ChineseChar(104,25,1,colors[0],colors[2], 1); ChineseChar(129,25,1,colors[0],colors[2], 2); LCD_cs(1); break; case 1: LCD_cs(0); ChineseChar(104,25,1,colors[0],colors[2], 3); ChineseChar(129,25,1,colors[0],colors[2], 4); LCD_cs(1); break; } switch(b) { case 0: break; case 1://Beep=~Beep; if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0) GPIO_SetBits(GPIOB , Beep); else GPIO_ResetBits(GPIOB , Beep); delay_100us(2000); break; } break; case 2: switch(bx) { case 0:k=2;motor_ffw(); break; case 1:k=1;motor_ffw(); break; } switch(b) { case 0: break; case 1://Beep=~Beep; if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0) GPIO_SetBits(GPIOB , Beep); else GPIO_ResetBits(GPIOB , Beep); delay_100us(2000); break; } break; case 3: a=840; LCD_cs(0); ChineseChar(179,25,1,colors[0],colors[2], 14); ChineseChar(204,25,1,colors[0],colors[2], 15); LCD_cs(1); switch(b) { case 0: break; case 1://Beep=~Beep; if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0) GPIO_SetBits(GPIOB , Beep); else GPIO_ResetBits(GPIOB , Beep); delay_100us(2000); break; } break; case 4: a=630; LCD_cs(0); ChineseChar(179,25,1,colors[0],colors[2], 16); ChineseChar(204,25,1,colors[0],colors[2], 17); LCD_cs(1); switch(b) { case 0: break; case 1://Beep=~Beep; if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0) GPIO_SetBits(GPIOB , Beep); else GPIO_ResetBits(GPIOB , Beep); delay_100us(2000); break; } break; case 5: switch(b) { case 0: break; case 1://Beep=~Beep; if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0) GPIO_SetBits(GPIOB , Beep); else GPIO_ResetBits(GPIOB , Beep); delay_100us(2000); break; } break; } } } /********************************************************************** * * * 步进电机驱动 * * * **********************************************************************/ void motor_ffw() { unsigned char i; unsigned int j; for (j=0; j<20; j++) //转1*n圈 { for (i=0; i<8; i++) //一个周期转30度 { if(k==1) GPIO_Write(GPIOA,(FFW[i]&0x1f)*0X100); //P1 = FFW[i]&0x1f; //取数据 if(k==2) GPIO_Write(GPIOA,(FFZ[i]&0x1f)*0X100);// P1 = FFZ[i]&0x1f; delay_100us(a); //调节转速 } } } /******************************************************************************* * * RCC配置 * *******************************************************************************/ void RCC_Configuration(void) { //复位RCC外部设备寄存器到默认值 RCC_DeInit(); //打开外部高速晶振 RCC_HSEConfig(RCC_HSE_ON); //等待外部高速时钟准备好 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //外部高速时钟已经准别好 if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); //配置AHB(HCLK)时钟=SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置APB2(PCLK2)钟=AHB时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB1(PCLK1)钟=AHB 1/2时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //配置ADC时钟=PCLK2 1/4 RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置PLL时钟 == 外部高速晶体时钟*9 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置ADC时钟= PCLK2/4 RCC_ADCCLKConfig(RCC_PCLK2_Div4); //使能PLL时钟 RCC_PLLCmd(ENABLE); //等待PLL时钟就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } //配置系统时钟 = PLL时钟 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //检查PLL时钟是否作为系统时钟 while(RCC_GetSYSCLKSource() != 0x08) { } } /* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE); } /******************************************************************************* * * 对系统滴答做延时处理 * ********************************************************************************/ void delay_us(u32 nTime) { //开启SysTick计数器 SysTick_CounterCmd(SysTick_Counter_Enable); TimingDelay = nTime; while(TimingDelay != 0); //死等待 //关闭系统滴答 SysTick_CounterCmd(SysTick_Counter_Disable); //清除SysTick 计数器 SysTick_CounterCmd(SysTick_Counter_Clear); } /******************************************************************************* * * SysTick中断处理函数 * *******************************************************************************/ void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configure the nested vectored interrupt controller. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //分配中断向量表 #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif // NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);// /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断优先级 /* Enable the EXTI9_5 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //强占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//次优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能 NVIC_Init(&NVIC_InitStructure);//初始化中断 } void EXTI9_5_IRQHandler(void) { unsigned char j,k,N=0; if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检测制定的EXTI线路触发请求是否发生。 { // EX0 = 0; //关闭中断 // EXTI_InitStructure.EXTI_LineCmd = DISABLE; //中断线使能 if (GPIO_ReadInputDataBit(GPIOA , IRIN)==1) { // EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能 EXTI_ClearITPendingBit(EXTI_Line6);//打开中断 return; } //确认IR信号出现 while (!GPIO_ReadInputDataBit(GPIOA , IRIN)) //等IR变为高电平,跳过9ms的前导低电平信号。 { delay_100us(1); } for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (GPIO_ReadInputDataBit(GPIOA , IRIN)) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 { delay_100us(1); } while (!GPIO_ReadInputDataBit(GPIOA , IRIN)) //等 IR 变为高电平 { delay_100us(1); } while (GPIO_ReadInputDataBit(GPIOA , IRIN)) //计算IR高电平时长 { delay_us(140); N++; if (N>=30) { // EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能 EXTI_ClearITPendingBit(EXTI_Line6);//打开中断 return; } //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) { IRCOM[j] = IRCOM[j] | 0x80; } N=0; }//end for k }//end for j if (IRCOM[2]!=~IRCOM[3]) { // EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_ClearITPendingBit(EXTI_Line6);//打开中断 return; } switch(IRCOM[2]) { case 0x45: biaozhi=0; break; case 0x46: biaozhi=1; bx++; if(bx==2) bx=0; break; case 0x44: biaozhi=2; break; case 0x43: biaozhi=3; break; case 0x40: biaozhi=4; break; case 0x47: biaozhi=5; b++; if(b==2) b=0; break; } // EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能 EXTI_ClearITPendingBit(EXTI_Line6); //打开中断 } // if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检测制定的EXTI线路触发请求是否发生。 // EXTI_ClearITPendingBit(EXTI_Line6); //清除EXTI线路挂起位 } void delay_100us(int count) // /* X10us */ { int i,j; for(i=0;i } #ifdef DEBUG /******************************************************************************* * Function Name : assert_failed * Description : Reports the name of the source file and the source line number * where the assert_param error has occurred. * Input : - file: pointer to the source file name * - line: assert_param error line source number * Output : None * Return : None ********************************************************************************/ void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %drn", file, line) */ /* Infinite loop */ while (1) { } } #endif /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ |
|
相关推荐
3 个讨论
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
1020 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
996 浏览 2 评论
2102 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1202 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1621 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 01:12 , Processed in 0.737105 second(s), Total 66, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号