打印

STM32之printf调用usart2

[复制链接]
7246|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小弟在项目中调用库函数printf,测试usart1,3,4都没问题,但是在用串口2的时候,调用fputc函数的时候进入了default_handler这里出不来了,不知道啥原因,求高手指点下。
static void Uart_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        USART_ClockInitTypeDef USART_ClockInitStructure;
       
        //使能串口2,PA,AFIO总线
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
                                               RCC_APB2Periph_AFIO,
                        ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        /* A2 USART2_Tx */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//GPIO_Mode_IN_FLOATING;//               
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* A3 USART2_Rx  */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        USART_InitStructure.USART_BaudRate =9600;// 57600;//115200;
        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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

        USART_ClockInit(USART2, &USART_ClockInitStructure);
        USART_Init(USART2, &USART_InitStructure);
        /* Enable the USARTx */
        USART_Cmd(USART2, ENABLE);
        //串口1使用接收中断
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
/*****************************************/
int fputc(int ch, FILE *f)
{
   FlagStatus sta;
    USART2->DR = (u8) ch;

        sta=USART_GetFlagStatus(USART2, USART_FLAG_TXE);
    while(sta == RESET)
    {  }
    return ch;
}
配置代码和其它串口一样,没问题的。调用fputc的时候,运行到这里:sta=USART_GetFlagStatus(USART1, USART_FLAG_TXE);就出不来了,但是单步进去这个函数是没问题的,单步后退出,return ch后,就死在default_handler这里,不知道啥原因了。难道不能调用串口2的?
沙发
IJK| | 2013-8-29 14:07 | 只看该作者
可以看看串口2 的相关标志位是否被清除掉

使用特权

评论回复
板凳
oliver123|  楼主 | 2013-8-29 14:41 | 只看该作者
IJK 发表于 2013-8-29 14:07
可以看看串口2 的相关标志位是否被清除掉

我看了下,sr中的值没有变。而且我现在也写了直接发送的函数,还是出现这种情况。不知道啥原因了。郁闷。
好像我吧sta=USART_GetFlagStatus(USART2, USART_FLAG_TXE);这段代码屏蔽掉也不行啊。 运行USART2->DR = (u8) ch;的时候,用示波器看到有信号发送出来。

使用特权

评论回复
地板
oliver123|  楼主 | 2013-8-30 10:46 | 只看该作者
自己顶下啊

使用特权

评论回复
5
IJK| | 2013-8-30 11:21 | 只看该作者
这么写是有问题的,应该用 do  while吧:
      sta=USART_GetFlagStatus(USART2, USART_FLAG_TXE);
     while(sta == RESET)
    {  }

使用特权

评论回复
6
oliver123|  楼主 | 2013-8-30 14:01 | 只看该作者
找到问题了,Default_Handler是定义了中断但是没有重写就会进来。问题出在这里。
下面是我找到的一点资料,希望对有碰到类似这样问题的人有用。
=================================================================
定义了Default_Handler, 这个是作为其他所有中断的默认处理函数,作用就是死循环,所以你假如开启了某个中断,请按照这里面的中断函数名给它写中断
处理函数,例如串口中断处理函数名是 USART1_IRQHandler,你开了串口中断,如果不重写USART1_IRQHandler,就默认执行Default_Handler,死循环了。而如
果你有重写,那么中断向量表中的处理函数的地址就会更新为你自己写的那个函数的地址了。为什么会这样呢?因为此文件的末尾用了类似这样的语句:

    .weak    USART1_IRQHandler
    .thumb_set USART1_IRQHandler,Default_Handler
它给中断处理函数提供了弱(weak)别名(Default_Handler),如果不重写,中断了默认执行Default_Handler,如果重写了,因为是弱别名,所以会被你写的同名
函数覆盖。

使用特权

评论回复
7
luenqing| | 2013-8-30 14:09 | 只看该作者
oliver123 发表于 2013-8-30 14:01
找到问题了,Default_Handler是定义了中断但是没有重写就会进来。问题出在这里。
下面是我找到的一点资料, ...

请教一下:同时打开USART1,USART2的中断会有影响吗?

使用特权

评论回复
8
oliver123|  楼主 | 2013-9-14 14:41 | 只看该作者
luenqing 发表于 2013-8-30 14:09
请教一下:同时打开USART1,USART2的中断会有影响吗?

没影响的。进入中断后检测不同的标志,可以知道是哪个串口发生的中断。根据这个来进行相应的处理

使用特权

评论回复
9
小班儿| | 2014-11-27 09:48 | 只看该作者
受教了

使用特权

评论回复
10
15113484470| | 2014-12-24 14:00 | 只看该作者
楼主,帮我看看死到这儿是啥情况

使用特权

评论回复
11
冒泡的鱼儿| | 2014-12-30 21:33 | 只看该作者
支持一下

使用特权

评论回复
12
329547875| | 2015-8-31 17:23 | 只看该作者
楼主直接调用串口2/3/4的printf?
没有报错呀?

使用特权

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

本版积分规则

7

主题

33

帖子

0

粉丝