Other Parts Discussed in Thread: SYSCONFIG, CC2340R5, LP-XDS110ET, LP-EM-CC2340R5, ENERGYTRACE
器件型号: CC2340R5
Thread 中讨论的其他部件: Sysconfig、、 LP-XDS110ET、 ENERGYTRACE
我目前正在处理一个使用 CC2340R52N0RGE 芯片的工程、在配置低功耗模式时遇到了一些问题:
1、SysConfig: FreeRTOS、 250kbps O-QPSK、PowerCC23X0_standbyPolicy、启用空闲挂钩功能
2、在 main_freertos.c 中、定义的低功耗标志和低功耗唤醒信标:
//-- =0: normal operation, =1: in low-power state
volatile uint8_t g_low_power_state = 0;
//-- Low-power wake-up semaphore
SemaphoreHandle_t g_wakeup_sem = NULL;
//-- Release semaphore
xSemaphoreGive(g_wakeup_sem);
3、串行端口收到低功耗命令后:
g_low_power_state = 1g_low_power_state == 1时、它不会释放信号。 xResult = xSemaphoreTake(g_wakeup_sem, portMAX_DELAY);4、通过按钮 (DIO6) 唤醒后、释放信标并且程序恢复运行。



//========= main_freertos.c ===========
// lowpower indicate: =0, runing; =1, sleep
volatile uint8_t g_low_power_state = 0;
// wakeup semaphore
SemaphoreHandle_t g_wakeup_sem = NULL;
int main(){
// create wakeup semaphore
g_wakeup_sem = xSemaphoreCreateBinary();
// lowpower indicate: =0, runing; =1, sleep
g_low_power_state = 0;
// creat 3 threads:
/*.......
uart_thread
rf_thread
data_thread
.................*/
vTaskStartScheduler();
return 0;
}
//========= uart_thread.c ===========
void uart_thread(void *pvParameters){
// -- some init functions
BaseType_t xResult;
while(1){
xResult = xSemaphoreTake(g_wakeup_sem, portMAX_DELAY);
if(xResult == pdTRUE && g_low_power_state == 0)
{
// do something
if( g_low_power_state == 0){
xSemaphoreGive(g_wakeup_sem);
}
vTaskDelay(pdMS_TO_TICKS(5));
}
}
}
//========= rf_thread.c ===========
void rf_thread(void *pvParameters){
// -- some init functions
BaseType_t xResult;
while(1){
xResult = xSemaphoreTake(g_wakeup_sem, portMAX_DELAY);
if(xResult == pdTRUE && g_low_power_state == 0)
{
// do something
if( g_low_power_state == 0){
xSemaphoreGive(g_wakeup_sem);
}
vTaskDelay(pdMS_TO_TICKS(5));
}
}
}
//========= data_thread.c ===========
void data_thread(void *pvParameters){
// -- some init functions
BaseType_t xResult;
while(1){
xResult = xSemaphoreTake(g_wakeup_sem, portMAX_DELAY);
if(xResult == pdTRUE && g_low_power_state == 0)
{
// do something
if( g_low_power_state == 0){
xSemaphoreGive(g_wakeup_sem);
}
vTaskDelay(pdMS_TO_TICKS(5));
}
}
}
//========= FreeRTOSConfig.h ===========
/* Idle hook function enabled or disabled */
#define configUSE_IDLE_HOOK 1
//========= ti_freertos_config.c ===========
/* Idle hook functions */
extern void dtk_power_idle(void);
void vApplicationIdleHook(void)
{
dtk_power_idle();
}
//========= data_thread.c ===========
/* low power function */
void dtk_power_idle(void)
{
if(g_low_power_state ==1)
{
//board_led2_on();
Power_idleFunc();
//taskYIELD();
}
}
/* received lowPower command */
void lowPowerInsReceived(void)
{
g_low_power_state =1;
}
/* press DIO6, out low power status*/
static void buttonCallback(uint_least8_t index)
{
BaseType_t xHPW = pdFALSE;
TickType_t now = xTaskGetTickCountFromISR();
/* Debounce: ignore edges within 40ms */
if ((now - sLastEdgeTick) < pdMS_TO_TICKS(40)) {
return;
}
sLastEdgeTick = now;
if( g_low_power_state == 1)
{
g_low_power_state =0;
(void)xSemaphoreGiveFromISR(g_wakeup_sem, &xHPW);
//-- restart 1MS timer --- //
dtk1msTimerStart();
}
/* Active-low button with pull-up: 1=release, 0=press */
uint32_t level = GPIO_read(CONFIG_GPIO_BUTTON_0_INPUT);
if (level == 1) {
/* Release detected: immediate single event */
(void)xSemaphoreGiveFromISR(gBtnSingleSem, &xHPW);
/* Start window on first click */
if (sBtnClickCount == 0) {
(void)xTimerChangePeriodFromISR(sBtnWindowTimer, pdMS_TO_TICKS(1200), &xHPW);
(void)xTimerStartFromISR(sBtnWindowTimer, &xHPW);
}
sBtnClickCount++;
/* Triple event once within window when reaching 3 or more */
if (sBtnClickCount >= 3 && !sTripleEmitted) {
(void)xSemaphoreGiveFromISR(gBtnTripleSem, &xHPW);
sTripleEmitted = 1;
}
if (xHPW == pdTRUE) {
portYIELD_FROM_ISR(xHPW);
}
}
}
最好的考虑。
宜化




