当前位置:   article > 正文

AT32定时器

at32

一、定时器中断

定时器溢出中断是定时器最基础功能,进入中断的时间周期可由相关寄存器配置。
1、 定时器计数器值 TMRx_CVAL
2、 定时器预分频寄存器 TMRx_DIV
3、定时器周期寄存器(TMRx_PR)
定时器中断频率计算公式如下:
 

配置流程

编写定时器溢出中断函数的应用程序
开启定时器外设时钟
配置定时器 TMRx_DIV 寄存器和 TMRx_PR 寄存器
配置定时器为向上计数方向
5 开启定时器溢出中断
开启 NVIC 溢出中断
7 开启定时器计数

代码介绍

main函数

  1. int main(void)
  2. {
  3. /* 系统时钟配置 */
  4. system_clock_config();
  5. /* LED 延时函数等初始化 */
  6. at32_board_init();
  7. /* 获取系统时钟 */
  8. crm_clocks_freq_get(&crm_clocks_freq_struct);
  9. /* 点亮 LED2/LED3/LED4 */
  10. at32_led_on(LED2);
  11. at32_led_on(LED3);
  12. at32_led_on(LED4);
  13. /* 开启 TMR1 时钟 */
  14. crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
  15. /* 配置定时器 TMRx_DIV 寄存器和 TMRx_PR 寄存器 */
  16. /* systemclock/24000/10000 = 1hz */
  17. tmr_base_init(TMR1, 9999, (crm_clocks_freq_struct.ahb_freq / 10000) - 1);
  18. /*配置定时器为向上计数方向,如果选择向上计数也可以不配置该语句,
  19. 因为 TMR 默认就是向上计数模式 */
  20. tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
  21. /* 开启定时器溢出中断 */
  22. tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
  23. /* 开启 NVIC 溢出中断 */
  24. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  25. nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 0, 0);
  26. /* 开启定时器计数 */
  27. tmr_counter_enable(TMR1, TRUE);
  28. clkout_config();
  29. while(1)
  30. {
  31. }
  32. }

中断函数

  1. void TMR1_OVF_TMR10_IRQHandler(void)
  2. {
  3. /* 判断溢出标志位是否置起 */
  4. if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET)
  5. {
  6. /* 增加应用程序 */
  7. at32_led_toggle(LED3);
  8. tmr_flag_clear(TMR1, TMR_OVF_FLAG);
  9. }
  10. }

实验效果

LED3 1 秒翻转一次

二、PWM输出

PWM 输出是定时器最常用的输出模式,分为 PWM 模式 A PWM 模式 B 。其差异在于:
PWM 模式 A
OWCDIR=0 ,若 TMRx_C1DT>TMRx_CVAL 时设置 C1ORAW 为高,否则为低;
OWCDIR=1 ,若 TMRx_ C1DT <TMRx_CVAL 时设置 C1ORAW 为低,否则为高。
PWM 模式 B
OWCDIR=0 ,若 TMRx_ C1DT >TMRx_CVAL 时设置 C1ORAW 为低,否则为高;
OWCDIR=1 ,若 TMRx_ C1DT <TMRx_CVAL 时设置 C1ORAW 为高,否则为低。

配置流程

1、  开启定时器外设时钟
2、  配置输出管脚
3、  配置定时器 TMRx_DIV 寄存器和 TMRx_PR 寄存器
4、  配置定时器为向上计数方向
5、  配置定时器输出通道为 PWM 模式 B
6、  开启定时器计数

代码介绍

  1. int main(void)
  2. {
  3. system_clock_config();
  4. /* 初始化板载设备 */
  5. at32_board_init();
  6. /* get system clock */
  7. crm_clocks_freq_get(&crm_clocks_freq_struct);
  8. /* turn led2/led3/led4 on */
  9. at32_led_on(LED2);
  10. at32_led_on(LED3);
  11. at32_led_on(LED4);
  12. /* 打开 tmr1/gpioa/gpiob 时钟 */
  13. crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
  14. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  15. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  16. /* 配置 TMR1 输出管脚 */
  17. gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9 | GPIO_PINS_10 | GPIO_PINS_11;
  18. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  19. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  20. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  21. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  22. gpio_init(GPIOA, &gpio_init_struct);
  23. gpio_init_struct.gpio_pins = GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15;
  24. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  25. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  26. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  27. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  28. gpio_init(GPIOB, &gpio_init_struct);
  29. gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_1);
  30. gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1);
  31. gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1);
  32. gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_1);
  33. gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_1);
  34. gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_1);
  35. gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_1);
  36. /* tmr1 初始化 ---------------------------------------------------
  37. generate 7 pwm signals with 4 different duty cycles:
  38. prescaler = 0, tmr1 counter clock = apb2_freq *2
  39. the objective is to generate 7 pwm signal at 17.57 khz:
  40. - tim1_period = (apb2_freq * 2 / 17570) - 1
  41. the channel 1 and channel 1n duty cycle is set to 50%
  42. the channel 2 and channel 2n duty cycle is set to 37.5%
  43. the channel 3 and channel 3n duty cycle is set to 25%
  44. the channel 4 duty cycle is set to 12.5%
  45. the timer pulse is calculated as follows:
  46. - channelxpulse = dutycycle * (tim1_period - 1) / 100
  47. ----------------------------------------------------------------------- */
  48. /* compute the value to be set in arr regiter to generate signal frequency at 17.57 khz */
  49. timerperiod = ((crm_clocks_freq_struct.apb2_freq * 2) / 17570 ) - 1;
  50. /* compute ccr1 value to generate a duty cycle at 50% for channel 1 and 1n */
  51. channel1pulse = (uint16_t) (((uint32_t) 5 * (timerperiod - 1)) / 10);
  52. /* compute ccr2 value to generate a duty cycle at 37.5% for channel 2 and 2n */
  53. channel2pulse = (uint16_t) (((uint32_t) 375 * (timerperiod - 1)) / 1000);
  54. /* compute ccr3 value to generate a duty cycle at 25% for channel 3 and 3n */
  55. channel3pulse = (uint16_t) (((uint32_t) 25 * (timerperiod - 1)) / 100);
  56. /* compute ccr4 value to generate a duty cycle at 12.5% for channel 4 */
  57. channel4pulse = (uint16_t) (((uint32_t) 125 * (timerperiod- 1)) / 1000);
  58. /* 配置 TMR 为向上计数模式 */
  59. tmr_base_init(TMR1, timerperiod, 0);
  60. tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
  61. /* 配置通道 1/2/3/4 */
  62. tmr_output_default_para_init(&tmr_output_struct);
  63. tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_B;
  64. tmr_output_struct.oc_output_state = TRUE;
  65. tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_LOW;
  66. tmr_output_struct.oc_idle_state = TRUE;
  67. tmr_output_struct.occ_output_state = TRUE;
  68. tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  69. tmr_output_struct.occ_idle_state = FALSE;
  70. /* channel 1 */
  71. tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  72. tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, channel1pulse);
  73. /* channel 2 */
  74. tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_2, &tmr_output_struct);
  75. tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, channel2pulse);
  76. /* channel 3 */
  77. tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_3, &tmr_output_struct);
  78. tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_3, channel3pulse);
  79. /* channel 4 */
  80. tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_4, &tmr_output_struct);
  81. tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_4, channel4pulse);
  82. /*TMR1 输出总开关打开 */
  83. tmr_output_enable(TMR1, TRUE);
  84. /*使能 TMR1 */
  85. tmr_counter_enable(TMR1, TRUE);
  86. while(1)
  87. {}

实验效果

图中通道 1 4 输出频率相同但占空比不同的波形,互补通道通过输出极性的调节与其对应的 通道输出相同的波形。
未完待续~
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/490298
推荐阅读
相关标签
  

闽ICP备14008679号