stm32f4正倒计时秒表

已有 stm32f103正倒计时秒表设计,怎么改成stm32f429?

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7442679
  • 你也可以参考下这篇文章:STM32 学习笔记 -- STM32F4系列使用库函数配置基层驱动模块
  • 除此之外, 这篇博客: 基于stm32f4的按键检测中的 基于stm32f4的按键检测 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 所谓按键检测,即是检测按键是长按,还是短按。(长按、短按由按键的时间的长短来衡量)通过查阅相关资料,找到了两种比较好理解的按键检测方法。一种是通过输入捕获的方式检测按键按下前后的电平转换时间,来判断按键是长按还是短按;另外一种是通过将按键扫描函数放在定时器中断里,检测按键按下前后的电平转换时间,进而判断按键状态 。但总的来说,以上这两种方式所用的方法是类似的,即通过检测电平转换时间的长短,从而确定按键是长按还是短按。
    第一种方式对应部分源码如下:

        long long temp=0;
     	temp=TIM5CH1_CAPTURE_STA&0X3F; 
    	temp*=0XFFFFFFFF;		 		         //溢出时间总和
    	temp+=TIM5CH1_CAPTURE_VAL;		   //得到总的高电平时间
    	printf("HIGH:%lld us\r\n",temp); //打印总的高点平时间
    	if(temp>=500000)//长按0.5s
        {
               switch_flag=1;
        }
       else if(temp>=100000)//短按至少0.1s
        {
              switch_flag=0;
        }
    

    第二种方式对应部分源码如下:

        //定时器3中断服务函数
    void TIM3_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
    	{
    		Key_scan();
    	}
    	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
    }
    
    //Key_scan函数
    void Key_scan(void)
    {
    	//1 表示高电平,0表示低电平。低电平时按下	
    	if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) )//按键按下 记录按下的时间	
    	{
    		delay_ms(20);//消抖时间,后加
    		count++;
    	}
    	else //按键松开 计数值清零并返回按下的时间值
    	{
    		if(count>100)//按下经过1s  10*10ms=100ms
    		{
        		//长按
    			switch_flag= 1;
    		}
    		else if(count>10 && count <100)//表示超过10ms
    		{
    			//短按
    			switch_flag= 0;
    		}
    		else
    		{	
    			delay_ms(20);//消抖时间,后加
    		}
    		count=0;
    	}
    ...
    }
    

    而在判断出按键状态之后,可以简单地实现检测单个按键连续两次按下的相关状态。如一个按键短按一次,长按一次,控制LED翻转;随后再短按一次,长按一次,控制LED翻转。部分代码如下;

    unsigned int switch_flag=1;//初始状态设置为1,防止第一次长按时误判断
    unsigned int switch_flag_old=1;//初始状态设置为1,防止第一次长按时误判断
    unsigned int switch_flag_state=0;
    //以下语句放在key_scan函数中,上接...
    static unsigned int switch_flag_old=1;//利用static变量,防止第一次长按时,误判断		
    	if((switch_flag==1)&&(switch_flag_old==0)) //
    	{
    		if(switch_flag_state==0)//区分swtich开关状态,判断上一次开关的状态
    			switch_on();
    			else
    			switch_off(); 
    	}
    switch_flag_old=switch_flag;//表示前一个状态,到这里
    //switch闭合函数 
    void switch_on(void)
    {
    	LED1=!LED1;//DS1翻转
    	switch_flag_state=1;
    }
    //switch断开函数
    void switch_off(void)
    {
    	LED1=!LED1;//DS1翻转
    	switch_flag_state=0;
    }
    

    在实际调试过程中,参照了之前产生上升沿波形的例子。而对switch_flag,及switch_flag_old的初值设置为1,可以避免在第一次按键长按时,就会进入按键判断语句,从而使功能有误。完整代码已通过正点原子stm32f407开发板检测。欢迎各位指正。

  • 您还可以看一下 熊健老师的物联网之STM32F4编程详解课程中的 STM32嵌入式系统概述小节, 巩固相关知识点

将STM32F103正倒计时秒表设计移植到STM32F429时,需要注意以下几个方面:

  1. MCU型号和外设的差异。STM32F429和STM32F103具有不同的外设和寄存器映射,因此,您需要针对STM32F429重新编写进行初始化、中断处理等相关代码,并做好相应的修改。

  2. 时钟频率的设定。由于MCU的不同,时钟频率也可能不同,所以在移植时需要根据实际的MCU的时钟设定,对计时器的预分频、周期进行相应的调整。

  3. IO口的差异。由于STM32F429和STM32F103之间,IO口的数量和映射方式可能存在差异,所以需要在移植时重新适配IO口的设置,并做好相应的修改。

  4. 编程工具和编译器的差异。不同的编程工具和编译器可能存在一些差异,您需要根据您所使用的开发环境,对项目进行相应的调整。

在对以上问题进行适配后,就可以将原来的STM32F103正倒计时秒表设计移植到STM32F429中。建议在移植前,详细了解两款MCU的技术规格和装置差异,并详细了解应用场景和具体实现方式。