在线时间132 小时
UID3065001
注册时间2014-10-4
NXP金币0
TA的每日心情 | 开心 2018-8-30 16:02 |
---|
签到天数: 5 天 连续签到: 1 天 [LV.2]偶尔看看I
金牌会员
 
- 积分
- 1851
- 最后登录
- 2019-11-19
|
本帖最后由 kingsings 于 2015-9-14 23:53 编辑
今天做K60UART FIFO的实验。UART初始化是使能FIFO的,RX的FIFO深度为8(硬件决定),阈值采用默认的1。
写了两个函数:
- void uart_getchar(UARTn_e uartn, char* ch)
- {
- while(!(UART_S1_REG(UARTN[uartn]) & UART_S1_RDRF_MASK));
- *ch = UART_D_REG(UARTN[uartn]);
- }
- char uart_query(UARTn_e uartn)
- {
- if(UART_RCFIFO_REG(UARTN[uartn]))
- return 1;
- else
- return 0;
- }
复制代码
然后在主函数中采用两种轮询方式获取字符。第一种如下:
- while(1)
- {
- if(uart_query(UART1e) != 0)
- {
- uart_getchar(UART1e,&charq);
- uart_putchar(UART1e,charq);
-
- }
- };
复制代码
如果一直运行,那么上位机发送的字符可以立马被接收到并被返回,改变发送的字符后也会立马返回改变的字符。但如果是采用调试来一步步运行,断点设在 uart_getchar()函数的while循环后一句,只要停止断点处后再一直运行,那么发送的字符将无法立马被返回,改变字符后也无法立即改变。具体的就是发个a后,等待返回a,然后改变发送字符为c,这时仍然返回a,要发好几个c后才返回c,在这之前一直返回a。
第二种如下:
- while(1)
- {
-
- uart_getchar(UART1e,&charq);
- uart_putchar(UART1e,charq);
-
-
- };
复制代码
直接采用uart_getchar()函数,不使用uart_query()。发现现象是差不多的,即一直运行不会出错,只要在 uart_getchar()函数的while循环那暂停一下(不使用断点,直接暂停),就会出现返回延迟的现象。
不知道这是UART模块的BUG还是调试器的BUG。反正就是BUG。
|
|