打印
[STM8]

stm8串口优先级问题,求解!

[复制链接]
2384|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coderdd|  楼主 | 2017-2-7 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm8s串口接收数据老是丢失字节,比如收一串字符,接收的数据偶尔会丢失一个字节。现在可以确定是串口溢出了,就是上一个数据还没有处理完成后一个数据就来了,因此只能舍弃。目前有一个1ms的定时器1和一个大约500ms的定时器2。目前猜测是定时器1抢占了串口中断,因为定时器1写了很多内容。现在想用中断优先级解决,想把串口接收的优先级调到最高,但是用库函数总是不成功!!
ITC_SetSoftwarePriority(ITC_IRQ_UART1_RX, ITC_PRIORITYLEVEL_3);
上面这段代码会让程序进入异常状态:
void ITC_SetSoftwarePriority(ITC_Irq_TypeDef IrqNum, ITC_PriorityLevel_TypeDef PriorityValue)//库函数
{

    uint8_t Mask = 0;
    uint8_t NewPriority = 0;

    /* Check function parameters */
    assert_param(IS_ITC_IRQ_OK((uint8_t)IrqNum));
    assert_param(IS_ITC_PRIORITY_OK(PriorityValue));

    /* Check if interrupts are disabled */
    assert_param(IS_ITC_INTERRUPTS_DISABLED);

    /* Define the mask corresponding to the bits position in the SPR register */
    /* The mask is reversed in order to clear the 2 bits after more easily */
    Mask = (uint8_t)(~(uint8_t)(0x03U << (((uint8_t)IrqNum % 4U) * 2U)));

    /* Define the new priority to write */
    NewPriority = (uint8_t)((uint8_t)(PriorityValue) << (((uint8_t)IrqNum % 4U) * 2U));

    switch (IrqNum)
    {...}
}
调试发现是进入了这句话: assert_param(IS_ITC_INTERRUPTS_DISABLED);
可以理解为判断此中断是否disable么?
要怎么写才能正常调用啊,如果调用成功,那么串口优先处理完是否会自动跳到timer1继续处理函数??

沙发
hufengweixx| | 2017-2-8 08:49 | 只看该作者
最后一个问题,应该是会正常跳转回tim1的

使用特权

评论回复
板凳
wuwei86| | 2017-2-8 10:06 | 只看该作者
stm8s不能更改中断优先级,为什么在定时器中断中做那么多事情,可以在定时器中断中置标志,在主循环中判断标志去处理真正需要处理的事情,中断中尽量少做事

使用特权

评论回复
地板
xmshao| | 2017-2-8 11:08 | 只看该作者
它这里是检查是否关闭了中断。
关闭后进行优先级的修改,然后再打开。

不是有意且需要,你中断里尽量少搞点事。

使用特权

评论回复
5
皈依| | 2017-2-8 16:17 | 只看该作者
首先确定中断优先级是否起作用 如果没有 先解决优先级问题
如果起作用了就要考虑定时器中断的问题了,定时器中断做得事情多了 定时器本身就不准了

使用特权

评论回复
6
coderdd|  楼主 | 2017-2-8 16:18 | 只看该作者
wuwei86 发表于 2017-2-8 10:06
stm8s不能更改中断优先级,为什么在定时器中断中做那么多事情,可以在定时器中断中置标志,在主循环中判断 ...

不能改中断优先级啊??好吧,好坑

使用特权

评论回复
7
coderdd|  楼主 | 2017-2-8 16:20 | 只看该作者
xmshao 发表于 2017-2-8 11:08
它这里是检查是否关闭了中断。
关闭后进行优先级的修改,然后再打开。

已经搞的很少了,但是串口接收一大堆gps信息时,还是会漏字节。除了中断,我怀疑不到哪儿了

使用特权

评论回复
8
coderdd|  楼主 | 2017-2-8 16:50 | 只看该作者
皈依 发表于 2017-2-8 16:17
首先确定中断优先级是否起作用 如果没有 先解决优先级问题
如果起作用了就要考虑定时器中断的问题了,定时 ...

了解。定时器确实要少操作,但是stm8难道没有中断优先级么

使用特权

评论回复
9
icecut| | 2017-2-8 19:30 | 只看该作者
1.定时器肯定要减少代码量.
2.串口丢字节很正常.可以看 21ic 公开课 stm32从入门到精通

使用特权

评论回复
10
皈依| | 2017-2-8 20:30 | 只看该作者
coderdd 发表于 2017-2-8 16:50
了解。定时器确实要少操作,但是stm8难道没有中断优先级么

有中断优先级 可以设置 不过8s的优先级是数字越大 优先级越高

使用特权

评论回复
11
hufengweixx| | 2017-2-10 11:05 | 只看该作者
应该在中断文件中可以修改优先级参数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

384

帖子

11

粉丝