打印

STM32F103 UART4的问题

[复制链接]
12691|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 这个是芯片型号

使用特权

评论回复
5
star143133|  楼主 | 2012-4-10 16:33 | 只看该作者
有人能帮我下么

使用特权

评论回复
6
香水城| | 2012-4-10 17:13 | 只看该作者
程序运行后能进中断函数吗?

使用特权

评论回复
7
acgean| | 2012-4-11 09:08 | 只看该作者
我看,找调试器帮你吧

使用特权

评论回复
8
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);
*/
很明显错了

使用特权

评论回复
9
yinyangdianzi| | 2012-4-11 14:54 | 只看该作者
这个问题很多人问了,,,STM32FXX某个型号,到底有木有UART 4啊。。。。见过N多人问这个问题

介意仔细看看手册

使用特权

评论回复
10
yzzly| | 2012-4-11 15:09 | 只看该作者
多半是没有UART4中断函数造成的,中断走飞了!

使用特权

评论回复
11
lai832| | 2012-4-12 09:32 | 只看该作者
支持8楼

调用,
及你的函数对不上

使用特权

评论回复
12
jeloc218| | 2012-8-14 10:32 | 只看该作者
最近我也在弄PC10 PC11的串口3和串口4,用串口4时,发现问题和你一样,后来查了一下,问题还是出在中断服务函数上面,启动文件startup_stm32f10x_hd.s里有个伪定义: DCD     UART4_IRQHandler      ; UART4也就是说,所以你的中断服务函数不是USART4_IRQHandler啦,我改过后就可以近终端正常发送和接收了

使用特权

评论回复
13
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



使用特权

评论回复
14
捡漏王子| | 2012-8-14 10:35 | 只看该作者
学习一下

使用特权

评论回复
15
cool33777612| | 2013-9-9 13:05 | 只看该作者
jeloc218 发表于 2012-8-14 10:32
最近我也在弄PC10 PC11的串口3和串口4,用串口4时,发现问题和你一样,后来查了一下,问题还是出在中断服务 ...

你好 可以具体说一下么。
伪定义?我的UART4只能发送 不能进入接收中断 不知道什么原因 使用的是3.5的hd.s

使用特权

评论回复
16
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

使用特权

评论回复
17
hkcj| | 2013-12-12 19:01 | 只看该作者
有可能是中断出了问题     楼主   最好问一问高手吧     看看坛子里其他人的回答吧

使用特权

评论回复
18
ahuzjh| | 2013-12-12 21:04 | 只看该作者
中断服务名称在启动代码里面找到直接复制过去。就不会出错了,还有配置的时候看到有一个NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;这个8楼说了,你查查配置时候的库函数介绍看看是不是错误。

使用特权

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

本版积分规则

0

主题

28

帖子

1

粉丝