TA的每日心情 | 奋斗 2018-9-6 22:38 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
|
国庆前调试好了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联系我: ■■■■■■■■, 一起交流学习新的知识。
最后,感谢爱板提供本次试用机会。 |
|