一、main函数的流程
以SDK中examples\ble_peripheral\ble_app_uart\为例:
int main(void)
{
uint32_t err_code;
bool erase_bonds;
uint8_t start_string[] = START_STRING;
// Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);//初始化软件定时器模块,用定时器队列实现。内部用到的是RTC1。最后False:不使用调度,调度模块没有细看。貌似 51822 关于调度的都是传 False 不使用调度。51822 的协议栈实现是基于异步事件驱动的。
uart_init();//主要设置 uart 的引脚,波特率。接收,发送中断等。并开启 uart 模块中断。官方的流控貌似都是开着的,我们用的时候要记得关掉。
buttons_leds_init(&erase_bonds);//初始化 LED 指示灯,用来指示广播和连接状态。初始化按键。
ble_stack_init();//协议栈初试化,设置时钟,demo 里面设置为外部时钟。并且注册事件派发函数
gap_params_init(); //GAP必要额一些参数的设置,设置设备名(手机扫描时会显示),设置 PPCP(外围设备首选链接参数)。(手机连上某个蓝牙设备后可以从 Generic Access Service 中看到设置的这些参数)(只有主机可以设置参数,但这里是从机设备推荐使用的参数。)
services_init(); //服务初始化(服务的创建和特征值添加)。不同的服务内容不同,这个demo中是:添加 uart 的串口服务。主要提供两个特征值来供手机和板子以及电脑的通信
advertising_init();//设置广播数据以及扫描响应数据
conn_params_init(); //链接参数设置。主要设置什么时候发起更新链接参数请求以及间隔和最大尝试次数。
printf("%s",start_string);
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);//设置广播类型,白名单,间隔,超时等特性。并开始广播。
APP_ERROR_CHECK(err_code);
for (;;)
{
//电源管理,调用 arm0 的指令__WFE();进入睡眠
power_manage();//不用深究。其中调用的指令有_WFE这种看不懂的,要看arm0/3内核中睡眠那一部分的介绍。
}
}
补充:按键中貌似有一个这样的按键:设置作为产生 DETECT signal信号, 用来唤醒 system off 模式,51822的一种低功耗睡眠模式,具体参看数据手册 power 章节,从这个模式唤醒会执行一个reset的操作。(通过 PIN_CNF 寄存器来设置一个 IO 口来作为来作为 sensing mechanism 机制的引脚。这里是设置了 WAKEUP_BUTTON_PIN 这个引脚来作为这个功能,设置成低电平时触发这个机制。)??????
1、定时器初始化
初始化软件定时器模块,该定时器模块并不是使用timer0-2
来实现定时功能。而是使用
51822
中的
RTC1
来软件模拟出定时器模块。
RTC1
使用
32.768K
时钟经过分频后是时钟来作为时钟
源。所以该函数内部实现就是设置
RTC1
相关的寄存器和做一些初始化。其原理和
timer
定
时
/
计数器模块类似。
APP_TIMER_PRESCALER:设置分频系数。(
以
32.768K
来分频
)
APP_TIMER_OP_QUEUE_SIZE:定时器操作队列,因为是用
RTC
模拟的软件定时器,因此内部是维护了一个软件定时器的操作队列
(有些版本还会有一个参数APP_TIMER_MAX_TIMERS
:设置可以创建的最大定时器个数 )
False:不使用调度,调度模块没有细看。貌似
51822
关于调度的都是传
False
不使用调度。
518