问题描述:
1.在工程DA1458x_DSPS_v_5.150.2中,每隔1s通过uart2打印数据0-21,结果死机,将打印数据改为0-20,可以循环打印。
请问是什么地方干扰了uart2的操作?还是需要特殊设置某些参数?
p.s active_1s()函数在官方demo外设工程uart2_async中是可以循环打印的。
void active_1s(void)
{
uint8_t i;
for(i = 0;i < 21;i ++) {
write_txbuf(i);
}
while(1) {
do {
// schedule all pending events
schedule_while_ble_on();
}
while ((app_asynch_proc())); //grant control to the application, try to go to power down
... ...
active_1s();
... ...
}
Keywords:
Device:
不知道你的write_txbuf函数的内容,我这里用了这个函数来替代你的write_txbuf。
并且把
active_1s(); //放在USE_WDOG这个位置之前
if (USE_WDOG)
wdg_reload(WATCHDOG_DEFAULT_PERIOD);
我这里打印是好的。
void uart_send_byte(char ch)
{
while((GetWord16(UART2_LSR_REG)&0x20)==0); // read status reg to check if THR is empty
SetWord16(UART2_RBR_THR_DLL_REG,(0xFF&ch)); // write to THR register
}
write_txbuf函数是参考官方demo的外设历程来的。我修改成你函数试试
void write_txbuf(uint8_t txbuf)
{
// Write the character to UART2 and then wait synchronously for completion.
tx_in_progress = 1;
uart2_write(&txbuf, 1, uart_write_cb);
while (tx_in_progress)
;
}
回调函数将变量清零。
uart_write_cb()
{
tx_in_progress = 0;
}
我按照你提供的发数据函数,是可以运行的,请教下,我是用的官方demo历程的方式,引起死机的原因是什么?
因为原先的发送函数会调用到uart2_thr_empty_isr。在里面会调用uart2_txfifo_full_getf来检查fifo是否满。如果满了,直接就不放进fifo了。
也就调用不到callback函数将标记清0。所以如果fifo里数据移走的速度小于你放数的速度,就会一直死循环了。