回答

收藏

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

#其他 #其他 2439 人阅读 | 0 人回复 | 2018-08-24

国庆前调试好了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联系我: ■■■■■■■■, 一起交流学习新的知识。
最后,感谢爱板提供本次试用机会。
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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