[AT32F403/403A] AT32学习记录——通用定时器(四)

[复制链接]
1974|1
 楼主| zexin 发表于 2024-9-8 21:07 | 显示全部楼层 |阅读模式
本帖最后由 zexin 于 2024-9-8 21:50 编辑

AT32F403A通用定时器04

一、定时器同步


1.主模式

当TMR做主定时器时,可以利用TMRxCTRL2(控制寄存器2)的PTOS位(主定时器输出选择),将以下信号源作为TRGOUT信号输出到次定时器
PTOS=3'b000时,TRGOUT输出软件溢出事件
PTOS=3'b001时,TRGOUT输出计数器使能信号
PTOS=3'b010时,TRGOUT输出计数器溢出事件
PTOS=3'b011时,TRGOUT输出比较(或捕获)事件
PTOS=3'b100时,TRGOUT输出C1ORAW信号
PTOS=3'b101时,TRGOUT输出C2ORAW信号
PTOS=3'b110时,TRGOUT输出C3ORAW信号
PTOS=3'b111时,TRGOUT输出C4ORAW信号

2.从模式

主次定时器之间可由内部连接信号进行同步,定时器的从模式有以下几种:

(1)复位模式


主定时器的触发信号将复位次定时器的计数器和分频器,若OVFS位为0(未溢出),将产生一个溢出事件

(2)挂起模式


主定时器的触发信号为高电平时,次定时器的计数器开始计数;
主定时器的触发信号为低电平时,次定时器的计数器暂停计数;

(3)触发模式


主定时器触发信号的上升沿将启动次定时器的计数器计数(TMR_EN置1)
二、案例

1.TMR同步

(1)功能

挂起模式下,定时器同步进行计数:
主定时器TMR2触发次定时器TMR3和次定时器TMR4计数。

(2)配置

介绍

TMR2---750kHz---20%;
TMR3---75kHz---30%;
TMR4---125kHz---50%

步骤

TMR2选择通道1输出;


TMR2开启次定时器同步主模式选择溢出
- 根据所需频率(F)和占空比(D)配置TMR2周期值通道数据
(F = 240MHz / (319 +1) = 750kHz)
(D = 64 / (319 + 1) = 20%)

次定时器TMR3输入源选择TMR2,次定时器模式选择挂起模式

④根据所需频率(F)和占空比(D)配置TMR3周期值通道数据
(F = 750kHz / (9 +1) = 75kHz)
(D = 3 / (9 + 1) = 30%)


次定时器TMR4的输入源选择TMR2,次定时器模式选择挂起模式

⑥根据所需频率占空比配置TMR4周期值通道数据
(F = 750kHz / (5 +1) = 125kHz)
(D = 3 / (5 + 1) = 50%)


⑦生成代码。

(3)代码

main.c

  1. #include "at32f403a_407_wk_config.h"
  2. #include "wk_system.h"

  3. int main(void)
  4. {
  5.   wk_system_clock_config();
  6.   wk_periph_clock_config();
  7.   wk_nvic_config();
  8.   wk_timebase_init();
  9.   wk_tmr2_init();
  10.   wk_tmr3_init();
  11.   wk_tmr4_init();

  12.   while(1)
  13.   {
  14.    
  15.   }
  16. }
at32f403a_407_wk_config.c

  1. #include "at32f403a_407_wk_config.h"

  2. void wk_system_clock_config(void)
  3. {
  4.   crm_reset();
  5.   crm_clock_source_enable(CRM_CLOCK_SOURCE_LICK, TRUE);
  6.   while(crm_flag_get(CRM_LICK_STABLE_FLAG) != SET)
  7.   {
  8.   }
  9.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);
  10.   while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
  11.   {
  12.   }
  13.   crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_60, CRM_PLL_OUTPUT_RANGE_GT72MHZ);
  14.   crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
  15.   while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  16.   {
  17.   }
  18.   crm_ahb_div_set(CRM_AHB_DIV_1);
  19.   crm_apb2_div_set(CRM_APB2_DIV_2);
  20.   crm_apb1_div_set(CRM_APB1_DIV_2);
  21.   crm_auto_step_mode_enable(TRUE);
  22.   crm_sysclk_switch(CRM_SCLK_PLL);
  23.   while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
  24.   {
  25.   }
  26.   crm_auto_step_mode_enable(FALSE);
  27.   system_core_clock_update();
  28. }

  29. void wk_periph_clock_config(void)
  30. {
  31.   crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  32.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  33.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  34.   crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
  35.   crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
  36.   crm_periph_clock_enable(CRM_TMR4_PERIPH_CLOCK, TRUE);
  37. }

  38. void wk_nvic_config(void)
  39. {
  40.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

  41.   NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 15, 0));
  42. }

  43. void wk_tmr2_init(void)
  44. {
  45.   gpio_init_type gpio_init_struct;
  46.   tmr_output_config_type tmr_output_struct;
  47.   gpio_default_para_init(&gpio_init_struct);
  48.   gpio_init_struct.gpio_pins = GPIO_PINS_0;
  49.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  50.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  51.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  52.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  53.   gpio_init(GPIOA, &gpio_init_struct);
  54.   tmr_base_init(TMR2, 319, 0);
  55.   tmr_cnt_dir_set(TMR2, TMR_COUNT_UP);
  56.   tmr_clock_source_div_set(TMR2, TMR_CLOCK_DIV1);
  57.   tmr_period_buffer_enable(TMR2, FALSE);
  58.   tmr_sub_sync_mode_set(TMR2, TRUE);
  59.   tmr_primary_mode_select(TMR2, TMR_PRIMARY_SEL_OVERFLOW);
  60.   tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  61.   tmr_output_struct.oc_output_state = TRUE;
  62.   tmr_output_struct.occ_output_state = FALSE;
  63.   tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  64.   tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  65.   tmr_output_struct.oc_idle_state = FALSE;
  66.   tmr_output_struct.occ_idle_state = FALSE;
  67.   tmr_output_channel_config(TMR2, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  68.   tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_1, 64);
  69.   tmr_output_channel_buffer_enable(TMR2, TMR_SELECT_CHANNEL_1, FALSE);
  70.   tmr_output_channel_immediately_set(TMR2, TMR_SELECT_CHANNEL_1, FALSE);

  71.   tmr_counter_enable(TMR2, TRUE);
  72. }


  73. void wk_tmr3_init(void)
  74. {
  75.   gpio_init_type gpio_init_struct;
  76.   tmr_output_config_type tmr_output_struct;
  77.   gpio_default_para_init(&gpio_init_struct);

  78.   gpio_init_struct.gpio_pins = GPIO_PINS_6;
  79.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  80.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  81.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  82.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  83.   gpio_init(GPIOA, &gpio_init_struct);

  84.   tmr_base_init(TMR3, 9, 0);
  85.   tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);
  86.   tmr_clock_source_div_set(TMR3, TMR_CLOCK_DIV1);
  87.   tmr_period_buffer_enable(TMR3, FALSE);

  88.   tmr_sub_sync_mode_set(TMR3, FALSE);
  89.   tmr_primary_mode_select(TMR3, TMR_PRIMARY_SEL_RESET);

  90.   tmr_sub_mode_select(TMR3, TMR_SUB_HANG_MODE);
  91.   tmr_trigger_input_select(TMR3, TMR_SUB_INPUT_SEL_IS1);
  92.   tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  93.   tmr_output_struct.oc_output_state = TRUE;
  94.   tmr_output_struct.occ_output_state = FALSE;
  95.   tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  96.   tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  97.   tmr_output_struct.oc_idle_state = FALSE;
  98.   tmr_output_struct.occ_idle_state = FALSE;
  99.   tmr_output_channel_config(TMR3, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  100.   tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_1, 3);
  101.   tmr_output_channel_buffer_enable(TMR3, TMR_SELECT_CHANNEL_1, FALSE);
  102.   tmr_output_channel_immediately_set(TMR3, TMR_SELECT_CHANNEL_1, FALSE);

  103.   tmr_counter_enable(TMR3, TRUE);
  104. }

  105. void wk_tmr4_init(void)
  106. {
  107.   gpio_init_type gpio_init_struct;
  108.   tmr_output_config_type tmr_output_struct;

  109.   gpio_default_para_init(&gpio_init_struct);
  110.   gpio_init_struct.gpio_pins = GPIO_PINS_6;
  111.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  112.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  113.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  114.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  115.   gpio_init(GPIOB, &gpio_init_struct);
  116.   tmr_base_init(TMR4, 5, 0);
  117.   tmr_cnt_dir_set(TMR4, TMR_COUNT_UP);
  118.   tmr_clock_source_div_set(TMR4, TMR_CLOCK_DIV1);
  119.   tmr_period_buffer_enable(TMR4, FALSE);
  120.   tmr_sub_sync_mode_set(TMR4, FALSE);
  121.   tmr_primary_mode_select(TMR4, TMR_PRIMARY_SEL_RESET);
  122.   tmr_sub_mode_select(TMR4, TMR_SUB_HANG_MODE);
  123.   tmr_trigger_input_select(TMR4, TMR_SUB_INPUT_SEL_IS1);
  124.   tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  125.   tmr_output_struct.oc_output_state = TRUE;
  126.   tmr_output_struct.occ_output_state = FALSE;
  127.   tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  128.   tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  129.   tmr_output_struct.oc_idle_state = FALSE;
  130.   tmr_output_struct.occ_idle_state = FALSE;
  131.   tmr_output_channel_config(TMR4, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  132.   tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_1, 3);
  133.   tmr_output_channel_buffer_enable(TMR4, TMR_SELECT_CHANNEL_1, FALSE);
  134.   tmr_output_channel_immediately_set(TMR4, TMR_SELECT_CHANNEL_1, FALSE);

  135.   tmr_counter_enable(TMR4, TRUE);
  136. }

(4)现象

逻辑分析仪测量PA0、PA6、PB6,定时器的同步波形如下:


挂起模式下,
主定时器的溢出信号产生之后,次定时器会开始计数;
主定时器的溢出信号被清除后,次定时器会暂停计数;
主定时器的溢出信号再产生后,次定时器又继续计数;
主定时器的溢出信号再被清除,次定时器又暂停计数;
……
直至计到周期值之后次定时器才发生溢出

TMR2每溢出10次,TMR3才溢出1次;
TMR2每溢出6次,TMR4才溢出1次。

由于作者水平有限,文中如有错误之处,恳请读者批评指正。
参考资料:
《RM_AT32F403A_407_CH_V2.06》的14.2通用定时器(TMR2到TMR5)https://www.arterytek.com/file/download/1995



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

本版积分规则

9

主题

17

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部