你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0学习手册——使用定时器中断(HAL库)

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:49
定时器分类
G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图

其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器

20200505192122130.jpg


20200505192148321.jpg


计时器时序图
TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。

20200505193407758.png


20200505194318226.png


基本PWM模式,边缘或者中央对齐模式

20200505194802587.png


非对称PWM模式

20200505195057399.png


三相组合PWM模式
20200505195420730.png


可变频率pwm,由外部信号驱动。                                           逐周期控制的占空比。

20200505195905197.png


TIM2定时器实验
本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。

如何计算定时器周期?

1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;

20200505220029633.png


2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数,

如 64MHz / 6400=10000Hz

3、确定ARR的值,ARR=CK_CNT* t(s),

如要1秒周期,10000Hz*1s=10000。

实验代码
1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";

2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低

20200419170920422.png


20200505223426701.png


3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64

20200505223701644.png


4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"

5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值

如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT

20200505225312371.png


6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"

20200505225419137.png


7、在Project Manager中填入项目名,IDE版本“MDK-ARM   V5”,在Code Generator打上勾,生成代码。

20200505225614187.png


8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数

  1. int main(void)
  2. {
  3.   **
  4.   **
  5.   MX_GPIO_Init();
  6.   MX_TIM2_Init();
  7.   /* USER CODE BEGIN 2 */
  8.     HAL_TIM_Base_Start_IT(&htim2);          //初始化定时器中断
  9.   /* USER CODE END 2 */
  10.   **
  11.   **
复制代码

9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中

  1. <span style="background-color: rgb(255, 255, 255);">/</span>*
  2. *stm32g0xx_hal_tim.c
  3. */
  4. __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  5. {
  6.   /* Prevent unused argument(s) compilation warning */
  7.   UNUSED(htim);

  8.   /* NOTE : This function should not be modified, when the callback is needed,
  9.             the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
  10.    */
  11. }
复制代码

10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。

  1. /* USER CODE BEGIN 4 */
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.   /* Prevent unused argument(s) compilation warning */
  5.   UNUSED(htim);
  6.     HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);            //只有定时器有中断,就翻转一次引脚电平
  7. }
  8. /* USER CODE END 4 */
复制代码







20200505200041645.png
收藏 评论0 发布时间:2021-11-8 16:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版