jamari 发表于 2019-4-23 18:17:51

STM8S105模拟串口移植到s103上就不可以使用

main文件中的代码
extern u16 RxDataValue_Temp ;
extern u8RxData_ValidNum ;
extern u8 RXData;//全局变量 完整数据包
extern unsigned char flagpacker;   //全局变量    是否完整接收一个数据包
u8 TXData={0x52,0xF6,0x09};

void main(void)
{
char Test = 0;
All_Config();
enableInterrupts();//使能全局中断
SimUART_SendByte(0x01 );
/* Infinite loop */
while (1)
{
    SimUART_SendByte( Test++ );
    if( flagpacker ==1 )
      {
         for(u8 i=0;i<3;i++)
          {
            SimUART_SendByte( RXData );
          }
      flagpacker = 0;      
      }

}

}

user文件中的代码
#include "user.h"
u16 SimUART_SendData = 0xFF;
u8SimUART_SendData_BitNum = 10;
u8RxData_ValidNum = 0;
u8RxDataNum=0;
u8RXData;//全局变量完整数据包
u16 RxDataValue=0x0000;
u16 RxDataValue_Temp = 0x0000;

void Clock_Config(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
}



void IO_Init()
{
    //TXD:TXD位推挽输出PD2
    SimUART_PORT->ODR |=SimUART_PIN_TX; //0000 0100
    SimUART_PORT->DDR |=SimUART_PIN_TX; //0000 0100
    SimUART_PORT->CR1 |=SimUART_PIN_TX; //0000 0100
    SimUART_PORT->CR2 &= ~SimUART_PIN_TX; //0000 0100


    //RXD:悬浮输入 高电平 PD3
    SimUART_PORT->IDR |=SimUART_PIN_RX; //0000 1000
    SimUART_PORT->DDR &= ~SimUART_PIN_RX; //0000 1000
    SimUART_PORT->CR1 &= ~SimUART_PIN_RX; //0000 1000
    SimUART_PORT->CR2 &= ~SimUART_PIN_RX; //0000 1000
}

void TIM2_Init()
{
    CLK->PCKENR1 |= CLK_PCKENR1_TIM2;   //使能 TIM2
    TIM2->PSCR    = 0x04;             //16分频 1MHZ 1us
    TIM2->ARRH    = ARRValue_9600 >> 8;   //自动装载 每52us复位一次TIM2
    TIM2->ARRL    = ARRValue_9600;         //每1us递减1
    TIM2->CNTRH = 0;                //定时器清零
    TIM2->CNTRL = 0;

    TIM2->CR1 |= TIM2_CR1_CEN;      //开启定时器
}
//初始化中断
void Interrupt_Init()
{
    //允许更新中断
    //TIM2->CR1 &= ~TIM2_CR1_UDIS;      //允许更新可以不管默认为0
    TIM2->IER |= TIM2_IER_UIE;          //更新中断使能

    //IO口下降中断 初始化
    //SimUART_PORT->CR2 |= 0x08;          //使能外部中断
    SimUART_PORT->CR2 |= 0x08;          //使能外部中断
    EXTI->CR1 = 0x80;                   //仅下降沿触发   

    //禁止比较中断
    TIM2->IER &= ~TIM2_IER_CC1IE;       //禁止捕获/比较1
}

void SimUART_SendByte(u8 SendData)
{   
    while( SimUART_SendData_BitNum < 10 );

    //清 更新中断标志位
    TIM2->SR1 &= ~TIM2_SR1_UIF;

    //0000 0000 0000 0000 保证最低位(起始)为0,除数据位后全部为1
    SimUART_SendData = ( ( SendData << 1 )| (0xFE00) );
    SimUART_SendData_BitNum = 0;

    //开启更新中断
    TIM2-> IER |= TIM2_IER_UIE;   


}

//初始化函数
void All_Config( void )
{
    Clock_Config();
    IO_Init();
    TIM2_Init();
    Interrupt_Init();

}
中断文件中的代码
extern u16 SimUART_SendData ;
extern u8 SimUART_SendData_BitNum ;
extern u8RxData_ValidNum ;
extern u8RxDataNum;
extern u16 RxDataValue ;
extern u16 RxDataValue_Temp ;
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
//关闭IO中断
   //SimUART_PORT->CR2 &= ~0x08;
    SimUART_PORT->CR2 &= ~0x08;   
    //设置比较中断
    TIM2-> CCMR1 &= 0x00;       //还是有问题
    //TIM2-> CCR1H = 0;
    TIM2-> CCR1L = TIM2->CNTRL + ( ARRValue_9600/2 );

    RxDataValue = 0x0000;
    //TIM2->CCER1 |= 0x00;
    TIM2->SR1 &= ~TIM2_SR1_CC1IF;//清中断标志位   
    TIM2->IER |=TIM2_IER_CC1IE;//使能 捕获/比较中断1
}

INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
   // //第一步,清中断标志位
    TIM2->SR1 &= ~TIM2_SR1_UIF;

    //发送一个位 计数
    SimUART_SendData_BitNum++;

    if( ((SimUART_SendData) & 0X0001) )//如果是高电平,发高电平
    {
      SimUART_PORT->ODR |= SimUART_PIN_TX;
    }
    else                                        //如果是低电平,发低电平
    {
      SimUART_PORT->ODR &= ~SimUART_PIN_TX;
    }

    //发送一个位
    SimUART_SendData >>= 1;

    if( 10 <= SimUART_SendData_BitNum )
    {      
      TIM2-> IER &= ~TIM2_IER_UIE;
    }

}

extern u8 RXData;//全局变量完整数据包
u8 RXData_end;   //接受完数据
unsigned char flagpacker=0;   //全局变量    是否完整接收一个数据包
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14)
{
   static unsigned char RxData1;//接收数据缓存区
   static unsigned char count;                              //串口接收数据长度
   //第一步,清中断标志位(防止始终进入中断)
    TIM2->SR1 &= ~TIM2_SR1_CC1IF;//清中断标志位

    RxDataNum++;
    if( SimUART_PIN_RX == (SimUART_PORT->IDR & SimUART_PIN_RX ) )//其次,接收10个位
    {
      RxDataValue |= ( 0x01 << (RxDataNum) );//该位 置1      
    }

    //第二步,读IO输入   
    //首先,判断是否接收了10个位            
    if(10 == RxDataNum)               //如果是则
    {
      RxDataNum = 0;
      TIM2->IER &=~TIM2_IER_CC1IE;    //1、关 比较中断

      //STM8S没有外中断标志位,STM8L有标志位,因此暂时不需要清中断标志位
      SimUART_PORT->CR2 |= 0x08;      //2、开 IO中断

      //处理有效数据
      if((RxDataValue & 0x0402) == 0x0400 )
      {
            RxDataValue_Temp = ( RxDataValue >> 2 );
            RxData_ValidNum++;//接收字有效 节数
            RXData = RxDataValue_Temp;
            if(count>2)
            {
               for(unsigned char i = 0; i<count;i++)
                {
                  //RXData =RxData1;
                   }
   flagpacker = 1;//告诉系统已接收一个完整的数据包
   count=0;
      }
      }
    }
}




xmshao 发表于 2019-5-22 17:29:07

你重点检查下管脚的映射情况。
页: [1]
查看完整版本: STM8S105模拟串口移植到s103上就不可以使用