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

串口通讯调不通,各位大侠帮忙看看

[复制链接]
HYD_hongyundong 提问时间:2015-9-23 21:06 /
  本来刚接触STM8 单片机使用的是STM8S103F3P6,想法为想实现两单片机的串口通讯,主机发0x01  从机接如果收到0x01亮1指示灯,如果接收不是0x01亮另一指示灯,接收用中断,可两指示灯都没亮啊,根本没进中断,大侠们帮我看看是不是哪里配置有问题。

  1)硬件很简单  主:TX-从RX    主:RX-从:TX  中间接一1K电阻,TX   RX分别接有5.1K上拉电阻,5V供电

   2)发送程序如下:
   #include "iostm8s103f3.h"
/************************************/
/***************宏定义***************/
/************************************/
#define  ON   1
#define  OFF  0
#define POWER_LED   (PD_ODR_ODR3)    //电源显示  PD3
#define HIGHF_LED   (PA_ODR_ODR3)    //强风显示  PA3
#define BAOC_LED    (PA_ODR_ODR1)    //爆炒显示  PA1
#define LOWF_LED    (PC_ODR_ODR5)    //低风显示  PC5
#define LIGHT_LED   (PC_ODR_ODR4)    //照明显示  Pc4
/************************************/
/*************系统初始化*************/
/************************************/
void Sysinit(void)
{
  PA_DDR = 0xff;  //输出模式
  PA_ODR = 0xff;  //输出1
  PA_CR2 = 0x00;  //输出  2MHZ
  PA_CR1 = 0xff;  //推挽输出
  
  PB_DDR = 0xff;  //输出模式
  PB_ODR = 0xff;  //输出1
  PB_CR2 = 0x00;  //输出  2MHZ
  PB_CR1 = 0xff;  //推挽输出
  
  PC_DDR = 0xff;  //PC4输入 AD口
  PC_ODR = 0xff;  //PC4输出0 其他输出1  PC5  FTC334C电源初值为1
  PC_CR2 = 0x00;  //输出  2MHZ
  PC_CR1 = 0xff;  //推挽输出     PC4浮空输入
  
  //PD_DDR = 0xff;  //PD1 2 3 4 5 6 7输出模式
  //PD_ODR = 0xff;  //PD1 2 3 4 5 6 7输出1
// PD_CR2 = 0x00;  //输出  2MHZ
  //PD_CR1 = 0xdf;  //PD5 Tx开漏输出
  
  CLK_ICKR = 0x01; //bit 0开HSI时钟
  while(!CLK_ICKR_HSIRDY) ; //等待HSI时钟准备就绪
  CLK_ECKR = 0x00; //外部时钟关
  CLK_CKDIVR = 0x18;  //bit4-3  00:HSI/1  01:HSI/2 10:HSI/4 11:HSI/8 Tcpu=HSI/8=2MHZ
  CLK_PCKENR1 = 0x00;  //开TIM4时钟   其他外设时钟关
  CLK_PCKENR2 = 0x00;  //bit2 BEEP
  
}
//串口初始化函数
void USART_Init(void)
{
  PD_DDR &= ~(1<<5);
  PD_CR1 |= (1<<5);
  PD_ODR |= (1<<5);        
               
  PD_DDR &= ~(1<<6);
  PD_CR1 |= (1<<6);
  PD_ODR |= (1<<6);
  CLK_PCKENR1|= 0x04;  //开启串口时钟
  UART1_CR2 |= 0x00;    //发送禁止
  UART1_CR1 = 0x00;  //8位数据 不用奇偶校验
  UART1_CR3 = 0x00;  //1位停止位  不开启同步模式
  UART1_BRR2 = 0x00;  //9600  @2MHZ
  UART1_BRR1 = 0x0d;  //9600  @2MHZ
  UART1_CR2 |= 0x08;   //开启发送使能
  
}
void Send_Date(uint8_t date)
{
  while(!(UART1_SR&0x80))  ;    //等待发送数据寄存器空
  UART1_DR = date;
  while(!(UART1_SR&0x40))  ;   //等待发送完成
}
void main(void)
{
  Sysinit();
  USART_Init();
   Send_Date(0x01);
   
   //if(UART1_SR & 0x80)  {HIGHF_LED = 0;}
   while(1) ;
}

3)接收程序如下:
   #include "iostm8s103f3.h"
/************************************/
/***************宏定义***************/
/************************************/
#define  ON   1
#define  OFF  0
#define POWER_LED   (PD_ODR_ODR3)    //电源显示  PD3
#define HIGHF_LED   (PA_ODR_ODR3)    //强风显示  PA3
#define LOWF_LED    (PC_ODR_ODR5)    //低风显示  PC5
#define LIGHT_LED   (PC_ODR_ODR4)    //照明显示  Pc4

uint8_t temp;                 
/************************************/
/*************系统初始化*************/
/************************************/
void Sysinit(void)
{
  PA_DDR = 0xff;  //输出模式
  PA_ODR = 0xff;  //输出1
  PA_CR2 = 0x00;  //输出  2MHZ
  PA_CR1 = 0xff;  //推挽输出
  
  PB_DDR = 0xff;  //输出模式
  PB_ODR = 0xff;  //输出1
  PB_CR2 = 0x00;  //输出  2MHZ
  PB_CR1 = 0xff;  //推挽输出
  
  PC_DDR = 0xff;  //PC4输入 AD口
  PC_ODR = 0xff;  //PC4输出0 其他输出1  PC5  FTC334C电源初值为1
  PC_CR2 = 0x00;  //输出  2MHZ   PD6禁止外部中断
  PC_CR1 = 0xff;  //推挽输出     PD6带上拉电阻输入
  
  //PD_DDR = 0xbf;  //PD6 输入模式  Rx 引脚
  //PD_ODR = 0xff;  //PD1 2 3 4 5 6 7输出1
// PD_CR2 = 0x00;  //输出  2MHZ
  //PD_CR1 = 0xff;  //推挽输出
  
  CLK_ICKR = 0x01; //bit 0开HSI时钟
  while(!CLK_ICKR_HSIRDY) ; //等待HSI时钟准备就绪
  CLK_ECKR = 0x00; //外部时钟关
  CLK_CKDIVR = 0x18;  //bit4-3  00:HSI/1  01:HSI/2 10:HSI/4 11:HSI/8 Tcpu=HSI/8=2MHZ
  CLK_PCKENR1 = 0xff;  //开TIM4时钟   其他外设时钟关
  CLK_PCKENR2 = 0xff;  //bit2 BEEP
  
}
void Delay_us(uint16_t us)
{
  while(us--) ;
}
void Delay_ms(uint16_t ms)
{
  uint16_t i;
  while(ms--)
  {
    for(i=0;i<1420;i++)
    {
      ;
    }
  }
}

//串口初始化函数
void USART_Init(void)
{
  //CLK_PCKENR1|= 0x04;  //开启串口时钟
  PD_DDR &= ~(1<<5);
  PD_CR1 |= (1<<5);
  PD_ODR |= (1<<5);        
               
  PD_DDR &= ~(1<<6);
  PD_CR1 |= (1<<6);
  PD_ODR |= (1<<6);
  UART1_CR1 = 0x00;  //8位数据 不用奇偶校验
  UART1_CR3 = 0x00;  //1位停止位  不开启同步模式
  UART1_BRR2 = 0x00;  //9600  @2MHZ
  UART1_BRR1 = 0x0d;  //9600  @2MHZ
  UART1_CR2 = 0x24;   //接收中断使能  开启接收使能
  asm("rim") ;       //允许CPU全局中断  STVD中为_asm("rim"); 开全局中断
}
#pragma vector=UART1_R_RXNE_vector
__interrupt void UART1_R_RXNE_vector_IRQHandler(void)
{
  temp = UART1_DR;
  if(temp == 0x01) {HIGHF_LED = 0;}
  else {LOWF_LED = 0;}
}
void main(void)
{
  Sysinit();
  USART_Init();
// LIGHT_LED = 0;
  
  while(1)  ;
}

收藏 评论8 发布时间:2015-9-23 21:06

举报

8个回答
anger0925 回答时间:2015-9-24 09:30:11
仿真看一下
JackieLaura 回答时间:2015-9-24 11:21:13
先用串口调试助手每个单独调调吧。。。
stmcu.org.png
HYD_hongyundong 回答时间:2015-9-24 11:52:20

IAR仿真不太会用,有类似的资料没??有的话发我一份!!谢谢!!
HYD_hongyundong 回答时间:2015-9-24 11:53:40
JackieLaura 发表于 2015-9-24 11:21
先用串口调试助手每个单独调调吧。。。

不是开发板,是自己动手弄得两块板子,没用232芯片和PL2303芯片.............
yanhaijian 回答时间:2015-9-24 13:31:31
呵呵,实在不行就老老实实的照抄例程吧。
anger0925 回答时间:2015-9-25 08:59:12
HYD_hongyundong 发表于 2015-9-24 11:52
IAR仿真不太会用,有类似的资料没??有的话发我一份!!谢谢!!

IAR的资料很多
JackieLaura 回答时间:2015-9-25 08:59:38
HYD_hongyundong 发表于 2015-9-24 11:53
不是开发板,是自己动手弄得两块板子,没用232芯片和PL2303芯片.............

usb转ttl线搞根,先一个个单独调吧,实在不行,先试试楼上的方法,验证硬件有没有问题
stmcu.org.png
HYD_hongyundong 回答时间:2015-9-25 11:03:42
JackieLaura 发表于 2015-9-25 08:59
usb转ttl线搞根,先一个个单独调吧,实在不行,先试试楼上的方法,验证硬件有没有问题 ...

好的,谢谢!!我试试...........
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版