打印
[STM32F0]

STM32F072串口3问题,求教各位

[复制链接]
4774|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
根叔威武|  楼主 | 2016-4-13 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近有个项目要用到STM32F071芯片的串口三,以前调试1和2都没有问题,但是配置好串口三以后就开始死机,我说明下情况:
首先使用内部时钟,设置如下:
  RCC_DeInit();// ½«ÍâÉèRCC¼Ä´æÆ÷ÉèÖÃΪȱʡֵ

  RCC_HSICmd(ENABLE);// ʹÄÜÄÚ²¿HSI
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)// µÈ´ýHSIʹÄܳɹ¦
  {
  }
  if(1)
  {
//    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//    FLASH_SetLatency(FLASH_Latency_2);   
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  // ϵͳÄÚ²¿Ê±ÖÓ
    RCC_PCLKConfig(RCC_HCLK_Div1);  // APBʱÖÓÉèÖÃ
    // PLL±¶Æµ£¬8MÄÚ²¿¾§Õñ£¬12±¶Æµºó»ñµÃ48MʱÖÓ
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);               
    // ʹÄÜPLL
    RCC_PLLCmd(ENABLE);
   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) // ±¶Æµ³É¹¦
    {
    }
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }       

然后使用PB10-TX3,PB11-RX3,配置如下:
   // PB10--W_TXD,PB11--W_RXD
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);// ʹÄܶ˿ÚʱÖÓ
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_1); // ¶Ë¿Ú¸´ÓÃÑ¡Ôñ
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_1); // ¶Ë¿Ú¸´ÓÃÑ¡Ôñ
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //ÉèÖö˿ڸ´ÓÃ
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
   GPIO_Init(GPIOB, &GPIO_InitStruct);   
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_4); // ¶Ë¿Ú¸´ÓÃÑ¡Ôñ
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //ÉèÖö˿ڸ´ÓÃ
   GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStruct);  
然后配置串口三相关信息如下:
          USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure; // ÖжϲÎÊý
          USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);
    USART_Cmd(USART3, DISABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    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(USART3, &USART_InitStructure);
          USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
//          USART_ITConfig(USART3,USART_IT_CTS,DISABLE);
    NVIC_InitStructure.NVIC_IRQChannel = USART3_4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
                USART_Cmd(USART3, ENABLE);
我就配置完了串口三,也没有发送接收数据,然后运**死在startup_stm32f072.s中,如下如:
USART3_4_IRQHandler
CEC_CAN_IRQHandler
USB_IRQHandler   

                B       .

                ENDP

                ALIGN
卡在B     .这个位置了,我是完全蒙圈了,搞不明白了,在此求教各位大神怎么回事。还有,经过测试
将    NVIC_Init(&NVIC_InitStructure);屏蔽掉就不会卡死.....谢谢
沙发
yklstudent| | 2016-4-13 21:49 | 只看该作者
void USART3_4_IRQHandler(void)
这个函数写了没?

使用特权

评论回复
板凳
根叔威武|  楼主 | 2016-4-14 08:28 | 只看该作者
yklstudent 发表于 2016-4-13 21:49
void USART3_4_IRQHandler(void)
这个函数写了没?

这个函数没写,我试试去

使用特权

评论回复
地板
根叔威武|  楼主 | 2016-4-14 08:37 | 只看该作者
yklstudent 发表于 2016-4-13 21:49
void USART3_4_IRQHandler(void)
这个函数写了没?

哥们,我定义了个子函数如下
void USART3_4_IRQHandler()
{
       
}
结果是进入串口三中断,卡在这个中断了,我不太明白,我并没有头对串口三进行传接数据,只是初始化了下串口三,为什么会进入这个中断并卡在里面了,谢谢你的耐心回答。

使用特权

评论回复
5
根叔威武|  楼主 | 2016-4-14 09:53 | 只看该作者
现在的情况是,我根本没发送接收数据,为啥能进入串口三中断呢

使用特权

评论回复
6
xmshao| | 2016-4-14 14:22 | 只看该作者
呵呵 这里串口1,2,3应用一样的。

应该是进了TXE中断,因为TXE复位值就是1. 如果没有数据要发时就将TXE中断关闭。
需要发送数据时再开启。

使用特权

评论回复
7
根叔威武|  楼主 | 2016-4-14 16:10 | 只看该作者
哥,按照你说的,我在串口初始化USART_Cmd(USART3, ENABLE);语句后面加入了          USART_ITConfig(USART3,USART_IT_TXE,DISABLE);
关闭了TXE中断,但是还是会进入中断,是我设置的方式不对吗?谢谢

使用特权

评论回复
8
xmshao| | 2016-4-14 17:43 | 只看该作者
本帖最后由 xmshao 于 2016-4-14 18:53 编辑

你这样的话 还是可能没完没了进中断,没机会往下执行你的关闭动作。

关键是自己要清楚在做什么。既然配置TXEIE肯定是为了发送。你适当注意初始化顺序,合理安排程序逻辑。

如果不用TXEIE,就在启动UART不要开启;如果开启了在中断里关闭最靠谱。

使用特权

评论回复
9
根叔威武|  楼主 | 2016-4-15 09:23 | 只看该作者
xmshao 发表于 2016-4-14 17:43
你这样的话 还是可能没完没了进中断,没机会往下执行你的关闭动作。

关键是自己要清楚在做什么。既然配置 ...

是这样子的,一直没完没了进入中断,我再试试改改顺序,谢谢

使用特权

评论回复
10
wtj7603| | 2016-4-15 11:10 | 只看该作者
你进了 USB 中断, 但是没有定义 USB 中断响应函数

使用特权

评论回复
11
neeringstu| | 2016-4-16 22:07 | 只看该作者
根叔威武 发表于 2016-4-14 08:28
这个函数没写,我试试去

是不是进了某个中断跳不出来了啊

使用特权

评论回复
12
xmshao| | 2016-4-16 23:40 | 只看该作者
本帖最后由 xmshao 于 2016-4-17 00:09 编辑

从描述来看,应是进入了哪个中断了。

刚细看了楼主的代码,楼主并没有开启TXE中断,那应该不是前面所说的进TXE中断的原因。
如果确信进了UART中断,那应该是RX中断,楼主可以进一步确认中断标志RXNE/ORE.


另外,你是否有开启别的中断呢?

使用特权

评论回复
13
根叔威武|  楼主 | 2016-4-18 11:17 | 只看该作者
xmshao 发表于 2016-4-16 23:40
从描述来看,应是进入了哪个中断了。

刚细看了楼主的代码,楼主并没有开启TXE中断,那应该不是前面所说的 ...

目前来说是进入中断,但是其他中断我根本没设置,我先在交给原厂的人来处理了,有消息后告诉大家

使用特权

评论回复
14
Garen2| | 2016-4-18 23:06 | 只看该作者
会不会是进了TXE中断

使用特权

评论回复
15
根叔威武|  楼主 | 2016-4-22 20:47 | 只看该作者
问题已经解决了,我的串口三用来连接WIFI模块,但是WIFI模块烧掉了,所以RX端口与地短接了,RX端一直被拉低,就会一直进入串口接收中断,在此感谢大家的回答与帮助,其实除了时钟不一样以外,串口1到4的应用都是一样的。

使用特权

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

本版积分规则

2

主题

13

帖子

0

粉丝