打印
[STM8]

TIM4与串口接收中断冲突

[复制链接]
2425|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tanjping|  楼主 | 2016-5-12 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下代码  TIM4正常中断/串口发送正常/  串口接收中断进不去
因为TIM1/2都用做PWM了,所以只能用TIM4来做定时


TIM4初始化
/***************************************************************************
                    定时器4
****************************************************************************/
void TIM4_initialzation(void)
{

         //16M时钟 设定计数时钟128的分频,计数周期为1ms,//初始化计数器值,设定自动重载寄存器值   
  TIM4_TimeBaseInit(TIM4_PRESCALER_128,125 );
  TIM4_SetCounter(0x0000);//将计数器的初始值设置为0
  TIM4_ARRPreloadConfig(ENABLE);
  TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE);
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//允许计数溢出中断   
  TIM4_Cmd(ENABLE); //启用定时器
}

void uart_initialzation(void)
{
  //使能串口时钟
//  GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);   //
//  GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT);
  
  UART1_DeInit();
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);
   
  UART1_Init((uint32_t)115200,             //波特率设定主时钟为HSI-16M
             UART1_WORDLENGTH_8D,          //8位数据位
             UART1_STOPBITS_1,             //1位停止位
             UART1_PARITY_NO,              //无校验
             UART1_SYNCMODE_CLOCK_DISABLE, //同步模式禁止
             UART1_MODE_TXRX_ENABLE);      //启动收发
      
  UART1_ITConfig(UART1_IT_RXNE, ENABLE);//允许接收中断 UART1_IT_RXNE_OR
  UART1_Cmd(ENABLE);                     //使能UART
}



int main( void )
{
  CLK_DeInit(); //寄存器复位
  CLK_HSICmd(ENABLE); //内部高速时钟使能  
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //分频
  GPIO_initialzation();
  uart_initialzation();
  PWM1_initialzation();
  PWM2_initialzation();
  TIM4_initialzation();
//  ITC_SetSoftwarePriority(ITC_IRQ_UART1_RX,ITC_PRIORITYLEVEL_2); //设为2优先级别
//  ITC_SetSoftwarePriority(ITC_IRQ_TIM4_OVF,ITC_PRIORITYLEVEL_1);//设为最低级别
  enableInterrupts();//* 开启总中断 */  
  

  while(1)
  {
      PLED_flash(499);
      relay_control();
      CCT_calculate();
      send_information();
      if(Flag_rec)
      {
        Flag_rec = 0;
        UART_send_array(recived_data,8);
      }     
  }
  return 0;
}



只需要把  TIM4_initialzation();屏蔽,串口马上正常中断接收,
打开TIM4串口就接收不了,其它功能都正常。
那们大吓帮看看

scr.zip

13.88 KB

源代码

沙发
xmshao| | 2016-5-12 22:31 | 只看该作者
调整二者的软件优先级都没有用?

使用特权

评论回复
板凳
tanjping|  楼主 | 2016-5-13 07:45 | 只看该作者
xmshao 发表于 2016-5-12 22:31
调整二者的软件优先级都没有用?

调整过优先级,也是没用的
  TIM4_initialzation();
//  ITC_SetSoftwarePriority(ITC_IRQ_UART1_RX,ITC_PRIORITYLEVEL_2); //设为2优先级别
//  ITC_SetSoftwarePriority(ITC_IRQ_TIM4_OVF,ITC_PRIORITYLEVEL_1);//设为最低级别
  enableInterrupts();//* 开启总中断 */  
再说不调整他也会按硬件的优先级进行呀。
只有TIM4和串口接收两个中断

使用特权

评论回复
地板
tanjping|  楼主 | 2016-5-13 10:49 | 只看该作者
使用TIM1做1MS定时中断就不会响UART1的接收中断
但是TIM1/2我都用做PWM了

使用特权

评论回复
5
xmshao| | 2016-5-16 16:00 | 只看该作者
tanjping 发表于 2016-5-13 07:45
调整过优先级,也是没用的
  TIM4_initialzation();
//  ITC_SetSoftwarePriority(ITC_IRQ_UART1_RX,ITC ...

TIM4跟TIM1有点差异,是不是哪里配置有点问题;

另外TIM4中断跟UART接收有怎样的关系呢?

使用特权

评论回复
6
tanjping|  楼主 | 2016-5-16 16:11 | 只看该作者
xmshao 发表于 2016-5-16 16:00
TIM4跟TIM1有点差异,是不是哪里配置有点问题;

另外TIM4中断跟UART接收有怎样的关系呢?  ...

这也正是我想不通的呀,两个压根都没有共用的东西,但是事实就这样,把TIM4初始化屏蔽后马上就可以进入接收中断,郁闷几天了TIM4中断正常

使用特权

评论回复
7
cnb12345| | 2016-5-16 17:13 | 只看该作者
学习

使用特权

评论回复
8
tanjping|  楼主 | 2016-5-18 07:47 | 只看该作者
努力寻找问题根源,希望有大虾出现

使用特权

评论回复
9
tanjping|  楼主 | 2016-5-21 10:20 | 只看该作者
找到原因了,原来是ADC采样的原因,导致了串口中断进不去。

使用特权

评论回复
10
9990| | 2016-5-21 12:05 | 只看该作者
tanjping 发表于 2016-5-21 10:20
找到原因了,原来是ADC采样的原因,导致了串口中断进不去。

能具体说一下原因和解决方法吗

使用特权

评论回复
11
tanjping|  楼主 | 2016-5-21 18:10 | 只看该作者
把ADC初始化函数中和施密特触发器禁止了就进不了中断了,使能就OK拉  
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,//ADC1_CONVERSIONMODE_SINGLE,//
            ADC_Channel,
            ADC1_PRESSEL_FCPU_D2,
            ADC1_EXTTRIG_TIM, DISABLE,
            ADC1_ALIGN_RIGHT,
            ADC1_SCHMITTTRIG_ALL,ENABLE);   // DISABLE);

使用特权

评论回复
12
xmshao| | 2016-5-22 10:43 | 只看该作者
本帖最后由 xmshao 于 2016-5-22 10:48 编辑

尤其此处TIM4只是做个时基,最大可能的冲突就是中断优先级。如果不是这方面原因就是别的方面了。

现在楼主说ADC配置影响到了UART接收,那极可能是楼主的设计中将UART-Rx脚与某AD脚复用了。如果这样的话,如果关闭了施密特,
意味着输入恒定为0,此时UART-RX脚的数据就进不来。

不过,作为AD应用,是要求该施密特关闭的。关于这点,不论STM8还是STM32都要注意。

这里有个相关贴子,有些分析。事情差不多。可以看看。http://mp.weixin.qq.com/s?__biz= ... 192865f95b6d0321#rd


使用特权

评论回复
13
tanjping|  楼主 | 2016-5-22 10:47 | 只看该作者
在这里我转一下jack19870714的微博 说得详细
m.blog.csdn.net/article/details?id=50365269[/url]
我当时是用定时器去操作ADC转换,所以关了定时器就没事了,不进行AD操作就没有问题,
给我搞了个错觉。

使用特权

评论回复
14
tanjping|  楼主 | 2016-5-22 10:48 | 只看该作者
xmshao 发表于 2016-5-22 10:43
尤其此处TIM4只是做个时基,最大可能的冲突就是中断优先级。如果不是这方面原因就是别的方面了。

现在楼主 ...

谢谢了,

使用特权

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

本版积分规则

1

主题

27

帖子

1

粉丝