HYD_hongyundong 发表于 2015-9-23 21:06:41

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

本来刚接触STM8 单片机使用的是STM8S103F3P6,想法为想实现两单片机的串口通讯,主机发0x01从机接如果收到0x01亮1指示灯,如果接收不是0x01亮另一指示灯,接收用中断,可两指示灯都没亮啊,根本没进中断,大侠们帮我看看是不是哪里配置有问题。

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

   2)发送程序如下:
   #include "iostm8s103f3.h"
/************************************/
/***************宏定义***************/
/************************************/
#defineON   1
#defineOFF0
#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 其他输出1PC5FTC334C电源初值为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-300:HSI/101: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"
/************************************/
/***************宏定义***************/
/************************************/
#defineON   1
#defineOFF0
#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 其他输出1PC5FTC334C电源初值为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-300:HSI/101: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);
}

anger0925 发表于 2015-9-24 09:30:11

仿真看一下

JackieLaura 发表于 2015-9-24 11:21:13

先用串口调试助手每个单独调调吧。。。

HYD_hongyundong 发表于 2015-9-24 11:52:20

anger0925 发表于 2015-9-24 09:30
仿真看一下

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线搞根,先一个个单独调吧,实在不行,先试试楼上的方法,验证硬件有没有问题

HYD_hongyundong 发表于 2015-9-25 11:03:42

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

好的,谢谢!!我试试...........
页: [1]
查看完整版本: 串口通讯调不通,各位大侠帮忙看看