OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6056|回复: 0

N32G45XVL-STB开发板试用(国民技术)- 2(分享:Timer)

[复制链接]

44

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
563
金钱
563
注册时间
2016-9-28
在线时间
158 小时
发表于 2022-12-18 17:14:22 | 显示全部楼层 |阅读模式
本帖最后由 mftang2016 于 2022-12-18 18:09 编辑

源代码和开发文档地址:
https://gitee.com/mftang/n32-g45-xvl-stb.git



4 Timer 定时器

4.1 需求
1670939419079.png
使用Timer -1 实现一个1ms 定时中断
1671341772039.png

4.2 代码实现


4.2.1 系统时钟分析

1671342064174.png
1671342203968.png

4.2.2 代码分析
system clock = 144 M
1671342564388.png

默认TIMCLKSEL = 0, 则TIME1/8 CLK = 144 M
1671342623470.png

通过以上分析可知: 定时器的工作频率为 144 000000,实现定时器部分代码
  1. void timer_Configuration(void)
  2. {   
  3.     uint16_t PrescalerValue = 0;
  4.     TIM_TimeBaseInitType TIM_TimeBaseStructure;

  5.    /* TIM1 clock enable */
  6.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM1, ENABLE);
  7.     /*
  8.       SystemCoreClock = 144 000000
  9.       PrescalerValue = 144
  10.       Period =  100
  11.       time count: 1 us
  12.     */
  13.     PrescalerValue = 144 - 1;
  14.    
  15.     /* Time base configuration */
  16.     TIM_TimeBaseStructure.Prescaler = 0;
  17.     TIM_TimeBaseStructure.Period    = 1000-1;  // 中断计数器,1 ms 产生一个中断   
  18.     TIM_TimeBaseStructure.ClkDiv    = TIM_CLK_DIV1;
  19.     TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;

  20.     TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);

  21.     /* Prescaler configuration */
  22.     TIM_ConfigPrescaler(TIM1, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);

  23.     /* TIM1 enable update irq */
  24.     TIM_ConfigInt(TIM1, TIM_INT_UPDATE, ENABLE);

  25.     /* TIM1 enable counter */
  26.     TIM_Enable(TIM1, ENABLE);
  27. }
复制代码
配置中断参数:
  1. void timer_NVIC_Configuration(void)
  2. {
  3.     NVIC_InitType NVIC_InitStructure;

  4.     /* Enable the TIM1 global Interrupt */
  5.     NVIC_InitStructure.NVIC_IRQChannel                   = TIM1_UP_IRQn;
  6.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  7.     NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 1;
  8.     NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;

  9.     NVIC_Init(&NVIC_InitStructure);
  10. }
复制代码
中断程序:
  1. void TIM1_UP_IRQHandler(void)
  2. {
  3.     if (TIM_GetIntStatus(TIM1, TIM_INT_UPDATE) != RESET)
  4.     {
  5.         TIM_ClrIntPendingBit(TIM1, TIM_INT_UPDATE);
  6.         LedBlink(GPIO_LED1, PIN_LED1);  // 用于捕捉波形
  7.     }
  8. }
复制代码
4.3 测试

硬件连接:
1671343237862.png

波形分析:
1671343442319.png

4.4 扩展实验

4.4.1 在中断函数中实现
  1. int count;
  2. void TIM1_UP_IRQHandler(void)
  3. {
  4.     if (TIM_GetIntStatus(TIM1, TIM_INT_UPDATE) != RESET)
  5.     {
  6.         TIM_ClrIntPendingBit(TIM1, TIM_INT_UPDATE);
  7.         if( (count % 1000) == 0)
  8.          {
  9.            LedBlink(GPIO_LED1, PIN_LED1);  // 用于捕捉波形
  10.          }
  11.          count ++;  
  12.     }
  13. }
复制代码
波形图

1671344119372.png

4.4.2 修改配置参数实现

初始化函数:
  1. void timer_Configuration(void)
  2. {   
  3.     uint16_t PrescalerValue = 0;
  4.     TIM_TimeBaseInitType TIM_TimeBaseStructure;

  5.    /* TIM1 clock enable */
  6.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM1, ENABLE);
  7.     /*
  8.       SystemCoreClock = 144 000000
  9.       PrescalerValue = 144 00
  10.       Period =  10000
  11.       time count: 1 s
  12.     */
  13.         /* Compute the prescaler value */
  14.     PrescalerValue = 14400 - 1;
  15.    
  16.     /* Time base configuration */
  17.     TIM_TimeBaseStructure.Prescaler = 0;
  18.     TIM_TimeBaseStructure.Period    = 10000-1;
  19.     TIM_TimeBaseStructure.ClkDiv    = TIM_CLK_DIV1;
  20.     TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;

  21.     TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);

  22.     /* Prescaler configuration */
  23.     TIM_ConfigPrescaler(TIM1, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);

  24.     /* TIM1 enable update irq */
  25.     TIM_ConfigInt(TIM1, TIM_INT_UPDATE, ENABLE);

  26.     /* TIM1 enable counter */
  27.     TIM_Enable(TIM1, ENABLE);
  28. }
复制代码
中断函数:
  1. static int count;
  2. void TIM1_UP_IRQHandler(void)
  3. {
  4.     if (TIM_GetIntStatus(TIM1, TIM_INT_UPDATE) != RESET)
  5.     {
  6.         TIM_ClrIntPendingBit(TIM1, TIM_INT_UPDATE);
  7.        // if( (count % 1000 ) == 0 )
  8.         {
  9.            LedBlink(GPIO_LED1, PIN_LED1);
  10.         }
  11.          count ++;  
  12.     }
  13. }
复制代码
波形图

1671344438175.png






1671342564388.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 19:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表