void uart_send_byte(char ch) { while((GetWord16(UART_LSR_REG)&0x20)==0); // read status reg to check if THR is empty SetWord16(UART_RBR_THR_DLL_REG,(0xFF&ch)); // write to THR register }
void printf_string(char * str) { while(*str!='\0') { // while not reach the last string character uart_send_byte(*str); // send next string character str++; } }
建议你看一下鼠标的demo工程。
void app_kbd_enable_wakeup_irq(void)
{
//P10(MOT), P11(BL), P07(BM), P01(BR)
const uint32_t sel_pins = ((1<<7) | (1<<1)) | ( ((1<<1) | (1<<0)) << 8); //支持几路GPIO做唤醒
const uint32_t pol_pins = ((!middle_button_pressed<<7) | (!right_button_pressed<<1)) | ( ((!left_button_pressed<<1) | (1<<0)) << 8);
wkupct_register_callback(wakeup_handler); //TODO: No need to be called always, only once during appl. initialization.
wkupct_enable_irq (sel_pins pol_pins,WAKEUP_EVENTS_QUOTA, WAKEUP_KEY_DEBOUNCING_TIME_IN_MS);
}
我这样试了 的. 可是不行哦
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
| WKUPCT_PIN_SELECT(GPIO_DISMANTLE_CHECK2_PORT, GPIO_DISMANTLE_CHECK2_PIN)
, // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_HIGH)
| WKUPCT_PIN_POLARITY(GPIO_DISMANTLE_CHECK2_PORT, GPIO_DISMANTLE_CHECK2_PIN, WKUPCT_PIN_POLARITY_HIGH)
,// polarity high
1, // 1 event
0x30); // debouncing time = 0
}
鼠标的demo工程不在sdk5.0.3 和 5.0.4中的啊
鼠标是单独的project,可以在reference design里面找。你现在不行是按单个键就换不醒吗?
如果单独设置一个按键, 那个按键是没问题的, 可是或上其他一个按键, 却导致2个按键都没有wakeup系统的功能的了!
你们那边有试过的吗? 为什么我这边会不行的呢? 我直接使用的是5.0.3 的prox_reporter 工程里的 user_proxr.c 他原来就一个按键. 我看他按键的或结构, 所以就添加了一个按键. 添加上去后, 原来那个按键都不能唤醒系统了. 我的系统睡眠模式是ARCH_EXT_SLEEP_ON.
另外 我看他在 user_periph_setup.h 里面定义了WKUP_ENABLED的.
有人回应一下的吗? 在线等
我这里可以的,添加了一个button2,然后在app_button_press_cb里打印信息
void app_button_enable(void)
{
app_easy_wakeup_set(app_wakeup_cb);
wkupct_register_callback(app_button_press_cb);
#if USE_PUSH_BUTTON
如果(GPIO_GetPinStatus (GPIO_BUTTON_PORT GPIO_BUTTON_PIN ))
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN) | WKUPCT_PIN_SELECT(GPIO_BUTTON2_PORT, GPIO_BUTTON2_PIN) , // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW) | WKUPCT_PIN_POLARITY(GPIO_BUTTON2_PORT, GPIO_BUTTON2_PIN, WKUPCT_PIN_POLARITY_LOW), // polarity low
1, // 1 event
0); // debouncing time = 0
#endif
}
既然你可以打印信息, 证明你是在非深度睡眠状态下. 请尝试在ARCH_EXT_SLEEP_ON 状态下测试确认一下. 谢谢.
而且我发现在ARCH_EXT_SLEEP_ON唤醒后, 有点其他奇怪现象. 这个暂不论吧. 后面再请教一下.
就是在 const static sleep_state_t app_default_sleep_mode=ARCH_EXT_SLEEP_ON;
打印我是放在外设电起来后。
void app_button_press_cb(void)
{
.................
if(GetBits16(SYS_STAT_REG, PER_IS_DOWN))
periph_init();
printf_string("hello\n"); ///
}
void uart_send_byte(char ch)
{
while((GetWord16(UART_LSR_REG)&0x20)==0); // read status reg to check if THR is empty
SetWord16(UART_RBR_THR_DLL_REG,(0xFF&ch)); // write to THR register
}
void printf_string(char * str)
{
while(*str!='\0')
{ // while not reach the last string character
uart_send_byte(*str); // send next string character
str++;
}
}
谢谢. 我明天把你代码应用到我的系统上看看行不行.
因为我观察唤醒, 是我的oled屏被点亮的. 或许是点亮失败. 因为我发现单独一个按键时, 正常应该屏唤醒3s后再灭屏, 但是实际测试时, 发现是屏亮一下后, 马上又灭了.
明天上班再测测看看咯.
另外我想问一下, 你们那边是不是把精力更多地放在sdk5.0.4上的? 因为我看8月8号发布了sdk5.0.4. 我现在用的是5.0.3的.
你好.我按照你说的,
首先, 在user_perph_setup.c里的set_pad_functions()函数里初始化串口:
GPIO_ConfigurePin(UART_GPIO_PORT, UART_TX_PIN, OUTPUT, PID_UART1_TX, false);
GPIO_ConfigurePin(UART_GPIO_PORT, UART_RX_PIN, INPUT, PID_UART1_RX, false);
SetBits16(CLK_PER_REG, UART1_ENABLE, 1); // enable clock for UART 1
uart_init(UART_BAUDRATE, UART_DATALENGTH);
然后在app_button_press_cb添加打印. 但是我是在arch_main.c里屏蔽掉
//arch_turn_peripherals_off(sleep_mode);
否则打印不出来.
另外发现有时打印出乱码.
【2016-08-19 11:56:56:454】?
【2016-08-19 11:56:56:712】?!!!Q蓂 a)?>醕lose
打印乱码的时候, 就是我程序控制不正常的时候.
我使用了一个timer来定时自动关闭屏幕. 正常的时候是亮屏3s后, 自动关闭. 但是当不正常时, 他亮屏后, 就马上灭屏. 我从打印日志中看到, 这个是他调用了定时的handler.
【2016-08-19 14:15:23:071】鰴?憽Q
【2016-08-19 14:15:23:329】?!!!Q蓂 a)?︷close
【2016-08-19 14:15:23:538】hand
但是他是突然调用的. 不是正常按照定时之后的
是不是不能在app_button_press_cb() 里调用用时比较多的函数的.
我这边把他弄到app_wakeup_cb()函数里再测试看看.
SDK5.0.4 刚发布,所以也在熟悉阶段
打印乱码确实会出现,因为刚在唤醒状态,16M还不稳定。
但是不会出现你说的这种情况。
“
然后在app_button_press_cb添加打印. 但是我是在arch_main.c里屏蔽掉
//arch_turn_peripherals_off(sleep_mode);
否则打印不出来.
”