【stm32/CubeMX、HAL库】嵌入式实验六:定时器(1)|定时器中断

参考:

【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p=13&share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

《嵌入式系统基础与实践》刘黎明等编著,第九章定时器。

实验内容

1、电子时钟设计。

时钟频率为 72Mhz,采用定时器 3。

(1)实现 1 秒延时,并控制 LED0 闪烁.

CubeMX配置(36000-1+1)*(2000-1+1)/72000000=1s:

 LED0:

回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==htim3.Instance)
  {
		HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
	}
	
}

 main函数里启动定时器中断计数:

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);
  /* USER CODE END 2 */

(2)在数码管上显示时钟,格式为“12-00-00”,设置定时器 1 秒延时,并实时更新 时钟显示。

全局变量,用来存时分秒,中断不直接操作s数组,而是先存到三个变量中,再在主函数里拷贝,flag作为是否发生中断的标志

/* USER CODE BEGIN PV */
uint8_t hh=12,mm=0,ss=0;
uint8_t flag=0;
/* USER CODE END PV */

数码管显示部分基本上是从前面的实验搬过来,table段码表,s存放要显示的数字,writebyte函数把要显示的一位数字送到数码管(配置看:https://blog.csdn.net/qq_61814350/article/details/138093983?spm=1001.2014.3001.5502

):

uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//10表示'-'
uint8_t s[]={1,2,10,0,0,10,0,0};
void write_byte(uint8_t date){
    unsigned char i;
	for(i=0;i<8;i++){
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(date>>(7-i))&0x01);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,0);
	}
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,1);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,0);
 
}

回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==htim3.Instance)
  {
		//HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
		ss++;
		if(ss==60){
		ss=0;
		mm++;
		}
		if(mm==60){
		mm=0;
		hh++;
		}
		if(hh==24){
		hh=0;
		}
		
		flag=1;
		
	}
	
}

主函数 

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

    /* USER CODE BEGIN 3 */
		if(flag==1){
		s[7]=ss%10;
		s[6]=ss/10;
		s[4]=mm%10;
		s[3]=mm/10;
		s[1]=hh%10;
		s[0]=hh/10;
			
		flag=0;
		}
			
		
		
		for(int i=8;i<16;i++){
		write_byte(table[s[15-i]]);
		HAL_GPIO_WritePin(GPIOF,0x01<<i,0);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOF,0x01<<i,1);
		}
  }
  /* USER CODE END 3 */

(3)设置 KB1、KB2、KB3 分别对时钟的小时、分、秒进行调整(KB1 按下,小时+1, KB2 按下,分钟+1,KB3 按下,秒钟+1)

在上个实验里加上按键对应的外部中断事件。下是三个按键的部分配置

详见前面的按键中断实验的文章。 

回调函数:

void counter()
{
    
		if(ss==60){
		ss=0;
		mm++;
		}
		if(mm==60){
		mm=0;
		hh++;
		}
		if(hh==24){
		hh=0;
		}

}
	
	

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==htim3.Instance)
  {
		//HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
		ss++;
		counter();
		
		flag=1;
		
	}
	
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	HAL_Delay(10);//延时,用来消抿
	
  if(GPIO_Pin==GPIO_PIN_0) {
		
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==RESET){
		 hh++;
		 counter();
		}
	   
	}
	else if(GPIO_Pin==GPIO_PIN_1) {
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)==RESET){
		mm++;
		 counter();
		}
	   
	} 
	else if(GPIO_Pin==GPIO_PIN_6) {
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)==RESET){
		ss++;
		 counter();
		}
	   
	}
	
	//HAL_Delay(100);
	flag=1;
	
}

 后面的实验下次再说。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值