OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5607|回复: 4

要求USART1和USART2能实现通信。通过XCOM调试助手从USART1发送数据到USART2接收,从USART2发送数据到USART1接收。但是我写的程序怎么都实现不了,没有收发

[复制链接]

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-6-29
在线时间
25 小时
发表于 2015-7-31 14:57:03 | 显示全部楼层 |阅读模式
5金钱
最近在写一个程序,要求USART1和USART2能实现通信。通过XCOM调试助手从USART1发送数据到USART2接收,从USART2发送数据到USART1接收。但是我写的程序怎么都实现不了,没有收发,但是如果标注一个串口的话,剩下的串口既能收有能发,求原子哥帮助。
usart.h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h" 

#define USART_REC_LEN   200   
#define USART2_REC_LEN 200
#define EN_USART_RX 1 
#define EN_USART2_RX 1

extern u8  USART_RX_BUF[USART_REC_LEN]; 
extern u16 USART_RX_STA;         
extern u8  USART_RX_BUF[USART2_REC_LEN];
extern u16 USART2_RX_STA;

void uart_init(void);
void uart2_init(void);

#endif

usart.c
#include "sys.h"
#include "usart.h"  

#if SYSTEM_SUPPORT_OS
#include "includes.h"    
#endif
  
#if 1
#pragma import(__use_no_semihosting)             
                 
struct __FILE 

int handle; 

}; 

FILE __stdout;       
   
_sys_exit(int x) 

x = x; 

 
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//???··???,?±??·????ê±?   
    USART1->DR = (u8) ch;      
return ch;
}
#endif 

 
#if EN_USART_RX    
u8 USART_RX_BUF[USART_REC_LEN];     
u16 USART_RX_STA=0;         

void uart_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); 

//USART1_TX   GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
GPIO_Init(GPIOA, &GPIO_InitStructure);
   
//USART1_RX  GPIOA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA.10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);//??????GPIOA.10  

//Usart1 NVIC 
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 

//USART1

USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 
USART_Init(USART1, &USART_InitStructure); 

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_Cmd(USART1, ENABLE);                     
}

void USART1_IRQHandler(void)              
{
u8 Res;
#if SYSTEM_SUPPORT_OS 
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
Res =USART_ReceiveData(USART1);

if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000; 
}
else 
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;   
}  
}
}    
     } 
#if SYSTEM_SUPPORT_OS 
OSIntExit();    
#endif

#endif


#if EN_USART2_RX   
   
u8 USART_RX_BUF[USART2_REC_LEN];    

u16 USART2_RX_STA=0;     

void uart2_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); 

//USART1_TX   GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
GPIO_Init(GPIOA, &GPIO_InitStructure);
   
//USART1_RX  GPIOA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//USART2 NVIC 
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
  
//USART2 

USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 

USART_Init(USART2, &USART_InitStructure); 
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_TXE,ENABLE);  
USART_Cmd(USART2, ENABLE);                    
}

void USART2_IRQHandler(void)                
{
u8 Res;
#if SYSTEM_SUPPORT_OS .
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
{
Res =USART_ReceiveData(USART1);
if((USART2_RX_STA&0x8000)==0)
{
if(USART2_RX_STA&0x4000)
{
if(Res!=0x0a)USART2_RX_STA=0;
else USART2_RX_STA|=0x8000;  
}
else 
{
if(Res==0x0d)USART2_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
USART2_RX_STA++;
if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;   
}  
}
}    
     } 
#if SYSTEM_SUPPORT_OS 
OSIntExit();    
#endif
}

#endif


main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"

 int main(void)
 {
  u16 t;  
u16 len;
u16 times=0;
delay_init();     
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

uart_init(); 
uart2_init();
  while(1)
{

if(USART_RX_STA&0x8000)
{   
len=USART_RX_STA&0x3fff;

for(t=0;t<len;t++)
{
USART_SendData(USART2, USART_RX_BUF[t]);

while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
USART_RX_STA=0;
}else
{
times++;
delay_ms(10);   
}
}  
 }







串口实验 (2).zip

2.57 MB, 下载次数: 225

最佳答案

查看完整内容[请看2#楼]

说实话,我还是个菜鸟,最开始发贴的时候是几个月前,那会儿啥都不懂,就是一片白纸。这几个月跟着公司的师傅做了几个项目,慢慢的开始懂一些了。贴上我写的通信程序吧,还是要求USART1发送从USART2收到的数,USART2发送从USART1收到的数,经过试验还是能用的 我用的单片机是STM32F103ZET6版本是YL-29
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-6-29
在线时间
25 小时
 楼主| 发表于 2015-7-31 14:57:04 | 显示全部楼层
说实话,我还是个菜鸟,最开始发贴的时候是几个月前,那会儿啥都不懂,就是一片白纸。这几个月跟着公司的师傅做了几个项目,慢慢的开始懂一些了。贴上我写的通信程序吧,还是要求USART1发送从USART2收到的数,USART2发送从USART1收到的数,经过试验还是能用的
我用的单片机是STM32F103ZET6版本是YL-29

USART.zip

4.99 MB, 下载次数: 582

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-31 23:01:40 | 显示全部楼层
帮顶.....
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1684
金钱
1684
注册时间
2014-2-25
在线时间
230 小时
发表于 2016-1-21 19:00:54 | 显示全部楼层
这种问题是用仿真很容易调试出来的,仿真一步步看看是在哪里出现问题了
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-6-29
在线时间
25 小时
 楼主| 发表于 2016-1-22 15:45:00 | 显示全部楼层
1201yuge 发表于 2016-1-21 19:00
这种问题是用仿真很容易调试出来的,仿真一步步看看是在哪里出现问题了

谢谢,只是最开始遇到问题的时候不知道怎么做,不过现在遇到问题知道怎么解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 13:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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