当前位置:   article > 正文

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

【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:

回调函数:

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. if(htim->Instance==htim3.Instance)
  4. {
  5. HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
  6. }
  7. }

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

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

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

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

  1. /* USER CODE BEGIN PV */
  2. uint8_t hh=12,mm=0,ss=0;
  3. uint8_t flag=0;
  4. /* USER CODE END PV */

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

):

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

回调函数

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. if(htim->Instance==htim3.Instance)
  4. {
  5. //HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
  6. ss++;
  7. if(ss==60){
  8. ss=0;
  9. mm++;
  10. }
  11. if(mm==60){
  12. mm=0;
  13. hh++;
  14. }
  15. if(hh==24){
  16. hh=0;
  17. }
  18. flag=1;
  19. }
  20. }

主函数 

  1. /* USER CODE BEGIN WHILE */
  2. while (1)
  3. {
  4. /* USER CODE END WHILE */
  5. /* USER CODE BEGIN 3 */
  6. if(flag==1){
  7. s[7]=ss%10;
  8. s[6]=ss/10;
  9. s[4]=mm%10;
  10. s[3]=mm/10;
  11. s[1]=hh%10;
  12. s[0]=hh/10;
  13. flag=0;
  14. }
  15. for(int i=8;i<16;i++){
  16. write_byte(table[s[15-i]]);
  17. HAL_GPIO_WritePin(GPIOF,0x01<<i,0);
  18. HAL_Delay(1);
  19. HAL_GPIO_WritePin(GPIOF,0x01<<i,1);
  20. }
  21. }
  22. /* USER CODE END 3 */

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

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

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

回调函数:

  1. void counter()
  2. {
  3. if(ss==60){
  4. ss=0;
  5. mm++;
  6. }
  7. if(mm==60){
  8. mm=0;
  9. hh++;
  10. }
  11. if(hh==24){
  12. hh=0;
  13. }
  14. }
  15. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  16. {
  17. if(htim->Instance==htim3.Instance)
  18. {
  19. //HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
  20. ss++;
  21. counter();
  22. flag=1;
  23. }
  24. }
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3. HAL_Delay(10);//延时,用来消抿
  4. if(GPIO_Pin==GPIO_PIN_0) {
  5. if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==RESET){
  6. hh++;
  7. counter();
  8. }
  9. }
  10. else if(GPIO_Pin==GPIO_PIN_1) {
  11. if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)==RESET){
  12. mm++;
  13. counter();
  14. }
  15. }
  16. else if(GPIO_Pin==GPIO_PIN_6) {
  17. if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)==RESET){
  18. ss++;
  19. counter();
  20. }
  21. }
  22. //HAL_Delay(100);
  23. flag=1;
  24. }

 后面的实验下次再说。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/626769
推荐阅读
相关标签
  

闽ICP备14008679号