打印

菜鸟求助——串口通信

[复制链接]
2206|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
云帆沧海|  楼主 | 2012-7-19 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 云帆沧海 于 2012-7-19 10:36 编辑

首先说明函数功能:
通过中断实现串口通信,首先由PC向stm32发送数据,然后再将收到的数据由stm32传回PC机,通过下面函数为什么不能实现?望指点
主函数:
#include "stm32f10x_lib.h"
#include "platform_config.h"
void RCC_Configuration(void);      //时钟使能
void GPIO_Configuration(void);      //GPIO使能
void NVIC_Configuration(void);      //中断使能
USART_InitTypeDef USART_InitStructure;
  
int main(void)
{
  RCC_Configuration();
  NVIC_Configuration();
  GPIO_Configuration();
  
  USART_InitStructure.USART_BaudRate = 115200;
  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_TXE|USART_IT_RXNE, ENABLE);
  USART_Cmd(USART1, ENABLE);
  while (1)
  {
  }
}
void RCC_Configuration(void)
{               
  /*使能串口1使用的GPIO时钟*/
  RCC_APB2PeriphClockCmd(USART1_GPIO_CLK, ENABLE);
  /*使能串口1时钟*/
  RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE);
}
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /*串口1 TX管脚配置*/
  GPIO_InitStructure.GPIO_Pin = USART1_TxPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
  /*串口1 RX管脚配置*/
  GPIO_InitStructure.GPIO_Pin = USART1_RxPin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
}
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                                 //抢占式中断优先级设置为0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                        //响应式中断优先级设置为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


中断函数:
#include "stm32f10x_it.h"
#define RxBufferSize   0xfe
u8 RxBuffer[RxBufferSize];
u16 RxCounter = 0;
int i=0;
void receive_data(void) ;                                                    //声明接收发送函数
void send_data(void)  ;
void USART1_IRQHandler(void)                              //中断主函数
{
  while(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)                 //检查串口1的接收中断
   {                    
   receive_data();
   }
  while(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
   {   
   send_data()   ;
   }
USART_ITConfig(USART1, USART_IT_TXE|USART_IT_RXNE, ENABLE);             //使能中断
}
   
   void receive_data(void)                                  //接收函数
      {
        RxBuffer[RxCounter++] = USART_ReceiveData(USART1);                 //接收数据
     if(RxCounter<0xfe||'\n'==RxBuffer[RxCounter])
       {
      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);     //失能接收中断
    }
     }
   void send_data(void)                                            //发送函数
   {
     if(i<RxCounter)
     USART_SendData(USART1, RxBuffer[i++]);
    // USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    USART_ClearITPendingBit(USART1, USART_IT_TXE);
   }
   
  
PS:本人使用的开发板为神舟三号,芯片类型STM32F103ZE
沙发
云帆沧海|  楼主 | 2012-7-19 11:14 | 只看该作者
会的回一个啊    谢谢了啊~~~

使用特权

评论回复
板凳
香水城| | 2012-7-19 12:14 | 只看该作者
ST有这么多USART的例程,LZ就没有一个可以参考的吗?

使用特权

评论回复
地板
云帆沧海|  楼主 | 2012-7-19 12:25 | 只看该作者
就是参考例程改的 编译连接都通过了 但是结果不对   3# 香水城

使用特权

评论回复
5
香水城| | 2012-7-19 14:01 | 只看该作者
主时钟配置正确吗?你用的板子的晶振和例程的晶振频率一致吗?

使用特权

评论回复
6
云帆沧海|  楼主 | 2012-7-19 17:16 | 只看该作者
时钟的配置均已按照开发板,提供的程序配置 5# 香水城

使用特权

评论回复
7
sycamin| | 2012-7-19 20:26 | 只看该作者
可以先不用中断,测试发送是否正常

使用特权

评论回复
8
bszl| | 2012-7-20 08:40 | 只看该作者
RCC_Configuration()这里只开启了外设时钟,主时钟是否配置检查下吧。

使用特权

评论回复
9
lyncxy119| | 2012-7-20 08:46 | 只看该作者
你没使能相应的GPIO引脚

使用特权

评论回复
10
weicz| | 2012-7-20 10:16 | 只看该作者

没清楚中断标志,死在里面了

本帖最后由 weicz 于 2012-7-20 10:21 编辑

感觉你的中断函数好奇怪,你居然在中断里用while循环,还是两个,这样不太好吧。
而且很严重的问题,你进入中断之后没有清中断请求标志,记得是什么UsartClearPending之类的函数,库里应该有。

使用特权

评论回复
11
yycyh| | 2012-7-20 12:57 | 只看该作者
你好,你中断中没有清除中断标志位

使用特权

评论回复
12
yycyh| | 2012-7-20 12:58 | 只看该作者
而且你的系统时钟打开了吗

使用特权

评论回复
13
唐山蜂男| | 2012-7-20 14:22 | 只看该作者
真的很深奥哟~~

使用特权

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

本版积分规则

3

主题

19

帖子

0

粉丝