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

作者: tashalee
上传时间为: 2018-08-24 04:10 PM
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联系我: ■■■■■■■■, 一起交流学习新的知识。

最后,感谢爱板提供本次试用机会。

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示