Quartus II 10.0版本以上可以用fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK)将标准输入stdin设为非阻塞模式,然后用getchar,read,scanf等函数接收串口数据。
笔者用的版本是Quartus II 13.0sp1 (64-bit)。
下面的程序实现了每隔1秒钟打印一次hello world和系统毫秒计数器的值,收到串口字符时立即打印出来的功能。
用read函数接收1字节字符,函数不阻塞,如果没有字符就会返回-1,有字符则返回1。
#include#include #include #include #include int main() { alt_u32 now, ticks = 0; char ch; int i = 0; int ret; printf("Hello from Nios II!rn"); printf("tick_rate=%lurn", alt_ticks_per_second()); usleep(100000); printf("ticks=%lurn", alt_nticks()); fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); while (1) { now = alt_nticks(); if (now - ticks > 1000) { ticks = now; printf("Hello World! i=%d, ticks=%lurn", i, now); i++; } ret = read(STDIN_FILENO, &ch, 1); if (ret == 1) { if (isprint(ch)) printf("UART0: %crn", ch); else printf("UART0: 0x%02xrn", ch); } } }
Qsys里面添加了Interval Timer IP核,定时时间为1ms,无起停控制位,固定定时周期。
在BSP Editor里面的Settings -> Common -> hal -> sys_clk_timer选中这个定时器,就可以用alt_nticks()函数了。这个函数就类似于STM32单片机HAL库里面的HAL_GetTick()函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)