OpenEdv-开源电子网

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

串口中断问题

[复制链接]

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
发表于 2011-11-9 22:30:27 | 显示全部楼层 |阅读模式

#include "stm32f10x.h"
void RCC_Configuration(void);
void USATR_Configuration(uint32_t USART_BaudRate);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 times);
int main(void)

 RCC_Configuration();               
 GPIO_Configuration();
 USATR_Configuration(115200);
 NVIC_Configuration();               
 GPIO_SetBits(GPIOA,GPIO_Pin_8);
 GPIO_SetBits(GPIOD,GPIO_Pin_2);
 USART_ClearFlag(USART1,USART_FLAG_TC);

    
    while(1)
    {
   
    }  
}  

void RCC_Configuration(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);        //串口时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);   //GPIO时钟


void GPIO_Configuration(void)        
{                     
 GPIO_InitTypeDef GPIO_InitStructure;            //LED0初始化
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD;
 GPIO_Init(GPIOA,&GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;           //LED1初始化
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD;
 GPIO_Init(GPIOD,&GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //PA10为RXD,初始化  开发板上的RXD和TXD连接
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA,&GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              //PA9为TXD,初始化
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void USATR_Configuration( uint32_t USART_BaudRate)
{
 USART_InitTypeDef USART_InitStructure;               //串口初始化
 USART_InitStructure.USART_BaudRate = USART_BaudRate;
 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_Tx | USART_Mode_Rx;
 USART_Init(USART1,&USART_InitStructure);
 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);           //接收中断
 USART_Cmd(USART1,ENABLE);                //打开串口
}

void NVIC_Configuration(void)                //中断嵌套向量
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //中断优先级分组
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;      
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级
  NVIC_InitStructure. NVIC_IRQChannelSubPriority = 0;         //响应优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
  NVIC_Init(&NVIC_InitStructure);
}



这是stm32f10x_it.c中的中断


void HardFault_Handler(void)
{
  while (1)
  {
  }
}

void USART1_IRQHandler(void)
{
  char RX_Flag;
  char RX_Data;
  USART_GetFlagStatus(USART1,USART_FLAG_RXNE);     //接收数据非空    
  RX_Flag=USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
  if(RX_Flag==SET)
  {
 USART_ClearITPendingBit(USART1,USART_IT_RXNE);       //清除中断标志
 RX_Data=USART_ReceiveData(USART1);
   USART_SendData(USART1,RX_Data);
 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
 GPIO_ResetBits(GPIOD,GPIO_Pin_2);                       //LED点亮

  } 

}


我想实现用串口调试工具发送"hello",开发板给串口调试工具也发送"hello"

发送4个长度以内的字符可以正常发送,发送5个长度的字符串,则不能正常发送
如:串口调试工具只能发送六个“hello”,再点击发送就没有数据返回,好像是缓存不够?还是数据丢失?





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
 楼主| 发表于 2011-11-10 09:22:24 | 显示全部楼层
将中断函数里的
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
改为
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
就可以

我在串口初始化打开的是接收中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);           //接收中断
那用TXE和TC有什么区别
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-10 09:38:04 | 显示全部楼层
回复【2楼】天马:
---------------------------------
看寄存器描述.
不管你用不用库.寄存器最终你还是得看的.否则你迷茫了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-11-10 09:38:11 | 显示全部楼层
我收回我的话,嗯,我再看看。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

38

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-7-12
在线时间
0 小时
 楼主| 发表于 2011-11-11 07:58:32 | 显示全部楼层
回复【4楼】sixear:
---------------------------------
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 10:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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