任务目标
在上一章的基础上(已经完成对传感器IIC的数据读取),
链接: link
https://blog.csdn.net/qq_34344752/article/details/134041509
对NRF52840中的定时器进行设置,从而实现在一定时间间隔后自动进行数据采样
注:基于官方库例程中的ble_app_blink进行更改
main.c 文件中进行更改
#define m_SENSOR_DETECTED_INTERVAL APP_TIMER_TICKS(5000) /**< 全局变量, 设置传感器检测中断时间2s
/*
设置定时器启动
*/
static void application_timers_start(void)
{
ret_code_t err_code;
// Start application timers.
err_code = app_timer_start(m_sensor_timer_id, m_SENSOR_DETECTED_INTERVAL, NULL);
APP_ERROR_CHECK(err_code);
}
/*
中断处理函数,即每隔‘m_SENSOR_DETECTED_INTERVAL’所定义的时间将会跳转至以下中断
*/
static void Sensor_detected_timeout_handler(void *p_context)
{
ret_code_t err_code;
//这里通过调用TCA9548(IIC拓展模块)对不同通道的传感器进行顺序依次读取数据
TCA9548_Open_Channel(0); //Spec sensor 1 detect
NRF_LOG_INFO("Spec_sensor1 detecting. \r\n");
Getdata_test();
TCA9548_Close_Channel(0);
nrf_delay_ms(50);
err_code = ble_Spec_change(&m_lbs); // 这里用来跳转到蓝牙数据发送函数中,具体在 ble_lbs.c
TCA9548_Open_Channel(1); //Spec sensor 2 detect
NRF_LOG_INFO("Spec_sensor2 detecting. \r\n");
Getdata_test();
TCA9548_Close_Channel(1);
err_code = ble_Spec_change2(&m_lbs);
TCA9548_Open_Channel(2);
NRF_LOG_INFO("Humi_sensor detecting. \r\n");
SHT41_sensor();
TCA9548_Close_Channel(2);
err_code = ble_TH_change(&m_lbs); //温湿度蓝牙数据发送
}
/* 定时器初始化函数
m_sensor_timer_id,定时器事件ID号,对特定ID触发事件
APP_TIMER_MODE_REPEATED,定时器重复触发模式
Sensor_detected_timeout_handler 定时器中断函数,一定要确保和上面的函数名称一致!
*/
static void timers_init(void)
{
// Initialize timer module, making it use the scheduler
ret_code_t err_code = app_timer_init();
APP_ERROR_CHECK(err_code);
err_code = app_timer_create(&m_sensor_timer_id,
APP_TIMER_MODE_REPEATED,
Sensor_detected_timeout_handler); // TH sensor
APP_ERROR_CHECK(err_code);
}
最后,在main函数中对下面函数进行调用
timers_init() 和 application_timers_start()
int main(void)
{
// Initialize.
log_init();
twi_init();
leds_init();
timers_init(); // 定时器初始化
buttons_init();
power_management_init();
ble_stack_init();
gap_params_init();
gatt_init();
services_init();
advertising_init();
conn_params_init();
// Start execution.
NRF_LOG_INFO("Blinky example started.");
application_timers_start(); //定时器服务打开
advertising_start();
// Enter main loop.
for (;;)
{
NRF_LOG_FLUSH();
idle_state_handle();
}
}