打印
[STM32F0]

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

[复制链接]
1870|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chh44|  楼主 | 2016-10-26 22:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

各位大侠,我最近使用STM32F091做一个项目,现在配置PA0、PA1做USART4,串口数据发不出东西,从MCU复位到全速跑,就发出个0xFF的电脑上,

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

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

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));
        }
}


沙发
airwill| | 2016-10-27 07:20 | 只看该作者
配置成其他端口, 就能正常收发数据
那么串口设计没有问题, 就是端口设计了.
注意端口的外设功能配置, 端口时钟等

使用特权

评论回复
板凳
chh44|  楼主 | 2016-10-27 08:52 | 只看该作者
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);
}

使用特权

评论回复
地板
chh44|  楼主 | 2016-10-27 08:53 | 只看该作者
airwill 发表于 2016-10-27 07:20
配置成其他端口, 就能正常收发数据
那么串口设计没有问题, 就是端口设计了.
注意端口的外设功能配置, 端口 ...

引脚复用、引脚时钟打开、USART的时钟都有打开了

使用特权

评论回复
5
ldskendy| | 2016-10-27 09:52 | 只看该作者
中断开错了?
NVIC_InitStructure.NVIC_IRQChannel = USART3_8_IRQn;
不是应该是USART4的吗?

使用特权

评论回复
6
chh44|  楼主 | 2016-10-27 09:58 | 只看该作者
ldskendy 发表于 2016-10-27 09:52
中断开错了?
NVIC_InitStructure.NVIC_IRQChannel = USART3_8_IRQn;
不是应该是USART4的吗? ...

中断暂时不讨论,现在主要是USART4口没数据发送出来

使用特权

评论回复
7
ldskendy| | 2016-10-27 10:03 | 只看该作者
你确定超时设定值合适:
while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET)
        {
                UartTimeOutCount--;
                if(UartTimeOutCount == 0)
                {
                        //break;
                        return FALSE;
                }
        }

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

使用特权

评论回复
8
chh44|  楼主 | 2016-10-27 10:14 | 只看该作者
找到问题了,发送函数那里调错了函数,调到了USART2的发送函数

如此低级的问题搞了一晚上

使用特权

评论回复
9
chh44|  楼主 | 2016-10-31 10:04 | 只看该作者
ldskendy 发表于 2016-10-27 10:03
你确定超时设定值合适:
while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET)
        {

有道理!移植别人的代码都没留意这个

使用特权

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

本版积分规则

个人签名:Hello world!

4

主题

60

帖子

2

粉丝