最近硬件四軸很火,瞭解了好久,仍是選擇了正點原子的MiniFly,主要仍是原子的論壇資料多,後邊能夠有人討論,不像不少就是建了個羣,研究問題仍是在論壇方便不少。框架
四軸終於拿到手,功能很強大,主要是還支持二次開發,能夠研究下玩玩小四軸了函數
仍是先從硬件入手分析下spa
1.系統框架
主體能夠分紅兩個小系統,後續能夠按照這個順序分析代碼
1.通訊部分---基於M0和NFR51822,包括電源管理
2.控制部分---基於M4和外圍傳感器code
2.比較關注的電源部分
電源仍是比較考究,直接包含了充電功能,不用每次使用外置的充電模塊(以前自制過一個充電模塊,看來之後能夠集成到電路里了)blog
按鍵斷電功能這個比較喜歡:這個是NFR51822控制VEN_D引腳來實現斷電的ip
上個NFR51822部分電路
開發
開始看代碼,大體看了下程序,先是監測按鍵狀態input
/*按鍵掃描處理*/ void buttonProcess() { static unsigned int lastTick; static unsigned int pressedTick; static bool pressed = false; if (lastTick != systickGetTick()) { lastTick = systickGetTick(); if(pressed==false && BUTTON_READ()==BUTTON_PRESSED) { pressed = true; pressedTick = systickGetTick(); } else if(pressed==true) { if(BUTTON_READ()==BUTTON_RELEASED) pressed = false; if ((systickGetTick()-pressedTick) > BUTTON_LONGPRESS_TICK) state = buttonLongPress; else if(BUTTON_READ()==BUTTON_RELEASED) state = buttonShortPress; } } } /*獲取按鍵狀態*/ buttonEvent_e buttonGetState() { buttonEvent_e currentState = state; state = buttonIdle; return currentState; }
而後就是在主函數中進行相應的操做,先不說了it
看下怎麼實現電源開關的:這麼最後應該F1部分仍是有電的,只是消耗較少,尋求一種能夠徹底斷電的方案??io
/*開啓電源*/ void pmPowerOn(void) { nrf_gpio_cfg_output(UART_TX_PIN); //使能串口TX nrf_gpio_pin_set(UART_TX_PIN); nrf_gpio_cfg_output(RADIO_PAEN_PIN);// 開啓無線功能 nrf_gpio_pin_set(RADIO_PAEN_PIN); nrf_gpio_cfg_output(PM_VBAT_SINK_PIN);// 設置ADC nrf_gpio_pin_clear(PM_VBAT_SINK_PIN); pmStartAdc(); //開啓ADC轉換 } /*關閉電源*/ void pmPowerOff(void) { nrf_gpio_cfg_input(UART_TX_PIN, NRF_GPIO_PIN_PULLDOWN); uartDeinit(); nrf_gpio_cfg_input(STM_NRST_PIN, NRF_GPIO_PIN_PULLDOWN); nrf_gpio_pin_clear(STM_NRST_PIN); nrf_gpio_pin_clear(PM_VCCEN_PIN); //關閉 LDO使能控制腳 LED_OFF(); nrf_gpio_pin_clear(RADIO_PAEN_PIN); //關閉PA nrf_gpio_cfg_input(PM_VBAT_SINK_PIN, NRF_GPIO_PIN_NOPULL); NRF_POWER->SYSTEMOFF = 1UL; while(1); //進入死循環 } void pmInit() { /* STM32 電源配置 */ nrf_gpio_cfg_output(PM_VCCEN_PIN); nrf_gpio_pin_set(PM_VCCEN_PIN); //使能stm32電源 msDelay(100); /* STM32 復位 */ nrf_gpio_cfg_output(STM_NRST_PIN); nrf_gpio_pin_clear(STM_NRST_PIN); msDelay(100); nrf_gpio_pin_set(STM_NRST_PIN); msDelay(100); nrf_gpio_cfg_input(USB_CONNECTED_PIN, NRF_GPIO_PIN_NOPULL); nrf_gpio_cfg_input(PM_CHG_STATE_PIN, NRF_GPIO_PIN_PULLUP); pmPowerOn(); //開啓電源 }