|
之前使用其它家的MCU时,基本上不使用RTC外设——主要是没有LSE晶振。但RTC外设的后备寄存器的使用频率还是非常高的。今天来体验一下雅特力AT32F437的ERTC外设的时间戳特性。 时间戳典型用法有两种: 单独的时间戳功能,此时入侵检测引脚用来检测时间戳 发生入侵事件时保存时间戳
ERTC的时间戳功能与入侵检测功能是强绑定的。时间戳功能的触发也是基于入侵检测的引脚配置。根据原理图,PC13引脚与外部按键相连,并且有下拉电阻。所以,入侵检测的触发方式为PC13引脚的上升沿。附上测试源代码: - void wk_ertc_init(void)
- {
- gpio_init_type gpio_init_struct;
- exint_init_type exint_init_struct;
- gpio_default_para_init(&gpio_init_struct);
- /* configure the AF1 pin */
- gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE13, GPIO_MUX_0);
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_pins = GPIO_PINS_13;
- gpio_init(GPIOC, &gpio_init_struct);
- pwc_battery_powered_domain_access(TRUE);
- crm_ertc_clock_select(CRM_ERTC_CLOCK_LICK);
- crm_ertc_clock_enable(TRUE);
- ertc_reset();
- ertc_wait_update();
- ertc_divider_set(127, 255);
- ertc_hour_mode_set(ERTC_HOUR_MODE_24);
- ertc_time_set(0x0, 0x0, 0, ERTC_24H);
- ertc_date_set(25, 10, 29, 3);
- /* configure timestamp */
- ertc_timestamp_valid_edge_set(ERTC_TIMESTAMP_EDGE_RISING);
- ertc_timestamp_pin_select(ERTC_PIN_PC13);
-
- exint_default_para_init(&exint_init_struct);
- exint_init_struct.line_enable = TRUE;
- exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
- exint_init_struct.line_select = EXINT_LINE_21;
- exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
- exint_init(&exint_init_struct);
-
- /* enable the timestamp */
- nvic_irq_enable(TAMP_STAMP_IRQn, 0, 0);
- ertc_timestamp_valid_edge_set(ERTC_TIMESTAMP_EDGE_FALLING);
- ertc_timestamp_enable(TRUE);
- }
我使能了时间戳中断功能用于测试,但我感觉,如果有入侵检测的需求的话,直接在入侵检测中断里面实现时间的读取与记录即可,无需再配置时间戳功能,以及在时间戳中断里面处理时间了。
|