打印
[STM8]

stm8 串行通讯问题

[复制链接]
886|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mr踏雪无痕|  楼主 | 2015-2-13 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过485串行通讯收到的数据控制PWM输出,采用中断接收,单独接收和发送都没问题,同时收发时出现问题,以下是程序,预期PWM应该是串行中断收到的数据,但实际却是待发送的数据,中断收到的数据被覆盖了,
不知道是不是 uart 寄存器没设置好,下面程序中PWM一直是0xEF,


#include "stm8s103f3p.h"
_Bool DE @PA_ODR:1;
_Bool RE @PA_ODR:2;

unsigned char PWM;   //收到的PWM控制数据

void DelayMS(unsigned int ms)      //延时函数
{
  unsigned char i;
  while(ms != 0)
   {
    for(i=0;i<250;i++)
       {
       }
    for(i=0;i<75;i++)
沙发
mr踏雪无痕|  楼主 | 2015-2-13 22:32 | 只看该作者
}
       ms--;
                }
}

void MAX485_Init(void)         //485初始化
{
         PA_DDR |=0x06;
         PA_CR1 |=0x06;
         PA_CR2 =0x00;
         DE=1;
         RE=0;        
}

void CLK_Init(void)           //时钟初始化
{
    CLK_CKDIVR = 0x11;        //fMASTER = 4MHZ,fCPU=fMASTER = 2MHZ
}

void TIM_Init(void)           //定时器初始化
{
    TIM2_CCMR1 = TIM2_CCMR1 | 0x70;       
    TIM2_CCMR2 = TIM2_CCMR2 | 0x70;
    TIM2_CCMR3 = TIM2_CCMR3 | 0x70;//TIM2  3个通道PWM模式2输出

    TIM2_CCER1 = TIM2_CCER1 | 0x33;//输出低电平有效
    TIM2_CCER2 = TIM2_CCER2 | 0x03;

    TIM2_ARRH = 0;
    TIM2_ARRL = 0xFF;

    TIM2_CCR1H = 0;        //
    TIM2_CCR1L = 0;
    TIM2_CCR2H = 0;
    TIM2_CCR2L = 0;
    TIM2_CCR3H = 0;
    TIM2_CCR3L = 0;

    TIM2_PSCR = 0;       //
    TIM2_CR1 = TIM2_CR1 | 0x01;// 启动计数
}

void UART1_Init(void)    //UART1初始化
{
    UART1_CR1 = 0x00; //
    UART1_CR2 = 0x00; //
    UART1_CR3 = 0x00;
    UART1_BRR2 = 0x00;
    UART1_BRR1 = 0x0D; // 对应的波特率为4000000/208=19200(00D0)
    UART1_CR2 |= 0x2C; // 允许发送接收,接收中断使能
}

void UART1_sendchar(unsigned char c)      //UART1发送字符
{
        while((UART1_SR & 0x80)==0x00);
      UART1_DR=c;
}

main()
{
         PWM=0x00;
         MAX485_Init();
         CLK_Init();
         UART1_Init();
         TIM_Init();
         _asm("rim");//开中断,sim为关中断
         while (1)
  {
          UART1_sendchar(0xEF);//
    TIM2_CCR1H = 0;
    TIM2_CCR1L = PWM;
          TIM2_CCR2H = 0;
    TIM2_CCR2L = PWM;
    TIM2_CCR3H = 0;
    TIM2_CCR3L = PWM;
          DelayMS(5);
  }
}

@far @interrupt void UART1_Recv_IRQHandler (void)   //中断接收
{
                unsigned char ch;
                ch=UART1_DR;
                PWM=ch;
                return;
}

使用特权

评论回复
板凳
zh113214| | 2015-2-14 18:32 | 只看该作者
么看出什么问题啊

使用特权

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

本版积分规则

7

主题

64

帖子

1

粉丝