打印
[STM32F1]

STM32与51单片机串口通信

[复制链接]
8869|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
511706987|  楼主 | 2014-2-24 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大家一个问题,我用51和STM32进行通信,51只用接收数据然后在1602上显示,STM32发送数据。TXD和RXD错开连接,共地。为什么我现在51收不到STM32的数据呢?STM32是用的MINI

51程序:
#include<reg52.h>
#include"1602.h"

unsigned char read_flag =0;
unsigned char i = 0;

void init_com()
{
        TMOD |= 0X20;
        TH1 = 0XFD;
        TL1 = 0XFD;
        TR1 = 1;
        REN = 1;
        SM0 = 0;
        SM1 = 1;
        EA = 1;
        ES = 1;
}

void send_char(unsigned char ch)
{
        SBUF = ch;
        while(TI==0);
        TI = 0;
}

int main()
{
                unsigned char ch[5] = {'w','s','d','a'};

                init_com();
                LCD_init();
       
                while(1)
                {
                        write_com(0x80);
                        if(read_flag)
                        {
                                read_flag = 0;
                                write_date(ch[i - '0']);
                        }
                }
       
}

void re_com() interrupt 4       
{
        if(RI)
        {
                RI = 0;
                i = SBUF;
                read_flag = 1;
        }
}

STM32程序:
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"

int main(void)
{
        u8 t,i = 0;
        u8 ch[5]={'1','2','3','4'};
       
        SystemInit();
        delay_init(72);
        NVIC_Configuration();
          
        uart_init(9600);
        KEY_Init();
         
        while(1)
        {
                        t = KEY_Scan();
                        if(t == 1)
                        {
                                USART_SendData(USART1,ch[i]);
                                i++;
                                if(i>=4)
                                {
                                        i = 0;
                                }
                        }
        }         

}
STM32采用的是原子哥的串口程序,用的是串口一。波特率设置的是9600,usart.c没有改变就是原子哥的程序。请大神指点一哈问题在哪里啊?!!谢谢了
沙发
huangxz| | 2014-2-24 23:12 | 只看该作者
用示波器看下波形,波特率对不对,收发有没有接错

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
511706987 + 1 很给力!
板凳
511706987|  楼主 | 2014-2-24 23:33 | 只看该作者
huangxz 发表于 2014-2-24 23:12
用示波器看下波形,波特率对不对,收发有没有接错

晕,线接错了。。。。哎 低级错误。。谢谢你了哈

使用特权

评论回复
地板
511706987|  楼主 | 2014-2-25 16:05 | 只看该作者
huangxz 发表于 2014-2-24 23:12
用示波器看下波形,波特率对不对,收发有没有接错

想问问,用STM32的串口2为啥就不能和51通信了啊、、、就是改了哈配置就不行了。。

使用特权

评论回复
5
hellonihaoma| | 2014-2-25 17:03 | 只看该作者

使用特权

评论回复
6
airwill| | 2014-2-25 17:18 | 只看该作者
STM32的串口2为啥就不能和51通信了啊?
注意 STM32 的两个串口用的时钟频率不同, 留意一下波特率的设置

使用特权

评论回复
7
511706987|  楼主 | 2014-2-27 13:26 | 只看该作者
airwill 发表于 2014-2-25 17:18
STM32的串口2为啥就不能和51通信了啊?
注意 STM32 的两个串口用的时钟频率不同, 留意一下波特率的设置 ...

请教你一下,这是我用寄存器的写法修改的串口2,可是为什么传的数据在电脑上显示的全是问号啊???
这是usart.c里面的:

#if 1
#pragma import(__use_no_semihosting)            
               
struct __FILE
{
        int handle;
        /* Whatever you require here. If the only file you are using is */
        /* standard output using printf() for debugging, no file handling */
        /* is required. */
};
/* FILE is typedef¡¯ d in stdio.h. */
FILE __stdout;      
_sys_exit()  
_sys_exit(int x)
{
        x = x;
}
//Öض¨Òåfputcº¯Êý
int fputc(int ch, FILE *f)
{      
        while((USART2->SR&0X40)==0);
        USART2->DR = (u8) ch;      
        return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////

#if EN_USART2_RX   
         
u8 USART_RX_BUF[USART_REC_LEN];     .

u16 USART_RX_STA=0;        
  
void USART2_IRQHandler(void)
{
        u8 res;            
        if(USART2->SR&(1<<5))
        {         
                res=USART2->DR;
                if((USART_RX_STA&0x80)==0)
                {
                        if(USART_RX_STA&0x40)
                        {
                                if(res!=0x0a)USART_RX_STA=0;
                                else USART_RX_STA|=0x80;       
                        }else //»¹Ã»ÊÕµ½0X0D
                        {       
                                if(res==0x0d)USART_RX_STA|=0x40;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3F]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA> 63)USART_RX_STA=0;          
                                }                 
                        }
                }                                                                                                
        }                                                                                           
}
#endif                                                                                 


//bound:²¨ÌØÂÊ
//CHECK OK
//091209
void uart_init(u32 pclk2,u32 bound)
{           
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;                               
        fraction=(temp-mantissa)*16;
    mantissa<<=4;
        mantissa+=fraction;
       
        RCC->APB2ENR|=1<<2;   
        RCC->APB1ENR|=1<<17;
        GPIOA->CRL&=0XFFFF00FF;//IO״̬ÉèÖÃ
       
        RCC->APB1RSTR|=1<<17;  
        RCC->APB1RSTR&=~(1<<17);                     

        USART2->BRR=mantissa;          
        USART2->CR1|=0X200C;  
#if EN_USART2_RX                  
       
        USART2->CR1|=1<<8;   
        USART2->CR1|=1<<5;   
        MY_NVIC_Init(3,3,USART2_IRQChannel,2);
#endif
}

main函数:

int main(void)
{       
                u8 key = '2';         
                u8 tmp;
                u8 ch[5]={'1','2','3','4'};

                Stm32_Clock_Init(9);
                delay_init(72);               
                uart_init(72,9600);
                LED_Init();
                KEY_Init();
               
                while(1)
                {
                        USART2->DR='1';
                        while((USART2->SR&0X40)==0);
                        delay_ms(2200);
                        USART2->DR='1';
                        while((USART2->SR&0X40)==0);
                        delay_ms(2200);
                }
}

使用特权

评论回复
8
511706987|  楼主 | 2014-2-27 13:28 | 只看该作者
RCC->APB2ENR|=1<<2;   
        RCC->APB1ENR|=1<<17;
        GPIOA->CRL&=0XFFFF00FF;
         GPIOA->CRL&=0XFFFF8BFF;
刚刚复制的时候这句话复制掉了哈

使用特权

评论回复
9
outstanding| | 2014-2-27 13:36 | 只看该作者
:lol

使用特权

评论回复
10
511706987|  楼主 | 2014-2-27 13:44 | 只看该作者
为什么串口2我把波特率设置为uart_init(72,9600); 但实际上我用电脑上接收的话必须是4800的波特率才能接收到数据???这是什么情况啊?串口1和串口2的时钟频率不一样??? 就不能用串口1的计算波特率的这个公式来算波特率了??
        float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;                                
        fraction=(temp-mantissa)*16;
    mantissa<<=4;
        mantissa+=fraction;

使用特权

评论回复
11
511706987|  楼主 | 2014-2-27 13:45 | 只看该作者
为什么串口2我把波特率设置为uart_init(72,9600); 但实际上我用电脑上接收的话必须是4800的波特率才能接收到数据???这是什么情况啊?串口1和串口2的时钟频率不一样??? 就不能用串口1的计算波特率的这个公式来算波特率了??
        float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;                                
        fraction=(temp-mantissa)*16;
    mantissa<<=4;
        mantissa+=fraction;

使用特权

评论回复
12
511706987|  楼主 | 2014-2-27 13:48 | 只看该作者
outstanding 发表于 2014-2-27 13:36

为什么串口2我把波特率设置为uart_init(72,9600); 但实际上我用电脑上接收的话必须是4800的波特率才能接收到数据???这是什么情况啊?串口1和串口2的时钟频率不一样??? 就不能用串口1的计算波特率的这个公式来算波特率了??
        float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;                                
        fraction=(temp-mantissa)*16;
    mantissa<<=4;
        mantissa+=fraction;

使用特权

评论回复
13
outstanding| | 2014-2-27 14:35 | 只看该作者
有这种事情,要么是配置有问题 要么是计算有问题了。

使用特权

评论回复
14
nieheng16| | 2014-3-24 19:56 | 只看该作者
你好朋友,我现在也是做51和STM32的串口通信。能不能把你51和STM32的程序发给我?QQ:727974931。快毕业了,就差那么一点没搞通,帮帮忙吧。

使用特权

评论回复
15
cxqjustin| | 2015-7-29 22:21 | 只看该作者
楼主,请教一下你是将单片机和STM32直接连接起来吗?STM32是采用推挽输出还是外加5V上拉电阻,然后设置成开漏输出模式呢???

使用特权

评论回复
16
dengbingta| | 2017-4-16 07:28 | 只看该作者
你好朋友,我现在也是做51和STM32的串口通信。能不能把你51和STM32的程序发给我分享呢?qq2556705931

使用特权

评论回复
17
jkpk42| | 2017-11-8 09:50 | 只看该作者
STM32的串口2不能容忍5V,应该是导致不能和5V的单片机直接进行通信的原因吧

使用特权

评论回复
18
liubinglin| | 2022-11-27 13:43 | 只看该作者
airwill 发表于 2014-2-25 17:18
STM32的串口2为啥就不能和51通信了啊?
注意 STM32 的两个串口用的时钟频率不同, 留意一下波特率的设置 ...

不兼容5V电平

使用特权

评论回复
19
SantaBunny| | 2023-2-20 22:49 | 只看该作者
分别编写STM32与51单片机程序,通过串口通信,实现STM32按键控制51单片机LED的实验效果

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

86

帖子

0

粉丝