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

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

[复制链接]
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版