• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

求路过的高手帮忙指点下STM8S003单片机串口接受DMX512信号中断函数问题

弟这几天一直在研究STM8S003F单片机接受DMX512信号串口中断程序,自己写了段调试下发现一直进不去,麻烦有明白的帮忙指点下,小弟不胜感激,谢谢!本人邮箱 770510477@qq.com,是一个单片机爱好者,但是自身基础太差,往见效,谢谢!

以下为我的部分代码:

(主函数)

#include "clk_conf.h"
#include "Tim1.h"
#include "GPIO.h"
#include "Delay.h"

//static unsigned char break1=0;
//unsigned char RxData[512]; //接收数据缓存区
extern FlagStatus DMX_display;
extern unsigned char pwm[3]; //pwm接收数据缓存区

int main( void )
{
  //u8 i;  
  Clk_conf();
  Init_UART1();
  Tim1_PWM_conf(255,TIM1_DIV1); //16M   f=16/256
  //DMX_display=0;
  Delay_MS();  
  EnableInterrupt;
 while(1)
  {
    if(DMX_display)
    { 
    To_PWM_output(pwm[0],pwm[1],pwm[2]);
    DMX_display=0 ;
    }
   else {To_PWM_output(0,0,255);}//无信号
  }

}  

(uart函数)
#include "iostm8s003f3.h"
#include "Tim1.h"
unsigned char pwm[3];//接收数据缓存区 
FlagStatus  DMX_display;

/*************************************  
* 函数名称:Init_UART1  
* 函数功能:UART1 初始化
* 入口参数:无  
* 出口参数:无  
****************************************/
void Init_UART1(void)
{     
 // CLK_PCKENR1 |= 0X04;  //使能USART1时钟 
  
  UART1_CR1=0x10; //9位数据+1stop
  UART1_CR2=0x00;
  UART1_CR3=0x00;//1 stop
  // 必须先写BRR2
  // 例如对于波特率位250000时,分频系数=16000000/250000=64
  // 对应的十六进制数为0040,BBR1=04,BBR2=00
  
  UART1_BRR2=0x00;
  UART1_BRR1=0x04;
  
  UART1_CR2=0x2c;//允许接收,发送,开接收中断
}


/*************************************  
* 函数名称:UART1_RX_RXNE 
* 函数功能:UART1 接收中断函数
* 入口参数:无  
* 出口参数:无  
****************************************/

#pragma vector=UART1_R_RXNE_vector
__interrupt void UART1_RX_RXNE(void)
{
  unsigned char RxBuf;        //临时接收
  unsigned char RxData[4]; //临时接收数据缓存区                                 
  unsigned int address_counter=0;      //串口接收数据长度                                        
  FlagStatus  start_code=0;    //判断start_code
  FlagStatus  break1=0;  //判断break 
  if(UART1_SR_RXNE)
 {
    UART1_SR_RXNE=0;   //清RXNE
     if(UART1_CR1_R8==0)   //判断第九位
       {
        break1=1;
        start_code=0;
        address_counter=0;
        DMX_display=0;
        }
      if(break1)
    { 
       RxBuf=UART1_DR;
      if((address_counter==0)&&(RxBuf==0))
      {
         start_code=1;address_counter=0;
        
        if(start_code)
       {
         RxData[address_counter++] = RxBuf; 
         address_counter++; 
         if(address_counter>3)
         {
          DMX_display=1;
          pwm[0]= RxData[1];
          pwm[1]= RxData[2];
          pwm[2]= RxData[3];
          break1=0; start_code=0; address_counter=0;
         } 
       } 
    }
  }
 }
}    

  

全部回复(3)
正序查看
倒序查看
flying123
LV.6
2
2018-11-06 08:11
帮顶
0
回复
松松man
LV.1
3
2018-11-07 21:39
@flying123
帮顶
谢谢!
0
回复
2020-10-24 20:08
专业生产1-300W  DMX512驱动  , 广泛应用于投光灯,洗墙灯,抱柱灯,灯带,水底灯,地埋灯,瓦楞灯,步道灯等户外照明,景观亮化,楼体亮化,文旅亮化。提供样板以及技术支持,承接电子产品开发,非标方案开发定制,控制系统配套,并可实地协助调试!  欢迎来电咨询索样业务部  黄S 15773375193
0
回复