safon 发表于 2019-1-8 12:13:19

STM32F072 USART4工作不正常

我的一个项目用到STM32F072CBT6的4个USART, 其中USART1,usart2,usart3都是用DMA方式发送,中断接收,都可以工作了,唯独USART4既不能中断接收,也不能中断发送,发送能检测到TXE标志,但是不能进入中断。TXD接口也检测不到数据输出。下面是USART4的初始化代码和部分原理图
void Usart4_Init(void)
{
    USART_InitTypeDef   USART_InitStructure;
    GPIO_InitTypeDef    GPIO_InitStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;

    // 开启GPIOA时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // 开启USART4时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);

    // 配置USART4引脚功能复用
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_4);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_4);

    // 配置 USART Tx and Rx 引脚为推挽输出
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 USART4
    USART_InitStructure.USART_BaudRate            = 2400;
    USART_InitStructure.USART_WordLength            = USART_WordLength_9b;
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;
    USART_InitStructure.USART_Parity                = USART_Parity_Even;
    USART_InitStructure.USART_HardwareFlowControl   = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                  = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART4, &USART_InitStructure);

    // 配置 USART4中断
    NVIC_InitStructure.NVIC_IRQChannel          = USART3_4_IRQn;// 中断号
    NVIC_InitStructure.NVIC_IRQChannelPriority= 0;// 中断优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd       = ENABLE;       // 使能中断
    NVIC_Init(&NVIC_InitStructure);                           // 配置中断

    USART_ITConfig(USART4, USART_IT_RXNE, ENABLE); // 使能接收中断
    USART_Cmd(USART4, ENABLE); // 使能外设
}

发送子程序,发送过程,暂时使用了检测发送标志位判断发送完成,一样没有任何进展
uint8usart4_send[64];   // USART发送缓存
uint8 usart4_send_length;   // 发送的数据长度
uint8 usart4_send_count;    // 发送数据长度计数器

uint8 Usart4Send(void)
{
    uint8 i;


    for (i = 0; i < usart4_send_length; i++)
    {
      USART_SendData(USART4, usart4_send);
      while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET);
    }
    OSSemPost(usart4_tx_sem); // 发送USART4发送完成信号
}


中断处理,包含usart3的接收部分
void USART3_4_IRQHandler(void)
{
    OSIntEnter();

    if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET)
    { // 接收中断
      Usart3Sink(USART_ReceiveData(USART3)); // 存储数据
      usart3_finish_delay = 4;
    }

    if (USART_GetFlagStatus(USART4, USART_FLAG_RXNE) != RESET)
    { // 接收中断
      Usart4Sink(USART_ReceiveData(USART4)); // 存储数据
      usart4_finish_delay = 8;
    }

    if (USART_GetFlagStatus(USART4, USART_FLAG_TXE) != RESET)
    { // USART4 发送中断
      USART_ClearFlag(USART4, USART_FLAG_TXE);      // 发送中断处理
    }
   
    if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
    { // 清除溢出中断
      USART_ClearFlag(USART3, USART_FLAG_ORE);
      USART_ReceiveData(USART3); // 虚拟一次读数据
    }
   
    if (USART_GetFlagStatus(USART4, USART_FLAG_ORE) != RESET)
    { // 清除溢出中断
      USART_ClearFlag(USART4, USART_FLAG_ORE);
      USART_ReceiveData(USART4); // 虚拟一次读数据
    }

    OSIntExit();
}

由于一直在调试,代码有点乱,应该不影响诸位大侠的判断。



safon 发表于 2019-1-8 12:13:56

先自己顶一个:)

safon 发表于 2019-1-8 12:16:40

我用VSCode编辑代码,直接粘贴过来效果比较差,诸位大侠见谅。

safon 发表于 2019-1-8 12:40:04

这个代码中没有打开发送中断,之前用         USART_ITConfig(USART4, USART_IT_TC, ENABLE)和        USART_ITConfig(USART4, USART_IT_TXE, ENABLE);指令 打开过,依然无法进入接收或发送中断

发表于 2019-1-8 14:09:57

从代码上看,没有问题。建议在线仿真一下,看一下寄存器IO配置是否正确。可以使用STM32CubeMX生成测试代码测试。

Kevin201707 发表于 2019-1-8 14:13:18

先顶一下,等待大神答案

sky_han 发表于 2019-1-8 14:19:42

USART_ITConfig(USART4, USART_IT_TXE, ENABLE);你应该配置这个,发送中断才能使能,如果这个也做了,检查下这个系统的中断优先级分组

safon 发表于 2019-1-8 14:42:52

问题发现了,犯了一个超级低级的错误。初始化代码没有调用。害的我昨天调试了一个通宵。
谢谢各位的帮助。现在可以进入中断了。

safon 发表于 2019-1-8 14:44:00

sky_han 发表于 2019-1-8 14:19
USART_ITConfig(USART4, USART_IT_TXE, ENABLE);你应该配置这个,发送中断才能使能,如果这个也做了,检查 ...

STM32F072应该没有中断优先级分组。

safon 发表于 2019-1-8 14:45:22

安 发表于 2019-1-8 14:09
从代码上看,没有问题。建议在线仿真一下,看一下寄存器IO配置是否正确。可以使用STM32CubeMX生成测试代码 ...

谢谢你的帮助,问题已经解决。超级低级的错误。初始化代码忘记调用
页: [1] 2
查看完整版本: STM32F072 USART4工作不正常