Тоже пытаюсь разобраться. Поставил себе пока такую "учебную" задачу: что-нибудь записать в характеристику и вызвать bls_att_pushNotifyData. Чтобы на "приемнике" сработало событие нотификации (или индикации). Делать это периодически.
Значит, нужен таймер. С таймерами непонятно - в SDK есть софтварные таймеры, которые "крутятся", как я понимаю, внутри mainloop и примерно в назначенное время отрабатывают свою процедуру.
Но у @pvvx есть какие-то другие таймеры! В документации их нет. И они вызывают прерывание, а не крутятся в петле. Ну ок, попробуем.
В user_init() пишем:
Функцию копируем у pvvx:
В прерывание добавляем
И в этой функции-части прерывания пишем, что хотели:
Светодиод мигает. Но, судя по миганию, вызов прерываний зависит от RF-части - в зависимости от режима работы и параметров соединения. Так что о точности такого таймера говорить не приходится. Ну и самое главное - bls_att_pushNotifyData срабатывает 1-2 раза, а потом всё падает - соединение прерывается, а status становится каким-то странным вообще, не описанным в документации - 0x88, 0x89, 0x5B...
В общем, так, похоже, делать нельзя.
Прокомментируйте, пожалуйста.
Значит, нужен таймер. С таймерами непонятно - в SDK есть софтварные таймеры, которые "крутятся", как я понимаю, внутри mainloop и примерно в назначенное время отрабатывают свою процедуру.
Но у @pvvx есть какие-то другие таймеры! В документации их нет. И они вызывают прерывание, а не крутятся в петле. Ну ок, попробуем.
В user_init() пишем:
Timer_Init(100000);
Функцию копируем у pvvx:
Код:
/* Timer Init (IRQ)*/
void Timer_Init(u32 period_us) {
reg_tmr1_capt = period_us * CLOCK_SYS_CLOCK_1US;
reg_tmr_ctrl8 |= FLD_TMR1_EN; // FLD_TMR1_MODE = 0
reg_irq_mask1 |= FLD_IRQ_TMR1_EN;
reg_tmr_sta = FLD_TMR_STA_TMR1; // clear irq status
}
TimerIrq();
И в этой функции-части прерывания пишем, что хотели:
Код:
_attribute_ram_code_ void TimerIrq(void) {
if(reg_irq_src & FLD_IRQ_TMR1_EN) {
reg_tmr_sta = FLD_TMR_STA_TMR1; // clear irq status
reg_irq_src = FLD_IRQ_TMR1_EN;
DATA_LED_TOGGLE; // переключаем светодиод
extern u8 SppDataServer2ClientData[ATT_MTU_SIZE - 3];
SppDataServer2ClientData[0]=SppDataServer2ClientData[0]+1;
ble_sts_t status;
status=bls_att_pushNotifyData(SPP_Server2Client_INPUT_DP_H, (u8 *) &SppDataServer2ClientData, 3);
printf("status: %x \n\r", status);
}
}
В общем, так, похоже, делать нельзя.
Прокомментируйте, пожалуйста.