[Atmel] SAML21走起29: RTC 中断模式

[复制链接]
2503|5
 楼主| ddllxxrr 发表于 2015-10-2 17:18 | 显示全部楼层 |阅读模式
本帖最后由 ddllxxrr 于 2015-10-2 17:32 编辑

今天同上次区别就是一个中断,包括定义中断函数,及初使化中断函数。
也是每隔2秒翻转一下LED0,这个程序也很好形成,在ASF Wizard 加进RTC模块,在ASF EXPLORER查看API函数的EXAMPLE形成程序。
以下是定义16比特模式向上记数:

  1. void configure_rtc_count(void)
  2. {    struct rtc_count_config config_rtc_count;
  3.          rtc_count_get_config_defaults(&config_rtc_count);
  4.          config_rtc_count.prescaler           = RTC_COUNT_PRESCALER_DIV_1;
  5.          config_rtc_count.mode                = RTC_COUNT_MODE_16BIT;
  6.          #ifdef FEATURE_RTC_CONTINUOUSLY_UPDATED   
  7.          config_rtc_count.continuously_update = true;
  8.          #endif   
  9.          rtc_count_init(&rtc_instance, RTC, &config_rtc_count);
  10.          rtc_count_enable(&rtc_instance);}
下面定义中断个使能:
  1. void configure_rtc_callbacks(void)
  2. {    rtc_count_register_callback(            &rtc_instance, rtc_overflow_callback, RTC_COUNT_CALLBACK_OVERFLOW);
  3.             rtc_count_enable_callback(&rtc_instance, RTC_COUNT_CALLBACK_OVERFLOW);}         


以下是中断函数:
  1. void rtc_overflow_callback(void){  
  2.           /* Do something on RTC overflow here */  
  3.           port_pin_toggle_output_level(LED_0_PIN);}
整个程序如下:

  1. #include <asf.h>
  2. /* SYSTEM_CLOCK_SOURCE_OSC32K configuration - Internal 32KHz oscillator */
  3. #  define CONF_CLOCK_OSC32K_ENABLE                true
  4. #  define CONF_CLOCK_OSC32K_STARTUP_TIME          SYSTEM_OSC32K_STARTUP_130
  5. #  define CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT    true
  6. #  define CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT   true
  7. #  define CONF_CLOCK_OSC32K_ON_DEMAND             true
  8. #  define CONF_CLOCK_OSC32K_RUN_IN_STANDBY        false

  9. /* Configure GCLK generator 2 (RTC) */
  10. #  define CONF_CLOCK_GCLK_2_ENABLE                true
  11. #  define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY        false
  12. #  define CONF_CLOCK_GCLK_2_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC32K
  13. #  define CONF_CLOCK_GCLK_2_PRESCALER             32
  14. #  define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE         false

  15. struct rtc_module rtc_instance;


  16. void configure_rtc_count(void)
  17. {    struct rtc_count_config config_rtc_count;
  18.          rtc_count_get_config_defaults(&config_rtc_count);
  19.          config_rtc_count.prescaler           = RTC_COUNT_PRESCALER_DIV_1;
  20.          config_rtc_count.mode                = RTC_COUNT_MODE_16BIT;
  21.          #ifdef FEATURE_RTC_CONTINUOUSLY_UPDATED   
  22.          config_rtc_count.continuously_update = true;
  23.          #endif   
  24.          rtc_count_init(&rtc_instance, RTC, &config_rtc_count);
  25.          rtc_count_enable(&rtc_instance);}
  26.          
  27.          
  28. void rtc_overflow_callback(void){  
  29.           /* Do something on RTC overflow here */  
  30.           port_pin_toggle_output_level(LED_0_PIN);}
  31.         
  32. void configure_rtc_callbacks(void)
  33. {    rtc_count_register_callback(            &rtc_instance, rtc_overflow_callback, RTC_COUNT_CALLBACK_OVERFLOW);
  34.             rtc_count_enable_callback(&rtc_instance, RTC_COUNT_CALLBACK_OVERFLOW);}         
  35.          
  36.          
  37. int main (void)
  38. {
  39.         system_init();
  40.   /* Configure and enable RTC */    configure_rtc_count();   
  41.   /* Configure and enable callback */    configure_rtc_callbacks();   
  42.   /* Set period */    rtc_count_set_period(&rtc_instance, 2000);

  43.         /* Insert application code here, after the board has been initialized. */

  44.         /* This skeleton code simply sets the LED to the state of the button. */
  45.          while (true) {        /* Infinite while loop */    }
  46. }
以下是运行时的截图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2015-10-2 19:33 | 显示全部楼层

楼主辛苦了,假期也没休息
 楼主| ddllxxrr 发表于 2015-10-3 10:26 | 显示全部楼层
dirtwillfly 发表于 2015-10-2 19:33
楼主辛苦了,假期也没休息

楼主你不也是么,我没事的时候来坛子里看看
levivi 发表于 2016-4-21 14:33 | 显示全部楼层
本帖最后由 levivi 于 2016-4-21 14:36 编辑

楼主,我用下列的代码,为什么调试发现我的时钟没有走呢?
用的SAML21开发板试的

#  define CONF_CLOCK_XOSC32K_ENABLE               true
#  define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL     SYSTEM_CLOCK_EXTERNAL_CRYSTAL
#  define CONF_CLOCK_XOSC32K_STARTUP_TIME         SYSTEM_XOSC32K_STARTUP_65536
#  define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT    true
#  define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT  true
#  define CONF_CLOCK_XOSC32K_ON_DEMAND            true
#  define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY       false

struct rtc_module rtc_inst;
struct rtc_calendar_time g_rtc;
void update_rtc(void)
{
        rtc_calendar_get_time(&rtc_inst, &g_rtc);
}
void rtc_ini(void)
{
        struct rtc_calendar_config config;
        rtc_calendar_get_config_defaults(&config);

        rtc_calendar_get_time_defaults(&g_rtc);
        config.clock_24h     = true;
        rtc_calendar_init(&rtc_inst, RTC, &config);
        
        g_rtc.year   = 2016;
        g_rtc.month  = 4;
        g_rtc.day    = 21;
        g_rtc.hour   = 14;
        g_rtc.minute = 29;
        g_rtc.second = 00;

        rtc_calendar_set_time(&rtc_inst, &g_rtc);
        rtc_calendar_enable(&rtc_inst);        
}

int main (void)
{
        
        system_init();


        rtc_ini();
        
        while(1)
        {
                update_rtc();
                asm("nop");
        }
levivi 发表于 2016-4-21 14:39 | 显示全部楼层
本帖最后由 levivi 于 2016-4-21 14:43 编辑

还有一个问题,那个RTC count的例子,一试就成功了,我试着把CONF_CLOCK_XOSC32K_ENABLE 设置为false,居然还是能成功进入回调函数翻转led灯。
难道RTC count用的不是外部32.768k的时钟?内部32k时钟也是false呀。既然叫RTC不可能用的是内部16M时钟吧?
总之atmel做的这个开发包非常难用,我每次都要发一下牢骚。
levivi 发表于 2016-4-21 15:37 | 显示全部楼层
我修改了rtc_calendar_init函数中的这句,时钟还是不变       
OSC32KCTRL->RTCCTRL.reg = RTC_CLOCK_SELECTION_XOSC32K;//levivi RTC_CLOCK_SOURCE;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7002

帖子

68

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