搜索
查看: 1754|回复: 2

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

[复制链接]

该用户从未签到

1

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2021-4-28
发表于 2019-4-23 18:17:51 | 显示全部楼层 |阅读模式
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;
      }  
        }
    }
}




回复

使用道具 举报

该用户从未签到

10

主题

802

帖子

271

蝴蝶豆

版主

最后登录
2020-12-15
发表于 2019-5-22 17:29:07 | 显示全部楼层
你重点检查下管脚的映射情况。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2021-3-19
发表于 2021-1-9 16:46:34 | 显示全部楼层
你好,问题解决了吗,我目前也遇到了模拟串口的问题,想请教一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-27 11:51 , Processed in 0.161833 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表