OpenEdv-开源电子网

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

STM32串口5死在fputc函数里。

[复制链接]

8

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2014-9-7
在线时间
18 小时
发表于 2015-11-4 10:31:05 | 显示全部楼层 |阅读模式
5金钱

int fputc(int ch, FILE *f)
{      
while((UART5->SR&0X40)==0);
    UART5->DR = (u8) ch;      
return ch;
}
#endif 

int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
   
    return ch;
}
int GetKey (void)  { 

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/
 
#if EN_USART1_RX   

u8 USART_RX_BUF[USART_REC_LEN];     

u16 USART_RX_STA=0;      
  
void uart_init(u32 bound){
  GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART5|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); 
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
  GPIO_Init(GPIOC, &GPIO_InitStructure);
   
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);  


  NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
  

USART_InitStructure.USART_BaudRate = bound;
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(UART5, &USART_InitStructure);
  USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
  USART_Cmd(UART5, ENABLE);                  

}

void UART5_IRQHandler(void)                
{
u8 Res;
#if SYSTEM_SUPPORT_OS 
OSIntEnter();    
#endif
if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  
{
Res =USART_ReceiveData(UART5); 

if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000; 
}
else //????????0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}  
}
}    
     } 
#if SYSTEM_SUPPORT_OS 
OSIntExit();    
#endif

#endif

仿真时发现一直死在fputc函数里。

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-4 11:10:05 | 显示全部楼层
两个fputc函数?

直接用原子哥printf函数多好,方便稳定
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

8

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2014-9-7
在线时间
18 小时
 楼主| 发表于 2015-11-4 11:15:34 | 显示全部楼层
int fputc(int ch, FILE *f)
{      
while((UART5->SR&0X40)==0);
    UART5->DR = (u8) ch;      
return ch;
}

是死在这个函数里,下面的函数被注释掉的。
回复

使用道具 举报

8

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2014-9-7
在线时间
18 小时
 楼主| 发表于 2015-11-4 11:23:56 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
按照原子哥个一个程序改写的。
int fputc(int ch, FILE *f) 
{       
while((UART5->SR&0X40)==0); 
    UART5->DR = (u8) ch;       
return ch; 
}
死在这个里面了,下面的那个是被注释掉的
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-4 11:30:40 | 显示全部楼层
回复【4楼】342785896:
---------------------------------
这里没有问题,查一下其他地方特别是配置吧

库函数不熟,提醒楼主重新排版一下吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

8

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2014-9-7
在线时间
18 小时
 楼主| 发表于 2015-11-4 13:01:33 | 显示全部楼层
回复【5楼】龙之谷:
---------------------------------
好的,谢谢
回复

使用道具 举报

8

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2014-9-7
在线时间
18 小时
 楼主| 发表于 2015-11-4 18:05:12 | 显示全部楼层
http://www.openedv.com/posts/list/41157.htm
是在这个帖子里找到的答案,不能正常使用串口的解决办法如下:
将:RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART5|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); 
改为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); //????USART1??GPIOA?±??
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);

这样就接收和发送正常了。
谢谢正点原子提供的平台。我等菜鸟还有很长路走哈。
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2020-1-26
在线时间
11 小时
发表于 2021-4-5 14:11:17 | 显示全部楼层
已解决,我的当时也是这个问题,后来发现是串口初始化之前调用了printf函数,导致一直没有检测到发送完成标志位,卡死在fputc函数的等待循环里。
望采纳,有错误地方欢迎指正
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 23:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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