根据按键输入改写的程序,目前调试除了问题,请大家帮下忙!

2019-07-21 02:41发布

小弟刚开始学STM32,遇到点困难,请大家帮助一下。谢过!
程序是根据:1按键实验  2定时器实验   这两个实验修改
实现的功能:设置PA1,2,3,4,5,7,8,9,10,11,12,13.共12个通道为报警通道
如果通道为高电平,则显示right。。如果通道为低电平,延时2秒后,显示wrong。。
这个程序,我用寄存器版本,能够实现正常功能,用库函数,却不能实现
我感觉,是我写的定时器出错了。。大家帮我看下。
[mw_shl_code=c,true]int main(void) { u32 port[12]; u8 i; u8 m=10; delay_init(); //延时函数初始化 //uart_init(72,9600); //串口初始化为9600 //NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 IO_Init(); //初始化与按键连接的硬件接口 LCD_Init(); //初始化LCD屏 TIM3_Int_Init(199,7199); //10Khz的计数频率,计数到500为50ms LCD_Clear(BLUE); //背景为蓝 {MOD} while(1) { for(i=0;i<12;i++) { POINT_COLOR=BLACK; //字迹为黑 {MOD} //t=port; LCD_ShowString(20,(2*i+2)*m,40,16,16,"port");//LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *pLCD_ShowString(30,50,200,16,16,"WarShip STM32 ^_^"); LCD_ShowxNum(5*m,(2*i+2)*m,i+1,2,16,0);//LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode) if(port==1) { POINT_COLOR=RED; //字迹为红 {MOD} if(flag==0) { LCD_ShowString(68,(2*i+2)*m,40,16,16,"wrong"); } } else { POINT_COLOR=BLACK; //字迹为黑 {MOD} LCD_ShowString(68,(2*i+2)*m,40,16,16,"right"); } if(flag==1) { port=0; POINT_COLOR=BLACK; //字迹为黑 {MOD} LCD_ShowString(68,(2*i+2)*m,40,16,16,"right"); flag=0; } } } } [/mw_shl_code] [mw_shl_code=c,true]void IO_Init() //IO初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;//PA0,6,13,14,不用 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA1,2,3,4,5,7,8,9,10,11,12,15 } //串口扫描函数 //12个串口.PA1-5作为通道1-5,PA7-12作为通道6-11 PA15作为通道12 //PA13.PA14为JTAG接口,保留不使用 void Port_Scan(void) { delay_ms(10);//去抖动 for(i=1;i<6;i++) { if(PAin(i)==0) { channel[i-1]++; } else { flag[i-1]=1; } } for(i=7;i<13;i++) { if(PAin(i)==0) { channel[i-2]++; } else { flag[i-2]=1; } } if(PAin(15)==0) { channel[11]++; } else { flag[11]=1; } } [/mw_shl_code]
[mw_shl_code=c,true]void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { Port_Scan(); count++; if(count>=20) //计时1s { second++; count=0; } if(second>=2)//每两秒检测一次 { Data_analyse(); second=0; } TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 } } //通用定时器3中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3 void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx } //定时器3中断服务程序 void Data_analyse() { u8 i; for(i=0;i<12;i++) { if(channel==150) { port=1; } else { port=0; } channel=0; } }[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。