STM32F103 UART4的问题

[复制链接]
13830|17
 楼主| star143133 发表于 2012-4-10 14:21 | 显示全部楼层 |阅读模式
void USART4_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE  );
              
USART_InitStructure.USART_BaudRate = 9600;        // 波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;     // 8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1;      // 在帧结尾传输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(UART4, &USART_InitStructure);
     
  
USART_ClearFlag(UART4, USART_IT_RXNE);    //清中断,以免一启用中断后立即产生中断
USART_ITConfig(UART4,USART_IT_RXNE, ENABLE);  //使能USART4中断源
USART_Cmd(UART4, ENABLE);       //USART4总开关:开启

}

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

当我配置好UART4的中断以后。程序运行死机。
当我注销掉这段。程序就运行正常。
/*  NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
求助 谁知道为什么
acgean 发表于 2012-4-10 14:31 | 显示全部楼层
两个原因
① 没有中断服务函数。
②芯片没有 USART4。
 楼主| star143133 发表于 2012-4-10 14:34 | 显示全部楼层
2# acgean
void USART4_IRQHandler(void)
{ //GPS_LED_L;
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
  Rx4Buf.buf[Rx4Buf.head] = (USART_ReceiveData(UART4) & 0x7F);
  if(++Rx4Buf.head>=MAX_GPS_CommuSize)
  {
   Rx4Buf.head=0;
  }
  USART_ClearITPendingBit(UART4, USART_IT_RXNE);
}
这个是中断函数
zh
}
 楼主| star143133 发表于 2012-4-10 14:37 | 显示全部楼层
2# acgean


STM32F103RCT6 这个是芯片型号
 楼主| star143133 发表于 2012-4-10 16:33 | 显示全部楼层
有人能帮我下么
香水城 发表于 2012-4-10 17:13 | 显示全部楼层
程序运行后能进中断函数吗?
acgean 发表于 2012-4-11 09:08 | 显示全部楼层
我看,找调试器帮你吧
sdrztw001 发表于 2012-4-11 14:10 | 显示全部楼层
/*  NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
很明显错了
yinyangdianzi 发表于 2012-4-11 14:54 | 显示全部楼层
这个问题很多人问了,,,STM32FXX某个型号,到底有木有UART 4啊。。。。见过N多人问这个问题

介意仔细看看手册
yzzly 发表于 2012-4-11 15:09 | 显示全部楼层
多半是没有UART4中断函数造成的,中断走飞了!
lai832 发表于 2012-4-12 09:32 | 显示全部楼层
支持8楼

调用,
及你的函数对不上
jeloc218 发表于 2012-8-14 10:32 | 显示全部楼层
最近我也在弄PC10 PC11的串口3和串口4,用串口4时,发现问题和你一样,后来查了一下,问题还是出在中断服务函数上面,启动文件startup_stm32f10x_hd.s里有个伪定义: DCD     UART4_IRQHandler      ; UART4也就是说,所以你的中断服务函数不是USART4_IRQHandler啦,我改过后就可以近终端正常发送和接收了
jeloc218 发表于 2012-8-14 10:32 | 显示全部楼层
用串口3,需要重映射,添加以下几句应该可以,

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  //重映射时钟  


GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); //将USART3局部重映射到PC10,PC11



捡漏王子 发表于 2012-8-14 10:35 | 显示全部楼层
学习一下
cool33777612 发表于 2013-9-9 13:05 | 显示全部楼层
jeloc218 发表于 2012-8-14 10:32
最近我也在弄PC10 PC11的串口3和串口4,用串口4时,发现问题和你一样,后来查了一下,问题还是出在中断服务 ...

你好 可以具体说一下么。
伪定义?我的UART4只能发送 不能进入接收中断 不知道什么原因 使用的是3.5的hd.s
szy494468597 发表于 2013-12-12 16:04 | 显示全部楼层
cool33777612 发表于 2013-9-9 13:05
你好 可以具体说一下么。
伪定义?我的UART4只能发送 不能进入接收中断 不知道什么原因 使用的是3.5的hd. ...

我觉得他的意思是    将中断服务程序的 USART4_IRQHandler 改为  UART4_IRQHandler         

STM32的串口1~3在MDK里面定义为USART1~3.而4和5定义为UART4,5
hkcj 发表于 2013-12-12 19:01 | 显示全部楼层
有可能是中断出了问题     楼主   最好问一问高手吧     看看坛子里其他人的回答吧
ahuzjh 发表于 2013-12-12 21:04 | 显示全部楼层
中断服务名称在启动代码里面找到直接复制过去。就不会出错了,还有配置的时候看到有一个NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;这个8楼说了,你查查配置时候的库函数介绍看看是不是错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

28

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部