参考:
【【正点原子】手把手教你学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:
回调函数:
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<(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; }后面的实验下次再说。
还没有评论,来说两句吧...