打印
[STM32F0]

F091 使用PA0和PA1配置成USART4,发不出数据

[复制链接]
396|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gongche|  楼主 | 2019-3-8 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
F091 使用PA0和PA1配置成USART4,发不出数据
沙发
songqian17| | 2019-3-8 16:03 | 只看该作者

楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
gongche|  楼主 | 2019-3-8 16:07 | 只看该作者
我最近使用STM32F091做一个项目,现在配置PA0、PA1做USART4,串口数据发不出东西,从MCU复位到全速跑,就发出个0xFF的电脑上,

但是用同一套的配置代码配置PD5、PD6成USART2,是能成功收和发数据。

现在不知道问题出现在哪里,大神们给点意见。

使用特权

评论回复
地板
huwr| | 2019-3-8 16:10 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
gongche|  楼主 | 2019-3-8 16:14 | 只看该作者

void uart4_init(void)

{
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        /* Enable the USART Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART3_8_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;   /* 最高优先级*/
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /* Configure USART Tx as alternate function push-pull */
        vGpioInit(        RCC_AHBPeriph_GPIOA,
                                GPIOA,
                                GPIO_Pin_0,
                                
                                GPIO_Mode_AF,
                                GPIO_Speed_50MHz,
                                GPIO_OType_PP,
                                GPIO_PuPd_UP);

        /* Configure USART Rx as alternate function push-pull */
        vGpioInit(        RCC_AHBPeriph_GPIOA,
                                GPIOA,
                                GPIO_Pin_1,
                                
                                GPIO_Mode_AF,
                                GPIO_Speed_50MHz,
                                GPIO_OType_OD,
                                GPIO_PuPd_UP);

        /* Connect PXx to USARTx_Tx */
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_4);

        /* Connect PXx to USARTx_Rx */
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_4);

    /* Enable USART clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);

        USART_InitStructure.USART_BaudRate = 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 configuration */
        USART_Init(USART4, &USART_InitStructure);

        USART_ITConfig(USART4, USART_IT_RXNE, ENABLE);

        /* Enable USART */
        USART_Cmd(USART4, ENABLE);
}


bool uart4_send_byte(UINT8  data)
{
        UINT16 UartTimeOutCount=0xFFFF;
        
        /* Loop until transmit data register is empty */
        while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET)
        {
                UartTimeOutCount--;
                if(UartTimeOutCount == 0)
                {
                        //break;
                        return FALSE;
                }
        }

    /* Place your implementation of fputc here */
        /* e.g. write a character to the USART */
        USART_SendData(USART4, (UINT8 ) data);

    return TRUE;
}


void uart4_send_string(UINT8 *data, UINT16 len)
{
        UINT16 i;

        for(i=0;i<len;i++)
        {
                bt_uart_send_byte((UINT8 )(*(data+i)));
        }
}


void USART3_8_IRQHandler(void)
{
        if(USART_GetITStatus(UART_BT, USART_IT_RXNE) != RESET)
        {
                 uart4_send_byte(USART_ReceiveData(USART4));
        }
}

使用特权

评论回复
6
heweibig| | 2019-3-8 16:17 | 只看该作者
配置成其他端口, 就能正常收发数据

使用特权

评论回复
7
chuxh| | 2019-3-8 16:20 | 只看该作者

串口设计没有问题, 就是端口设计了.

使用特权

评论回复
8
lizye| | 2019-3-8 16:23 | 只看该作者

注意端口的外设功能配置, 端口时钟等

使用特权

评论回复
9
gongche|  楼主 | 2019-3-8 17:39 | 只看该作者

IO口的配置如下,但是
void vGpioInit( uint32_t RCC_AHB1Periph,
                    GPIO_TypeDef* GPIOx,
                    uint32_t GPIO_Pin,
                    GPIOMode_TypeDef GPIO_Mode,
                    GPIOSpeed_TypeDef GPIO_Speed,
                    GPIOOType_TypeDef GPIO_OType,
                    GPIOPuPd_TypeDef GPIO_PuPd)
{
        GPIO_InitTypeDef  GPIO_InitStructure;

        GPIO_StructInit(&GPIO_InitStructure);

        RCC_AHBPeriphClockCmd(RCC_AHB1Periph, ENABLE);

        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed;
        GPIO_InitStructure.GPIO_OType = GPIO_OType;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd;

        GPIO_Init(GPIOx, &GPIO_InitStructure);
}

使用特权

评论回复
10
gongche|  楼主 | 2019-3-8 17:41 | 只看该作者
引脚复用、引脚时钟打开、USART的时钟都有打开了

使用特权

评论回复
11
huanghuac| | 2019-3-8 17:44 | 只看该作者

中断开错了?
NVIC_InitStructure.NVIC_IRQChannel = USART3_8_IRQn;
不是应该是USART4的吗?

使用特权

评论回复
12
gongche|  楼主 | 2019-3-8 17:47 | 只看该作者
中断暂时不讨论,现在主要是USART4口没数据发送出来

使用特权

评论回复
13
bqyj| | 2019-3-8 17:51 | 只看该作者
你确定超时设定值合适:
while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET)
        {
                UartTimeOutCount--;
                if(UartTimeOutCount == 0)
                {
                        //break;
                        return FALSE;
                }
        }

115200的波特率,发送一个字节大约需86us

使用特权

评论回复
14
gongche|  楼主 | 2019-3-8 17:54 | 只看该作者
找到问题了,发送函数那里调错了函数,调到了USART2的发送函数

使用特权

评论回复
15
gongche|  楼主 | 2019-3-8 17:58 | 只看该作者
有道理!移植别人的代码都没留意这个

使用特权

评论回复
16
guanjiaer| | 2019-4-1 11:46 | 只看该作者
io配置那写好了吗

使用特权

评论回复
17
heimaojingzhang| | 2019-4-1 11:52 | 只看该作者
把连接断开 直接用示波器量量看有没有波形

使用特权

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

本版积分规则

768

主题

9410

帖子

2

粉丝