打印

USART2无法调通,求助

[复制链接]
5734|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
40750209|  楼主 | 2013-8-5 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 40750209 于 2013-8-6 10:36 编辑

USART2无法调通,配置串口2的程序如下所示,看有没有问题,求大神指点。

usart.c文件:

#include "usart1.h"
#include <stdarg.h>

void USART1_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);   

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
         
        /* USART2 mode config */
        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(USART2, &USART_InitStructure);
        USART_Cmd(USART2, ENABLE);
}


int fputc(int ch, FILE *f)
{
        /* 将Printf内容发往串口 */
        USART_SendData(USART2, (unsigned char) ch);

        while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);        
        return (ch);
}


static char *itoa(int value, char *string, int radix)
{
        int     i, d;
        int     flag = 0;
        char    *ptr = string;
        
        /* This implementation only works for decimal numbers. */
        if (radix != 10)
        {
            *ptr = 0;
            return string;
        }
        
        if (!value)
        {
            *ptr++ = 0x30;
            *ptr = 0;
            return string;
        }
        
        /* if this is a negative value insert the minus sign. */
        if (value < 0)
        {
            *ptr++ = '-';
        
            /* Make the value positive. */
            value *= -1;
        }
        
        for (i = 10000; i > 0; i /= 10)
        {
            d = value / i;
        
            if (d || flag)
            {
                *ptr++ = (char)(d + 0x30);
                value -= (d * i);
                flag = 1;
            }
        }
        
        /* Null terminate the string. */
        *ptr = 0;
        
        return string;

} /* NCL_Itoa */


void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
        const char *s;
        int d;   
        char buf[16];
        
        va_list ap;
        va_start(ap, Data);
        
        while ( *Data != 0)     // 判断是否到达字符串结束符
        {                                                         
                if ( *Data == 0x5c )  //'\'
        {                                                                          
        switch ( *++Data )
        {
                case 'r':                                                                  //回车符
                        USART_SendData(USARTx, 0x0d);
                        Data ++;
                break;
               
                case 'n':                                                                  //换行符
                        USART_SendData(USARTx, 0x0a);        
                        Data ++;
                break;
               
                default:
                        Data ++;
                break;
        }                        
        }
        else if ( *Data == '%')
        {                                                                          //
        switch ( *++Data )
        {                                
                case 's':                                                                                  //字符串
                        s = va_arg(ap, const char *);
        for ( ; *s; s++)
        {
                USART_SendData(USARTx,*s);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
                Data++;
                break;
        
        case 'd':                                                                                //十进制
        d = va_arg(ap, int);
        itoa(d, buf, 10);
        for (s = buf; *s; s++)
        {
                USART_SendData(USARTx,*s);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
        Data++;
        break;
                 default:
                                Data++;
                    break;
        }                 
        } /* end of else if */
        else USART_SendData(USARTx, *Data++);
        while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
}
/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/

Main.c文件:

#include "stm32f10x.h"
#include "usart1.h"


int main(void)
{        
        
        USART1_Config();

        
        printf("\r\n this is a printf demo \r\n");

        printf("\r\n 欢迎使用 \r\n");
               
        USART1_printf(USART2, "\r\n This is a USART1_printf demo \r\n");
        
        USART1_printf(USART2, "\r\n ("__DATE__ " - " __TIME__ ") \r\n");

        for(;;)
        {
               
        }
}




沙发
40750209|  楼主 | 2013-8-5 16:17 | 只看该作者
printf到usart2

int fputc(int ch, FILE *f)
{
        /* 将Printf内容发往串口 */
        USART_SendData(USART2, (unsigned char) ch);
//        while (!(USART1->SR & USART_FLAG_TXE));
        while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);       
        return (ch);
}

使用特权

评论回复
板凳
40750209|  楼主 | 2013-8-5 16:19 | 只看该作者
使用的是STM32F103V

使用特权

评论回复
地板
499734424| | 2013-8-5 16:38 | 只看该作者
USART_SendData(USART2, (unsigned char) ch);
//        while (!(USART1->SR & USART_FLAG_TXE));

使用特权

评论回复
5
wll_2012| | 2013-8-5 17:09 | 只看该作者
无法调通?遇到的问题、现象是什么呢?

使用特权

评论回复
6
万年龟| | 2013-8-5 18:07 | 只看该作者
是不是没有开启AFIO时钟呢?

使用特权

评论回复
7
cjhk| | 2013-8-5 18:57 | 只看该作者
有这个可能   楼主  

使用特权

评论回复
8
菜鸟宅男| | 2013-8-5 19:22 | 只看该作者
没有remap也需要开启AFIO时钟吗?

使用特权

评论回复
9
wangyueming| | 2013-8-5 20:35 | 只看该作者
4楼正解!

使用特权

评论回复
10
40750209|  楼主 | 2013-8-6 08:50 | 只看该作者
wll_2012 发表于 2013-8-5 17:09
无法调通?遇到的问题、现象是什么呢?

我的程序输出打印字符串到PC上,用串口1可以调通,修改程序中的参数,换串口2就不行,想请教一下,哪里没配置好,还是怎么回事

使用特权

评论回复
11
40750209|  楼主 | 2013-8-6 08:52 | 只看该作者
499734424 发表于 2013-8-5 16:38
USART_SendData(USART2, (unsigned char) ch);
//        while (!(USART1->SR & USART_FLAG_TXE));

四楼大神什么意思?没看明白?

使用特权

评论回复
12
499734424| | 2013-8-6 09:07 | 只看该作者
都标红了
你用的是串口2
而不是1

使用特权

评论回复
13
40750209|  楼主 | 2013-8-6 09:12 | 只看该作者
499734424 发表于 2013-8-6 09:07
都标红了
你用的是串口2
而不是1

这句话不是被我注释掉了吗,有影响吗?

使用特权

评论回复
14
499734424| | 2013-8-6 09:25 | 只看该作者
40750209 发表于 2013-8-6 09:12
这句话不是被我注释掉了吗,有影响吗?


我没看到注释,以为是你用串口2,却在等待串口1标志

使用特权

评论回复
15
wll_2012| | 2013-8-6 09:26 | 只看该作者
40750209 发表于 2013-8-6 08:50
我的程序输出打印字符串到PC上,用串口1可以调通,修改程序中的参数,换串口2就不行,想请教一下,哪里没 ...

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

使用特权

评论回复
16
499734424| | 2013-8-6 09:47 | 只看该作者
这次仔细看了一下
输出用的是复用输出GPIO_Mode_AF_PP
应该需要开启复用时钟,LZ你试试看行不行
其他我也没发现什么问题

使用特权

评论回复
17
40750209|  楼主 | 2013-8-6 09:57 | 只看该作者
499734424 发表于 2013-8-6 09:47
这次仔细看了一下
输出用的是复用输出GPIO_Mode_AF_PP
应该需要开启复用时钟,LZ你试试看行不行

我试了15楼的知道,加上开启复用时钟,还是没有效果,谢谢你啊
语句是这个:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

使用特权

评论回复
18
499734424| | 2013-8-6 10:03 | 只看该作者
那问题可能不是在配置问题上,楼主,方便的话上工程,让大家全局的看看

使用特权

评论回复
19
40750209|  楼主 | 2013-8-6 10:37 | 只看该作者
499734424 发表于 2013-8-6 10:03
那问题可能不是在配置问题上,楼主,方便的话上工程,让大家全局的看看

main文件和usart文件已经发上来了,求帮忙看看

使用特权

评论回复
20
499734424| | 2013-8-6 10:52 | 只看该作者
main怎么没有看到
配置系统时钟

使用特权

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

本版积分规则

1

主题

14

帖子

1

粉丝