查看: 1610|回复: 0

DA14580DEVKT开发初体验之模数转换和定时器

[复制链接]
  • TA的每日心情
    奋斗
    2018-9-6 22:38
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2018-8-24 16:10:11 | 显示全部楼层 |阅读模式
    分享到:
    国庆前调试好了DA14580EVKT-B的AD和TIM0的驱动函数,但是中间有事所以现在才贴出。
    首先,根据官网给出的库函数,找到TIMx和ADC对应的底层文件,然后添加到当前的工程中。另外建议简单的定时功能就用滴答定时器好了,比较省。

    在adc.c中可以看到以下函数:
    void adc_init(uint16_t mode, uint16_t sign, uint16_t attn);
    void adc_enable_channel(uint16_t input_selection);
    void adc_disable(void);
    int adc_get_sample(void);
    uint32_t adc_get_vbat_sample(bool sample_vbat1v);
    void adc_calibrate(void);
    根据经验可推断出每个函数对应的功能,以下是我配置函数的参数,使用的是P00口。
      GPIO_SetPinFunction( GPIO_PORT_0, GPIO_PIN_0, INPUT, PID_ADC );
    SetWord16(GP_ADC_CTRL_REG,  GP_ADC_LDO_EN | 0 | 0);
      SetWord16(GP_ADC_CTRL_REG,  GP_ADC_LDO_EN | 0 | GP_ADC_EN | 0);
    SetWord16(GP_ADC_CTRL2_REG, GP_ADC_DELAY_EN | GP_ADC_I20U | 0x0002 );  // Enable 3x attenuation
      adc_calibrate();
      adc_enable_channel(0);  
    接下来就是对于定时器的配置了,我将之配置为PWM模式,使其能输出方波信号。
       timer0_stop();
        // register callback function for SWTIM_IRQn irq
      timer0_register_callback(timer0_general_user_callback_function);
      // Enable TIMER0 clock
      set_tmr_enable(CLK_PER_REG_TMR_ENABLED);
      // Sets TIMER0,TIMER2 clock division factor to 8, so TIM0 Fclk is F = 16MHz/8 = 2Mhz
      set_tmr_div(CLK_PER_REG_TMR_DIV_8);
      timer0_set_pwm_high_counter(0x0);  //no pwm
      timer0_set_pwm_low_counter(0x0);
       // Set timer with 2MHz source clock divided by 10 so Fclk = 2MHz/10 = 200kHz
      timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_DIV_BY_10);
       timer0_set_pwm_on_counter(2000);  // 200KHz / 2000  =  10ms
        // Enable SWTIM_IRQn irq
      timer0_enable_irq();
        // Start Timer0
      timer0_start();
    这样,PWM信号就配置好了,并且配置了TIM0的callback服务。写成了一个简易的时间片轮询机制。
    void timer0_general_user_callback_function(void)
    {   
      if(++loop_cnt > 30)
      {
      loop_cnt = 0;
      main_loop_enable = 1;
      }
    }
    然后在while(1)主循环中,则在底层驱动之外加了自己的处理任务(gpio.c里面没有找到IO翻转的子函数,本该自己写取反的,比较懒这样写翻转了):
      if(main_loop_enable)
      {
      //user_task;
      main_loop_enable = 0;
      if(led_clp)
      {
      led_clp = 0;
        GPIO_ConfigurePin(GPIO_PORT_1,GPIO_PIN_0,OUTPUT,PID_GPIO,TRUE);
      }
      else
      {
      led_clp = 1;
        GPIO_ConfigurePin(GPIO_PORT_1,GPIO_PIN_0,OUTPUT,PID_GPIO,FALSE);
      }
      adc_enable_channel(0);  //P00
        adc_value = adc_get_sample();
      adc_calibrate();
      }

    这样,对于DA14580的尝试就暂告一段落,因为现在没时间去移植在目前的项目中了,但是以后的项目可能会再会的,到时会对这颗BLE有更深一步的认识。
    对于本次的摸索,我并未花大量时间去弄清BLE内核的通信协议和传输机制,只是在协议程序的基础上跑自己的驱动任务(时间片轮询的架构,所以比较方便去加塞),鉴于我测试时用户任务较少,并未可观占用系统资源,若是放在实际项目中去移植的话,仍存在一定风险性。
    有疑问的朋友可以QQ联系我: ■■■■■■■■, 一起交流学习新的知识。
    最后,感谢爱板提供本次试用机会。
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 04:04 , Processed in 0.112923 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.