OSIF添加
默认在Reference_Components下面有, 没有的话也可以从Componets Library里面拉过来:
然后可以直接使用 OSIF_TimeDelay(100);
延时100ms.
printf支持
串口的printf支持可以参考我之前的博客 :
或者使用不限特定单片机和IDE, 嵌入式系统更为通用的自己组printf:
- github printf, 只需要自己补充
_putchar
函数即可
可以看看这一篇:
如果想要在中断中使用, 不能使用blocking的方式, 改为LPUART_DRV_SendDataPolling
:
void _putchar(char character)
{
LPUART_DRV_SendDataPolling(INST_LPUART2, (uint8_t *)&character, 1);
}
进入本篇重点
typedef struct
{
uint8_t s1;
} TIMER_FLAG;
TIMER_FLAG timer_flags;
void lpit_callback(void)
{ //10ms
static uint64_t cnt = 0;
LPIT_DRV_ClearInterruptFlagTimerChannels(INST_LPIT1, (1 << LPIT_CHANNEL));
if(cnt % 100 == 0) {
timer_flags.s1 = 1;
}
++cnt;
}
int main(void)
{
static uint64_t main_cnt = 0;
...
while(1)
{
//OSIF_TimeDelay(100);
if(timer_flags.s1 == 1) {
timer_flags.s1 = 0;
printf("main_cnt = %lld\n", ++main_cnt);
}
}
}
然后串口直接卡死, 发不出来数据, while中把OSIF_TimeDelay(100);
的注释打开, 是可以发出来的.
最后找了半天, 原来是这个标志位应该声明为volatile uint8_t s1;
, 其实中断和其他函数中来回倒的标志位基本都要声明成volatile
, 不然赋值来不及生效, 像上面代码中, timer_flags.s1 = 0;
并没有来得及生效, 导致短时间发了大量printf, 串口一下子涌进来N多数据, 直接就卡死了.