蓝桥杯STM32G431学习之TIM程序设计(四)

一、配置引脚(略)

二、程序设计

--------------------------------------------------------------------------------------------------

在tim.h这个头文件中声明4个函数

--------------------------------------------------------------------------------------------------

/* USER CODE BEGIN Prototypes */
void TIM1_SetAutoReload(uint16_t usAuto);
void TIM1_SetCompare1(uint16_t usComp);
void TIM3_SetCompare1(uint16_t usComp);
void TIM_GetCapture(uint16_t *pusBuf);
/* USER CODE END Prototypes */

--------------------------------------------------------------------------------------------------

在tim.c完成上述4个函数的实现

--------------------------------------------------------------------------------------------------

 /* USER CODE BEGIN TIM1_Init 2 */
	HAL_TIM_PWM_Start(&htim1,2);
  /* USER CODE END TIM1_Init 2 */


  /* USER CODE BEGIN TIM2_Init 2 */
	HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);
  /* USER CODE END TIM2_Init 2 */

  /* USER CODE BEGIN TIM3_Init 2 */
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  /* USER CODE END TIM3_Init 2 */
/* USER CODE BEGIN 1 */
void TIM1_SetAutoReload(uint16_t usAuto)
{
	TIM1->ARR=usAuto;
}
void TIM1_SetCompare1(uint16_t usComp)
{
	TIM1->CCR1=usComp;
}
void TIM3_SetCompare1(uint16_t usComp)
{
	TIM3->CCMR1=usComp;
}
void TIM_GetCapture(uint16_t *pusBuf)
{
	pusBuf[0]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1;
	pusBuf[1]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1;
}
/* USER CODE END 1 */

--------------------------------------------------------------------------------------------------

1.定义变量

2.在main.c中加stdio.h、lcd.h三个头文件

3.声明函数LCD_Proc()和KEY_Proc()

4.在while(1)中加入函数LCD_Proc()和KEY_Proc()

5.实现函数LCD_Proc()和KEY_Proc()

--------------------------------------------------------------------------------------------------

/* USER CODE BEGIN PV */
uint8_t ucKey;    				         	/* 按键值 */
uint16_t usComp=1000;						/* TIM输出比较值  */
uint16_t usCapt[2];							/* TIM输入捕捉值 */
uint8_t ucLcd[21];                 	        /* LCD值 */
uint8_t ucState;							/* 界面状态 */
/* USER CODE END PV */
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PFP */
void LCD_Proc(void);    
void KEY_Proc(void);              	/* 按键处理 */
/* USER CODE END PFP */
 /* USER CODE BEGIN 2 */
	LCD_Init();                                    
    LCD_Clear(Black);                      
    LCD_SetTextColor(White);            
    LCD_SetBackColor(Black);         
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		LED_Proc();
		LCD_Proc();
		KEY_Proc(); 
  }
  /* USER CODE END 3 */
/* USER CODE BEGIN 4 */
void LCD_Proc(void)                   
{
	
	 if(ucState == 0)       						/* 数据界面 */
		{
			          
				sprintf((char*)ucLcd, "    Page One ");
				LCD_DisplayStringLine(Line2, ucLcd);			
				TIM_GetCapture(usCapt);
				sprintf((char*)ucLcd, "  FRE:%05u B2:%04u ",1000000/usCapt[0],usComp);
				LCD_DisplayStringLine(Line4, ucLcd);
				sprintf((char*)ucLcd, "  PER:%05u WID:%04u ",usCapt[0],usCapt[1]);
				LCD_DisplayStringLine(Line6, ucLcd);			
		}
		else
		{
				     
				sprintf((char*)ucLcd, "    Page Two ");
				LCD_DisplayStringLine(Line2, ucLcd);		
				sprintf((char*)ucLcd, "    Ni hao");
				LCD_DisplayStringLine(Line4, ucLcd);			
				sprintf((char*)ucLcd, "    ZiDongHua");
				LCD_DisplayStringLine(Line6, ucLcd);
			
		}	
}
void KEY_Proc(void)                   
{
	uint8_t ucKey_Val = 0;
     ucKey_Val = KEY_Read();        	/* 按键读取 */
      if(ucKey_Val != ucKey)         	/* 键值变化 */
        ucKey = ucKey_Val;            	/* 保存键值 */
      else
        ucKey_Val = 0;                 	/* 清除键值 */

  switch(ucKey_Val)
	{
		case 1:                         	/* B1按下 */
			ucState ^= 1;                     /* 切换界面状态 */     
      LCD_Clear(Black);      				/* LCD清屏 */
      break;
		
    case 2:                         	    /* B2按下 */
			usComp += 1000;
			if(usComp ==10000)
				usComp = 1000;
			TIM1_SetCompare1(usComp>>1);
			TIM3_SetCompare1(usComp);
			
	}		
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值