请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
jamari 提问时间:2019-4-23 18:17 /
main文件中的代码
extern u16 RxDataValue_Temp ;
extern u8  RxData_ValidNum ;
extern u8 RXData[3];  //全局变量 完整数据包
extern unsigned char flagpacker;   //全局变量    是否完整接收一个数据包
u8 TXData[3]={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[i] );
          }
        flagpacker = 0;      
        }

  }

}

user文件中的代码
#include "user.h"
u16 SimUART_SendData = 0xFF;
u8  SimUART_SendData_BitNum = 10;
u8  RxData_ValidNum = 0;
u8  RxDataNum=0;
u8  RXData[3];  //全局变量  完整数据包
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 u8  RxData_ValidNum ;
extern u8  RxDataNum;
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[3];  //全局变量  完整数据包
u8 RXData_end;   //接受完数据
unsigned char flagpacker=0;   //全局变量    是否完整接收一个数据包  
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14)
{
   static unsigned char RxData1[255];//接收数据缓存区  
   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[count++] = RxDataValue_Temp;
            if(count>2)
            {  
               for(unsigned char i = 0; i<count;i++)  
                {  
                  //RXData[i] =RxData1[i];  
                   }
     flagpacker = 1;//告诉系统已接收一个完整的数据包  
     count=0;
      }  
        }
    }
}




收藏 评论2 发布时间:2019-4-23 18:17

举报

2个回答
xmshao 回答时间:2019-5-22 17:29:07
你重点检查下管脚的映射情况。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

刘东晨晨晨 回答时间:2021-1-9 16:46:34
你好,问题解决了吗,我目前也遇到了模拟串口的问题,想请教一下
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版