master
ThinkPad-T460P 2021-03-15 19:26:10 +08:00
parent 26ff1cf7bc
commit 3fc9d2c2b2
25 changed files with 374 additions and 335 deletions

View File

@ -13,6 +13,6 @@
osThreadId_t cdcMonitorTaskHandle;
const osThreadAttr_t cdcMonitorTask_attributes;
void StartCdcMonitorTask(void *argument);
void CdcMonitorTask(void *argument);
#endif

View File

@ -10,10 +10,10 @@
#include "cmsis_os2.h"
osThreadId_t CoulombReadHandle;
osThreadId_t CoulombTaskHandle;
const osThreadAttr_t CoulombRead_attributes;
const osThreadAttr_t CoulombTask_attributes;
void StartCoulombRead(void *argument);
void CoulombTask(void *argument);
#endif

View File

@ -9,7 +9,7 @@ osThreadId_t DemoTask1Handle;
const osThreadAttr_t DemoTask1_attributes;
const osThreadAttr_t DemoTask2_attributes;
void StartDemoTask1(void *argument);
void StartDemoTask2(void *argument);
void DemoTask1(void *argument);
void DemoTask2(void *argument);
#endif

View File

@ -6,9 +6,9 @@
osSemaphoreId_t ElogOutputBinarySemHandle;
const osSemaphoreAttr_t ElogOutputBinarySem_attributes;
osSemaphoreId_t ElogUartBinarySemHandle;
const osSemaphoreAttr_t ElogUartBinarySem_attributes;
osMutexId_t ElogUartMutexHandle;
const osMutexAttr_t ElogUartMutex_attributes;
osMutexId_t ElogOutputMutexHandle;
const osMutexAttr_t ElogOutputMutex_attributes;
@ -19,8 +19,8 @@ osThreadId_t ElogFlushTaskHandle;
const osThreadAttr_t ElogInitTask_attributes;
const osThreadAttr_t ElogFlushTask_attributes;
void StartElogInitTask(void *argument);
void StartElogFlushTask(void *argument);
void ElogInitTask(void *argument);
void ElogFlushTask(uint8_t intervnal);
void my_elog_init();
#endif

View File

@ -10,24 +10,7 @@
#include "cmsis_os2.h"
//pressed time < short press time(ms)
#define SHORT_PRESS_TIME 500
//pressed time > long press time(ms)
#define LONG_PRESS_TIME 1000
//define exti flag for task-notification / thread-flags
typedef enum{
SHUTDOWN_REQ_ACTIVE = 0x01<< 0,
SHUTDOWN_REQ_INACTIVE = 0x01<< 1,
MOD_SLEEP_ACTIVE = 0x01<< 2,
MOD_SLEEP_INACTIVE = 0x01<< 3,
PWR_BTN_ACTIVE = 0x01<< 4,
PWR_BTN_INACTIVE = 0x01<< 5,
CUS_BTN_ACTIVE = 0x01<< 6,
CUS_BTN_INACTIVE = 0x01<< 7,
}Exti_Flags_t;
Exti_Flags_t Exti_Flags;
@ -49,11 +32,11 @@ osTimerId_t CustBtnShortPressTimerHandle;
const osTimerAttr_t CustBtnShortPressTimer_attributes;
//Event Flag
osEventFlagsId_t ExtiEventFlags;
const osEventFlagsAttr_t ExtiEventFlags_attributes;
// osEventFlagsId_t ExtiEventFlags;
// const osEventFlagsAttr_t ExtiEventFlags_attributes;
//Task
void StartExtiServiceTask(void *argument);
void ExtiServiceTask(void *argument);
//callback
void PwrBtnLongPressTimerCallback(void *argument);

View File

@ -7,5 +7,5 @@ osThreadId_t InfoOutputTaskHandle;
const osThreadAttr_t InfoOutputTask_attributes;
void StartInfoOutputTask(void *argument);
void InfoOutputTask(void *argument);
#endif

View File

@ -7,6 +7,6 @@ osThreadId_t IWDGTaskHandle;
const osThreadAttr_t IWDGTask_attributes;
void StartIWDGTask(void *argument);
void IWDGTask(void *argument);
#endif

View File

@ -13,7 +13,7 @@
/* Definitions for LedBlinkTask */
osThreadId_t LedBlinkTaskHandle;
const osThreadAttr_t LedBlinkTask_attributes;
void StartLedBlinkTask(void *argument);
void LedBlinkTask(void *argument);
#endif

View File

@ -10,9 +10,18 @@
#include "cmsis_os2.h"
#define EVENT_FLAG_POWER_MONITOR_MAIN_POWER_GOOD (0x01 << 0)
//#define THREAD_FLAG_POWER_MONITOR_BKUP_POWER_GOOD
//Event Flag
osEventFlagsId_t PowerMonitorEventFlags;
const osEventFlagsAttr_t PowerMonitorEventFlags_attributes;
/* Definitions for PowerMonitTask */
osThreadId_t PowerMonitTaskHandle;
const osThreadAttr_t PowerMonitTask_attributes;
void StartPowerMonitTask(void *argument);
void PowerMonitTask(void *argument);
#endif

View File

@ -20,7 +20,7 @@ const osThreadAttr_t cdcMonitorTask_attributes = {
};
//task instance
void StartCdcMonitorTask(void *argument){
void CdcMonitorTask(void *argument){
uint8_t port_restart_temp[64]={0};
uint32_t number_restart_temp =0;
bool beep_flag = false;

View File

@ -14,10 +14,10 @@
/* Definitions for CoulombRead */
const osThreadAttr_t CoulombRead_attributes = {
.name = "CoulombRead",
const osThreadAttr_t CoulombTask_attributes = {
.name = "CoulombTask",
.priority = (osPriority_t) osPriorityBelowNormal,
.stack_size = 128 * 4
.stack_size = 256 * 4
};
/* USER CODE BEGIN Header_StartCoulombRead */
@ -27,7 +27,7 @@ const osThreadAttr_t CoulombRead_attributes = {
* @retval None
*/
/* USER CODE END Header_StartCoulombRead */
void StartCoulombRead(void *argument)
void CoulombTask(void *argument)
{
/* USER CODE BEGIN StartCoulombRead */
log_d("Start Coulomb Read Task");

View File

@ -13,23 +13,23 @@
const osThreadAttr_t DemoTask1_attributes = {
.name = "DemoTask1",
.priority = (osPriority_t) osPriorityLow1,
.priority = (osPriority_t) osPriorityLow2,
.stack_size = 256 * 4
};
const osThreadAttr_t DemoTask2_attributes = {
.name = "DemoTask2",
.priority = (osPriority_t) osPriorityLow1,
.priority = (osPriority_t) osPriorityLow2,
.stack_size = 256 * 4
};
void StartDemoTask1(void *argument){
void DemoTask1(void *argument){
uint8_t i=0;
log_d("Start Demo Task1");
for(;;){
log_v("DemoTask1 counter [%d].",i++);
osDelay(100);
log_v("DemoTask1 counter [%d].",i++);
}
}
void StartDemoTask2(void *argument){
void DemoTask2(void *argument){
uint8_t i=0;
log_d("Start Demo Task2");
for(;;){

View File

@ -15,9 +15,9 @@
const osSemaphoreAttr_t ElogOutputBinarySem_attributes = {
.name = "ElogOutputBinarySem"
};
//mutex
const osMutexAttr_t ElogUartMutex_attributes = {
.name = "ElogUartMutex"
//semaphore
const osSemaphoreAttr_t ElogUartBinarySem_attributes = {
.name = "ElogUartBinarySem"
};
const osMutexAttr_t ElogOutputMutex_attributes = {
.name = "ElogOutputMutex"
@ -31,23 +31,24 @@ const osThreadAttr_t ElogInitTask_attributes = {
const osThreadAttr_t ElogFlushTask_attributes = {
.name = "ElogFlushTask",
.priority = (osPriority_t) osPriorityLow,
.priority = (osPriority_t) osPriorityLow1,
.stack_size = 256 * 4
};
void StartElogInitTask(void *argument){
void ElogInitTask(void *argument){
// my_elog_init();
// osThreadExit();//exit this thread,execute this code only once
}
void StartElogFlushTask(void *argument){
//intervalbuffer flush time interval
void ElogFlushTask(uint8_t intervnal){
log_d("Start log Flush Task");
for(;;){
elog_flush();
osDelay(1);
osDelay(intervnal);
}
}
@ -81,3 +82,9 @@ void my_elog_init(){
/* start EasyLogger */
elog_start();
}
void HAL_UART1_TxHalfCpltCallback(UART_HandleTypeDef *huart){
osSemaphoreRelease(ElogUartBinarySemHandle);
}

View File

@ -11,10 +11,28 @@
#include "main.h"
#include "navikit.h"
//pressed time < short press time(ms)
#define SHORT_PRESS_TIME 200
//pressed time > long press time(ms)
#define LONG_PRESS_TIME 1000
//define exti flag for task-notification / thread-flags
#define THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_ACTIVE (0x01<< 0)
#define THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_INACTIVE (0x01<< 1)
#define THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_ACTIVE (0x01<< 2)
#define THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_INACTIVE (0x01<< 3)
#define THREAD_FLAG_EXTI_SERVICE_PWR_BTN_ACTIVE (0x01<< 4)
#define THREAD_FLAG_EXTI_SERVICE_PWR_BTN_INACTIVE (0x01<< 5)
#define THREAD_FLAG_EXTI_SERVICE_CUS_BTN_ACTIVE (0x01<< 6)
#define THREAD_FLAG_EXTI_SERVICE_CUS_BTN_INACTIVE (0x01<< 7)
//Thread
const osThreadAttr_t ExtiServiceTask_attributes = {
.name = "ExtiServiceTask",
.priority = (osPriority_t) osPriorityBelowNormal,
.priority = (osPriority_t) osPriorityBelowNormal1,
.stack_size = 256 * 4
};
@ -32,74 +50,88 @@ const osTimerAttr_t CustBtnShortPressTimer_attributes = {
.name = "CustBtnShortPressTimer"
};
//Event Flag
const osEventFlagsAttr_t ExtiEventFlags_attributes = {
.name = "ExtiEventFlags"
};
// //Event Flag
// const osEventFlagsAttr_t ExtiEventFlags_attributes = {
// .name = "ExtiEventFlags"
// };
/* USER CODE BEGIN Header_StartExtiServiceTask */
/* USER CODE BEGIN Header_ExtiServiceTask */
/**
* @brief Function implementing the ExtiServiceTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartExtiServiceTask */
void StartExtiServiceTask(void *argument)
/* USER CODE END Header_ExtiServiceTask */
void ExtiServiceTask(void *argument)
{
/* USER CODE BEGIN StartExtiServiceTask */
/* USER CODE BEGIN ExtiServiceTask */
/* Infinite loop */
uint32_t thread_flag = 0;
log_d("Start EXTI Service Task");
if(HAL_GPIO_ReadPin(SYS_POWER_BTN_GPIO_Port, SYS_POWER_BTN_Pin)==GPIO_PIN_SET)
osTimerStart(PwrBtnLongPressTimerHandle,LONG_PRESS_TIME);
for(;;)
{
thread_flag = osThreadFlagsGet();
if(thread_flag & SHUTDOWN_REQ){
//shutdown request pin
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_ACTIVE){
log_i("SOM's shutdown_req pin falling edge, SOM request to shutdown.");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_ACTIVE);
}
if(thread_flag & MOD_SLEEP){
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_INACTIVE){
log_v("SOM's shutdown_req pin rising edge");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_INACTIVE);
}
//powwer button
if((thread_flag & PWR_BTN) && !osTimerIsRunning(PwrBtnLongPressTimerHandle)){
//module sleep pin
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_ACTIVE){
log_v("SOM's mod_sleep pin rising edge");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_ACTIVE);
}
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_INACTIVE){
log_v("SOM's mod_sleep pin falling edge");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_INACTIVE);
}
//power button pin
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_PWR_BTN_ACTIVE){
log_v("power_btn status: pressed.");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_PWR_BTN_ACTIVE);
if(!osTimerIsRunning(PwrBtnLongPressTimerHandle)){
osTimerStart(PwrBtnLongPressTimerHandle,LONG_PRESS_TIME);
osTimerStart(PwrBtnShortPressTimerHandle,SHORT_PRESS_TIME);
}else if(!(thread_flag & PWR_BTN) && osTimerIsRunning(PwrBtnLongPressTimerHandle)){
}
}
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_PWR_BTN_INACTIVE){
log_v("power_btn status: released.");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_PWR_BTN_INACTIVE);
osTimerStop(PwrBtnLongPressTimerHandle);
osTimerStop(PwrBtnShortPressTimerHandle);
}
//custom button
if((thread_flag & CUS_BTN) && !osTimerIsRunning(CustBtnLongPressTimerHandle)) {
//custom button pin
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_CUS_BTN_ACTIVE){
log_v("custom_btn status: pressed.");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_CUS_BTN_ACTIVE);
if(!osTimerIsRunning(CustBtnLongPressTimerHandle)) {
osTimerStart(CustBtnLongPressTimerHandle,LONG_PRESS_TIME);
osTimerStart(CustBtnShortPressTimerHandle,SHORT_PRESS_TIME);
}else if(!(thread_flag & CUS_BTN) && osTimerIsRunning(CustBtnLongPressTimerHandle)){
}
}
if(thread_flag & THREAD_FLAG_EXTI_SERVICE_CUS_BTN_INACTIVE){
log_v("custom_btn status: released.");
osThreadFlagsClear(THREAD_FLAG_EXTI_SERVICE_CUS_BTN_INACTIVE);
osTimerStop(CustBtnLongPressTimerHandle);
osTimerStop(CustBtnShortPressTimerHandle);
}
// //power button
// if(NaviKit.sys.power_btn && !osTimerIsRunning(PwrBtnLongPressTimerHandle)){
// osTimerStart(PwrBtnLongPressTimerHandle,LONG_PRESS_TIME);
// osTimerStart(PwrBtnShortPressTimerHandle,SHORT_PRESS_TIME);
// }
// osDelay(2);
// if(!NaviKit.sys.power_btn && osTimerIsRunning(PwrBtnLongPressTimerHandle)){
// osTimerStop(PwrBtnLongPressTimerHandle);
// osTimerStop(PwrBtnShortPressTimerHandle);
// }
// osDelay(2);
//custom button
// if(!NaviKit.sys.custom_btn && osTimerIsRunning(CustBtnLongPressTimerHandle)){
// }
// osDelay(2);
// if(NaviKit.sys.custom_btn && !osTimerIsRunning(CustBtnLongPressTimerHandle)){
// }
// osDelay(2);
osDelay(10);
}
/* USER CODE END StartExtiServiceTask */
/* USER CODE END ExtiServiceTask */
}
@ -136,6 +168,7 @@ void CustBtnLongPressTimerCallback(void *argument)
}
void PwrBtnShortPressTimerCallback(void *argument)
{
if(osThreadFlagsGet() & THREAD_FLAG_EXTI_SERVICE_PWR_BTN_INACTIVE){//power_button has released
log_v("power button short pressed.");
switch(NaviKit.sys.sta){
case run: {//som is running, send sleep requeset to operate system
@ -150,8 +183,10 @@ void PwrBtnShortPressTimerCallback(void *argument)
default : break;
}
}
}
void CustBtnShortPressTimerCallback(void *argument)
{
if(osThreadFlagsGet() & THREAD_FLAG_EXTI_SERVICE_PWR_BTN_INACTIVE){//power_button has released
log_v("custom button short pressed.");
switch(NaviKit.sys.sta){
case run:{
@ -165,6 +200,7 @@ void CustBtnShortPressTimerCallback(void *argument)
default : break;
}
}
}
@ -174,45 +210,42 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
case SOM_SHUTDOWN_REQ_Pin:{
if(HAL_GPIO_ReadPin(SOM_SHUTDOWN_REQ_GPIO_Port, SOM_SHUTDOWN_REQ_Pin)==GPIO_PIN_RESET){//falling edge trigger
if(NaviKit.sys.sta == run){//if jetson nano shutdown output low,the power_en should be set low less than 10us
PWR_Enable(SOM_PWR_EN,false,0);
PWR_Enable_IRQ(SOM_PWR_EN,false,0);
NaviKit.sys.next_sta = idle;
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)SHUTDOWN_REQ_ACTIVE);
// log_i("SOM's shutdown_req pin falling edge, SOM request to shutdown.");
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_ACTIVE);
}
}else{//Rising edge trigger
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)SHUTDOWN_REQ_INACTIVE);
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_SHUTDOWN_REQ_INACTIVE);
}
}break;
case SOM_MOD_SLEEP_Pin:{
if(HAL_GPIO_ReadPin(SOM_MOD_SLEEP_GPIO_Port, SOM_MOD_SLEEP_Pin)==GPIO_PIN_SET){//Rising edge trigger
// log_i("SOM's sleep pin rising edge.");
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)MOD_SLEEP_ACTIVE);
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_ACTIVE);
}else{//falling edge trigger
// log_v("SOM's sleep pin falling edge.");
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)MOD_SLEEP_INACTIVE);
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_MOD_SLEEP_INACTIVE);
}
}break;
case SYS_POWER_BTN_Pin:{
if(HAL_GPIO_ReadPin(SYS_POWER_BTN_GPIO_Port, SYS_POWER_BTN_Pin)==GPIO_PIN_SET){//Rising edge trigger
NaviKit.sys.power_btn = true;
// log_v("power_btn status: pressed.");
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)PWR_BTN_ACTIVE);
// NaviKit.sys.power_btn = true;
//power button pressed
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_PWR_BTN_ACTIVE);
}else{//falling edge trigger
NaviKit.sys.power_btn = false;
// log_v("power_btn status: released.");
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)PWR_BTN_INACTIVE);
// NaviKit.sys.power_btn = false;
//power button released
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_PWR_BTN_INACTIVE);
}
}break;
case SYS_CUSTOM_BTN_Pin:{
if(HAL_GPIO_ReadPin(SYS_CUSTOM_BTN_GPIO_Port, SYS_CUSTOM_BTN_Pin)==GPIO_PIN_RESET){//falling edge trigger
// log_v("custom_btn status: pressed.");
NaviKit.sys.custom_btn = true;
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)CUS_BTN_ACTIVE);
// NaviKit.sys.custom_btn = true;
//custom button pressed
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_CUS_BTN_ACTIVE);
}else{//Rising edge trigger
// log_v("custom_btn status: released.");
NaviKit.sys.custom_btn = false;
osThreadFlagsSet(ExtiServiceTaskHandle,(Exti_Flags_t)CUS_BTN_INACTIVE);
// NaviKit.sys.custom_btn = false;
//custom button released
osThreadFlagsSet(ExtiServiceTaskHandle,THREAD_FLAG_EXTI_SERVICE_CUS_BTN_INACTIVE);
}
}break;
}

View File

@ -16,7 +16,7 @@ const osThreadAttr_t InfoOutputTask_attributes = {
.priority = (osPriority_t) osPriorityLow2,
.stack_size = 256 * 4
};
void StartInfoOutputTask(void *argument){
void InfoOutputTask(void *argument){
log_d("Start Info Output Task");
for(;;){
osThreadExit();

View File

@ -18,7 +18,7 @@ const osThreadAttr_t IWDGTask_attributes = {
.stack_size = 256 * 4
};
void StartIWDGTask(void *argument){
void IWDGTask(void *argument){
log_d("Start IWDG Task");
for(;;){
HAL_IWDG_Refresh(&hiwdg);

View File

@ -13,35 +13,37 @@
const osThreadAttr_t LedBlinkTask_attributes = {
.name = "LedBlinkTask",
.priority = (osPriority_t) osPriorityLow7,
.priority = (osPriority_t) osPriorityLow,
.stack_size = 256 * 4
};
/* USER CODE BEGIN Header_StartLedBlinkTask */
/* USER CODE BEGIN Header_LedBlinkTask */
/**
* @brief Function implementing the LedBlinkTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartLedBlinkTask */
void StartLedBlinkTask(void *argument)
/* USER CODE END Header_LedBlinkTask */
void LedBlinkTask(void *argument)
{
/* USER CODE BEGIN StartLedBlinkTask */
/* USER CODE BEGIN LedBlinkTask */
/* Infinite loop */
log_d("Start LED Blink Task");
log_d(" LED Blink Task");
for(;;)
{
osDelay(1000);
switch(NaviKit.sys.sta){
case run: {
if(false == PWR_Status(SYS_PWR_LED))
PWR_Enable(SYS_PWR_LED,true,0);//turn on power led
PWR_Enable(SYS_RUN_LED,true,50);//turn on sys run led
PWR_Enable(SYS_RUN_LED,false,0);//turn off sys run led
}break;
case idle:{
PWR_Enable(SYS_PWR_LED,false,0);//turn on power led//turn off power led
if(true == PWR_Status(SYS_PWR_LED))
PWR_Enable(SYS_PWR_LED,false,0);//turn off power led
PWR_Enable(SYS_RUN_LED,true,20);//turn on sys run led
PWR_Enable(SYS_RUN_LED,false,3000);//turn off sys run led
@ -75,6 +77,6 @@ void StartLedBlinkTask(void *argument)
default : break;
}
}
/* USER CODE END StartLedBlinkTask */
/* USER CODE END LedBlinkTask */
}

View File

@ -18,33 +18,44 @@ const osThreadAttr_t PowerMonitTask_attributes = {
.stack_size = 256 * 4
};
//Event Flag
const osEventFlagsAttr_t PowerMonitorEventFlags_attributes = {
.name = "PowerMonitorEventFlags"
};
/* USER CODE BEGIN Header_StartPowerMonitTask */
/* USER CODE BEGIN Header_PowerMonitTask */
/**
* @brief Function: Monit som power status and PMB status
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartPowerMonitTask */
void StartPowerMonitTask(void *argument)
/* USER CODE END Header_PowerMonitTask */
void PowerMonitTask(void *argument)
{
/* USER CODE BEGIN StartPowerMonitTask */
/* USER CODE BEGIN PowerMonitTask */
log_d("Start Power Monitor Task");
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&(NaviKit.pmb.rails.adc), ADC_CH_COUNT);
osDelay(100);
osDelay(10);
/* Infinite loop */
for(;;)
{
if((NaviKit.pmb.rails.main_pwr > 30) || (NaviKit.pmb.rails.main_pwr < 19)){
NaviKit.pmb.main_pwr_good = false;
log_e("Main power:%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
if((NaviKit.sys.next_sta == run) && (NaviKit.sys.next_sta == run)){
TaskBeep(200,2);
}
}else{
log_d("Main power :%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
NaviKit.pmb.main_pwr_good = true;
}
if(NaviKit.pmb.rails.main_pwr > 30){
TaskBeep(200,1);
log_e("Main power is exception:%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
}
if(NaviKit.pmb.rails.bkp_bat > 15){
log_e("Backup battery is exception:%dmV",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
TaskBeep(200,1);
}
if((NaviKit.pmb.rails.bkp_bat < 8) || (NaviKit.pmb.rails.bkp_bat > 15)){
TaskBeep(200,2);
}else{
//stat1 stat2 lead-acid
//1 1 Not Charging
//1 0 Float Charge
@ -53,51 +64,34 @@ void StartPowerMonitTask(void *argument)
NaviKit.pmb.sta.chrg_stat1 = (bool)HAL_GPIO_ReadPin(PMB_CHRG_STAT1_GPIO_Port, PMB_CHRG_STAT1_Pin);
NaviKit.pmb.sta.chrg_stat2 = (bool)HAL_GPIO_ReadPin(PMB_CHRG_STAT2_GPIO_Port, PMB_CHRG_STAT2_Pin);
if(!NaviKit.pmb.sta.chrg_stat1 && !NaviKit.pmb.sta.chrg_stat2)
log_v("Backup battery status:%dmV Bulk Charge(Vth=12.6V)",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
if(!NaviKit.pmb.sta.chrg_stat1 && NaviKit.pmb.sta.chrg_stat2)
log_v("Backup battery status:%dmV Absorption Charge(Vth=14.4V)",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
if(NaviKit.pmb.sta.chrg_stat1 && !NaviKit.pmb.sta.chrg_stat2)
log_v("Backup battery status:%dmV Float Charge(Vth=13.3V)",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
if(NaviKit.pmb.sta.chrg_stat1 && NaviKit.pmb.sta.chrg_stat2)
log_v("Backup battery status:%dmV Not Charge",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
if(NaviKit.sys.sta == run || NaviKit.sys.sta == dfu ){
if(NaviKit.pmb.rails.main_pwr < 19){
TaskBeep(200,1);
log_w("Main power has been lost, please shutdown computer as soon as possible:%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
}else
log_v("Main power rail regular:%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
if(false == NaviKit.pmb.sta.chrg_stat1 && false == NaviKit.pmb.sta.chrg_stat2)
log_d("Backup battery :%dmV Bulk Charge(Vth=12.6V)",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
else if(false == NaviKit.pmb.sta.chrg_stat1 && true == NaviKit.pmb.sta.chrg_stat2)
log_d("Backup battery :%dmV Absorption Charge(Vth=14.4V)",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
else if(true == NaviKit.pmb.sta.chrg_stat1 && false == NaviKit.pmb.sta.chrg_stat2)
log_d("Backup battery :%dmV Float Charge(Vth=13.3V)",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
else if(true == NaviKit.pmb.sta.chrg_stat1 && true == NaviKit.pmb.sta.chrg_stat2)
log_d("Backup battery :%dmV Not Charge",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
}
if(NaviKit.pmb.rails.out_24v > 26.4 || NaviKit.pmb.rails.out_24v < 21.6)
log_e("24V(±10%%) power rail exception:%dmV",(uint32_t)(NaviKit.pmb.rails.out_24v*1000));
log_e("24V(±10%%) :%dmV",(uint32_t)(NaviKit.pmb.rails.out_24v*1000));
else
log_v("24V(±10%%) power rail regular:%dmV",(uint32_t)(NaviKit.pmb.rails.out_24v*1000));
log_d("24V(±10%%) :%dmV",(uint32_t)(NaviKit.pmb.rails.out_24v*1000));
if(NaviKit.pmb.rails.out_5v > 5.5 || NaviKit.pmb.rails.out_5v < 4.5)
log_e("5V(±10%%) power rail exception:%dmV",(uint32_t)(NaviKit.pmb.rails.out_5v*1000));
log_e("5V(±10%%) :%dmV",(uint32_t)(NaviKit.pmb.rails.out_5v*1000));
else
log_v("5V(±10%%) power rail regular:%dmV",(uint32_t)(NaviKit.pmb.rails.out_5v*1000));
log_d("5V(±10%%) :%dmV",(uint32_t)(NaviKit.pmb.rails.out_5v*1000));
if(NaviKit.pmb.rails.out_12v > 13.2 || NaviKit.pmb.rails.out_12v < 10.8)
log_e("12V(±10%%) power rail exception:%dmV",(uint32_t)(NaviKit.pmb.rails.out_12v*1000));
log_e("12V(±10%%) :%dmV",(uint32_t)(NaviKit.pmb.rails.out_12v*1000));
else
log_v("12V(±10%%) power rail regular:%dmV",(uint32_t)(NaviKit.pmb.rails.out_12v*1000));
log_d("12V(±10%%) :%dmV",(uint32_t)(NaviKit.pmb.rails.out_12v*1000));
if(NaviKit.pmb.rails.bkp_bat < 9.5)
log_w("Backup battery exception:%dmV",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
else
log_v("Backup battery is regular:%dmV",(uint32_t)(NaviKit.pmb.rails.bkp_bat*1000));
osDelay(2000);
}else {//not run state
osDelay(5000);
osDelay(3000);
}
// log_d("state :%d",NaviKit.sys.sta);
// log_d("next_state :%d",NaviKit.sys.next_sta);
}
/* USER CODE END StartPowerMonitTask */
/* USER CODE END PowerMonitTask */
}

View File

@ -41,11 +41,12 @@ typedef struct
{
struct{
state_t sta,next_sta; //power state machine
bool power_btn; //power button pressed flag
bool custom_btn;//custom button pressed flag
bool ps_on_allow; //allow power-on
// bool power_btn; //power button pressed flag
// bool custom_btn;//custom button pressed flag
// bool pwr_led;//power led (on switch)
// bool run_led;//run led (on board)
bool dbg_msg_out;//enable/disable debug message output
// bool dbg_msg_out;//enable/disable debug message output
}sys;
struct{
bool mod_sleep;
@ -78,49 +79,9 @@ typedef struct
float cap;
float temp;
}coulomb;
bool main_pwr_good;
}pmb;//power management board
// struct{
// bool u2_vbus_1;
// bool u2_vbus_2;
// bool u2_vbus_3;
// bool u2_vbus_4;
// bool u2_vbus_5;
// bool u2_vbus_6;
// bool u3_vbus_1;
// bool u3_vbus_2;
// bool u3_vbus_3;
// bool u3_vbus_4;
// bool u3_vbus_5;
// bool u3_vbus_6;
// }port;
// struct{
// bool u2_hub_pwr;
// bool u3_hub_pwr;
// bool u3_host_pwr;
// bool u3_gec_pwr;
// bool ge_sw_pwr;
// }soc;
// struct{
// bool fan_valid_1;
// bool fan_valid_2;
// bool fan_valid_3;
// }fan;
// struct{
// bool fan_1;
// bool fan_2;
// bool fan_3;
// }status;
// struct {
// float sensor_1;
// float sensor_2;
// float sensor_3;
// }temp;
}NaviKit_t;
extern NaviKit_t NaviKit;
@ -138,6 +99,7 @@ enum Device_t{USB2_Port1=0x00,USB2_Port2,USB2_Port3,USB2_Port4,USB2_Port5,USB2_P
PMB_PS_ON=0x40}; //Power Management Board
void PWR_Enable(enum Device_t device,bool en,uint16_t delay);
bool PWR_Enable_IRQ(enum Device_t device,bool en,uint16_t delay);
bool PWR_Status(enum Device_t device);
void NaviKit_var_init();

View File

@ -43,6 +43,7 @@ void MX_USART1_UART_Init(void);
/* USER CODE BEGIN Prototypes */
void HAL_UART1_TxHalfCpltCallback(UART_HandleTypeDef *huart);
/* USER CODE END Prototypes */
#ifdef __cplusplus

View File

@ -17,7 +17,6 @@
******************************************************************************
*/
//TODO:拆分该文件中的功能到不同的文件中,按照任务进行模块化拆分
#define LOG_TAG "TH-Default"
/* USER CODE END Header */
@ -80,9 +79,10 @@ const osThreadAttr_t defaultTask_attributes = {
void IdleStateHoldTimerCallback(void *argument);
bool isWakeUpFromReset() { return __HAL_PWR_GET_FLAG(PWR_FLAG_WU);}
bool isWakeUpFromReset();
//__HAL_RCC_GET_FLAG(); //judge reset source flag
//judge reset source flag
uint8_t ResetSourceJudge();
/* USER CODE END FunctionPrototypes */
@ -170,9 +170,9 @@ __weak void PostSleepProcessing(uint32_t *ulExpectedIdleTime)
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
// ElogOutputMutexHandle = osMutexNew(&ElogOutputMutex_attributes);
ElogOutputBinarySemHandle = osSemaphoreNew(1, 1, &ElogOutputBinarySem_attributes);
// ElogUartMutexHandle = osMutexNew(&ElogUartMutex_attributes);
ElogUartBinarySemHandle = osSemaphoreNew(1, 0, &ElogUartBinarySem_attributes);
ElogOutputBinarySemHandle = osSemaphoreNew(1, 0, &ElogOutputBinarySem_attributes);
my_elog_init();
NaviKit_var_init();
/* USER CODE END Init */
@ -210,56 +210,57 @@ void MX_FREERTOS_Init(void) {
/* add threads, ... */
//IWDG--------------------------------------------
#ifdef IWDG_ENABLE
IWDGTaskHandle = osThreadNew(StartIWDGTask, NULL, &IWDGTask_attributes);
IWDGTaskHandle = osThreadNew(IWDGTask, NULL, &IWDGTask_attributes);
#endif
//Power--------------------------------------------
// PowerMonitTaskHandle = osThreadNew(StartPowerMonitTask, NULL, &PowerMonitTask_attributes);
PowerMonitTaskHandle = osThreadNew(PowerMonitTask, NULL, &PowerMonitTask_attributes);
//Button--------------------------------------------
ExtiServiceTaskHandle = osThreadNew(StartExtiServiceTask, NULL, &ExtiServiceTask_attributes);
ExtiServiceTaskHandle = osThreadNew(ExtiServiceTask, NULL, &ExtiServiceTask_attributes);
//LED--------------------------------------------
LedBlinkTaskHandle = osThreadNew(StartLedBlinkTask, NULL, &LedBlinkTask_attributes);
LedBlinkTaskHandle = osThreadNew(LedBlinkTask, NULL, &LedBlinkTask_attributes);
//CDC--------------------------------------------
cdcMonitorTaskHandle = osThreadNew(StartCdcMonitorTask, NULL, &cdcMonitorTask_attributes);
cdcMonitorTaskHandle = osThreadNew(CdcMonitorTask, NULL, &cdcMonitorTask_attributes);
//Coulomb--------------------------------------------
// CoulombReadHandle = osThreadNew(StartCoulombRead, NULL, &CoulombRead_attributes);
// CoulombTaskHandle = osThreadNew(CoulombTask, NULL, &CoulombTask_attributes);
//Elog--------------------------------------------
// ElogInitTaskHandle = osThreadNew(StartElogInitTask, NULL, &ElogInitTask_attributes);
// ElogInitTaskHandle = osThreadNew(ElogInitTask, NULL, &ElogInitTask_attributes);
#ifdef ELOG_BUF_OUTPUT_ENABLE
ElogFlushTaskHandle = osThreadNew(StartElogFlushTask, NULL, &ElogFlushTask_attributes);
ElogFlushTaskHandle = osThreadNew(ElogFlushTask, 1, &ElogFlushTask_attributes);
#endif
//Demo--------------------------------------------
DemoTask1Handle = osThreadNew(StartDemoTask1, NULL, &DemoTask1_attributes);
DemoTask2Handle = osThreadNew(StartDemoTask2, NULL, &DemoTask2_attributes);
// DemoTask1Handle = osThreadNew(DemoTask1, NULL, &DemoTask1_attributes);
// DemoTask2Handle = osThreadNew(DemoTask2, NULL, &DemoTask2_attributes);
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
ExtiEventFlags = osEventFlagsNew(&ExtiEventFlags_attributes);
// ExtiEventFlags = osEventFlagsNew(&ExtiEventFlags_attributes);
// PowerMonitorEventFlags = osEventFlagsNew(&PowerMonitorEventFlags_attributes);
/* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/* USER CODE BEGIN Header_DefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
/* USER CODE END Header_DefaultTask */
void StartDefaultTask(void *argument)
{
/* init code for USB_DEVICE */
@ -268,7 +269,7 @@ void StartDefaultTask(void *argument)
osVersion_t osVersion;
char id_buf[20];
unsigned char id_size=20;
// ResetSourceJudge();
HAL_GPIO_WritePin(USB2_FS_ENUM_CTL_GPIO_Port,USB2_FS_ENUM_CTL_Pin, GPIO_PIN_SET);
if(isWakeUpFromReset()){//judge reset source form "wakeup event"
@ -278,9 +279,6 @@ osVersion_t osVersion;
if(HAL_GPIO_ReadPin(SYS_POWER_BTN_GPIO_Port, SYS_POWER_BTN_Pin)==GPIO_PIN_SET){
if(HAL_GPIO_ReadPin(SYS_CUSTOM_BTN_GPIO_Port, SYS_CUSTOM_BTN_Pin)==GPIO_PIN_RESET)
NaviKit.sys.next_sta = dfu;
else{
NaviKit.sys.power_btn = true;
}
log_i("EC Reset source: [Power Button WakeUP]");
}else{
NaviKit.sys.next_sta = idle;
@ -295,10 +293,9 @@ osVersion_t osVersion;
}else{
NaviKit.sys.next_sta = idle;
}
// TaskBeep(50,1);
TaskBeep(50,1);
}
log_i("----------------------------------------------");
log_i("Copyright (c) Powered by www.autolabor.com.cn");
#ifdef DEBUG
log_i("EC Firmware: %s[DEBUG], build: %s, %s",APP_VERSION,__DATE__ ,__TIME__);
@ -334,30 +331,28 @@ osVersion_t osVersion;
NaviKit.sys.sta = NaviKit.sys.next_sta;
} break;
case run: {
// if(NaviKit.pmb.rails.main_pwr>19){
if(NaviKit.pmb.main_pwr_good){
enter_run_state(100);
NaviKit.sys.sta = NaviKit.sys.next_sta;
// }else{
// NaviKit.sys.next_sta = NaviKit.sys.sta;
// TaskBeep(500,2);
// log_e(,"Main power not exist, retry after plug in it.");
// log_e("Main power is exception:%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
// }
}else{
NaviKit.sys.next_sta = NaviKit.sys.sta;
TaskBeep(500,2);
log_e("Retry after main power checked please.");
}
}break;
case sleep:{
enter_sleep_state(100);
NaviKit.sys.sta = NaviKit.sys.next_sta;
}break;
case dfu:{
// if(NaviKit.pmb.rails.main_pwr>19){
if(NaviKit.pmb.main_pwr_good){
enter_dfu_state(100);
NaviKit.sys.sta = NaviKit.sys.next_sta;
// }else{
// NaviKit.sys.next_sta = NaviKit.sys.sta;
// TaskBeep(500,2);
// log_e(,"Main power not exist, retry after plug in it.");
// log_e("Main power is exception:%dmV",(uint32_t)(NaviKit.pmb.rails.main_pwr*1000));
// }
}else{
NaviKit.sys.next_sta = NaviKit.sys.sta;
TaskBeep(500,2);
log_e("Retry after main power checked please.");
}
}break;
case isp:{
enter_isp_state();
@ -365,7 +360,6 @@ osVersion_t osVersion;
}break;
}
}
if(NaviKit.sys.sta == idle && NaviKit.sys.next_sta == idle){//idle state
// if((NaviKit.pmb.sta.chrg_stat1 && NaviKit.pmb.sta.chrg_stat2)
// || (NaviKit.pmb.sta.chrg_stat1 && !NaviKit.pmb.sta.chrg_stat2)){//Not Charge or float charge
@ -377,7 +371,6 @@ osVersion_t osVersion;
log_i("Idle state hold timer started.");
}
}
}
/* USER CODE END StartDefaultTask */
}
@ -392,7 +385,41 @@ void IdleStateHoldTimerCallback(void *argument){
NaviKit.sys.next_sta = standby;
}
}
bool isWakeUpFromReset(){
return __HAL_PWR_GET_FLAG(PWR_FLAG_WU);
}
//judge reset source flag
uint8_t ResetSourceJudge(){
uint8_t rst_src=0;
rst_src = __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) ? RCC_FLAG_PINRST : 0;
rst_src = __HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) ? RCC_FLAG_PORRST : 0;
rst_src = __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) ? RCC_FLAG_SFTRST : 0;
rst_src = __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ? RCC_FLAG_IWDGRST : 0;
rst_src = __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) ? RCC_FLAG_WWDGRST : 0;
rst_src = __HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) ? RCC_FLAG_LPWRRST : 0;
switch (rst_src){
case RCC_FLAG_PINRST :{
log_i("Reset source RCC_FLAG_PINRST");
}break;
case RCC_FLAG_PORRST :{
log_i("Reset source RCC_FLAG_PORRST");
}break;
case RCC_FLAG_SFTRST :{
log_i("Reset source RCC_FLAG_SFTRST");
}break;
case RCC_FLAG_IWDGRST :{
log_i("Reset source RCC_FLAG_IWDGRST");
}break;
case RCC_FLAG_WWDGRST :{
log_i("Reset source RCC_FLAG_WWDGRST");
}break;
case RCC_FLAG_LPWRRST :{
log_i("Reset source RCC_FLAG_LPWRRST");
}break;
}
return rst_src;
}
/* USER CODE END Application */

View File

@ -52,9 +52,10 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
}
}
//温度变化较大时将触发看门狗,进行校准
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADCEx_Calibration_Start(&hadc1);
// HAL_ADCEx_Calibration_Start(&hadc1);
}
@ -72,8 +73,7 @@ void enter_isp_state()
}
//timeout:the time of wait
void enter_idle_state(uint16_t delay)
{
void enter_idle_state(uint16_t delay){
log_i("Enter to idle state.");
TaskBeep(50,1);
@ -108,8 +108,6 @@ void enter_idle_state(uint16_t delay)
PWR_Enable(PMB_PS_ON ,false , 0);
}
void enter_run_state(uint16_t delay)
{
log_i("Enter to run state");
@ -178,10 +176,24 @@ void som_reboot(uint16_t delay){
PWR_Enable(SOM_RESET,false,0);
}
//device power enable or disable
//delay: After executing the operation delay (ms)
void PWR_Enable(enum Device_t device,bool en,uint16_t delay){
bool result = false;
result = PWR_Enable_IRQ(device,en,0);
if(result){
log_v("Device 0x%X has been %s",device,en ? "enabled" : "disabled");
osDelay(delay);
}else{
log_e("Power_Enable device parameter is invalid!");
}
}
//PWR_Enable_IRQfor interrupt safe reversion
//device power enable or disable
//device: Specified device
//en: enable or disable
//delay: After executing the operation delay (ms)
//return: true-success;false-parameter valid
bool PWR_Enable_IRQ(enum Device_t device,bool en,uint16_t delay){
switch (device){
case USB2_Port1: {HAL_GPIO_WritePin(USB2_VBUS_CTL_1_GPIO_Port, USB2_VBUS_CTL_1_Pin, en); }break;
case USB2_Port2: {HAL_GPIO_WritePin(USB2_VBUS_CTL_2_GPIO_Port, USB2_VBUS_CTL_2_Pin, en); }break;
@ -210,10 +222,10 @@ void PWR_Enable(enum Device_t device,bool en,uint16_t delay){
case SOM_RESET: {HAL_GPIO_WritePin(SOM_SYS_RESET_GPIO_Port, SOM_SYS_RESET_Pin, !en); }break;
case SOM_SLEEP: {HAL_GPIO_WritePin(SOM_SLEEP_WAKE_GPIO_Port, SOM_SLEEP_WAKE_Pin, !en); }break;
case PMB_PS_ON: {HAL_GPIO_WritePin(PMB_PS_ON_GPIO_Port, PMB_PS_ON_Pin, en); }break;
default: {log_e("PWR_Enable device parameter is invalid."); }break;
default: {return false; }break;
}
log_v("Device 0x%X has been %s",device,en ? "enabled" : "disabled");
osDelay(delay);
return true;
}
//check device on board power status

View File

@ -269,6 +269,14 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
}
/* USER CODE BEGIN 1 */
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance == USART1){
HAL_UART1_TxHalfCpltCallback(huart);
}
}
__weak void HAL_UART1_TxHalfCpltCallback(UART_HandleTypeDef *huart){
UNUSED(huart);
}
//printf redirect
#ifdef __GNUC__

@ -1 +1 @@
Subproject commit a813ff549eeec5fa41af5604770092e62ab504fc
Subproject commit 69ca6cd42c7370db783c8df9943fc44bc3761574

View File

@ -47,6 +47,7 @@
* 串口输出口波特率为56000bps
* 日志输出支持`CSI`颜色模式
* 由于`elog`中使用了操作系统的信号量对临界资源(日志缓冲区)进行读写保护,所以只能在任务中调用日志接口,请勿在中断中调用日志接口。
# 勘误
硬件的v1.0以前版本中SYS_RESET脚和MOD_SLEEP到单片机的实际连接与网络标号是相反的问题发生在TXB0108PWR芯片附近故代码中在GPIO处进行了相反的设置。