硬汉嵌入式论坛

 找回密码
 立即注册
查看: 900|回复: 6
收起左侧

[UART] STM32H750VBT6 UART7 和 UART8 不能通讯

[复制链接]

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2024-8-11 14:57:30 | 显示全部楼层 |阅读模式
STM32H750VBT6 前6个uart 都能正常通讯,UART7 和 UART8 不能通讯,实在找不出原因了,请群里的高手们指点一二 !相关代码如下:
时钟初始化:



void SystemClock_Init(uint8_t Fosc)
{
        RCC_ClkInitTypeDef RCC_ClkInitStruct;
        RCC_OscInitTypeDef RCC_OscInitStruct;
        HAL_StatusTypeDef ret = HAL_OK;

        /*!< Supply configuration update enable */
        MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

        /* The voltage scaling allows optimizing the power consumption when the device is
         clocked below the maximum system frequency, to update the voltage scaling value
         regarding system frequency refer to product datasheet.  */
        __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

        while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}
               
        /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
        __HAL_RCC_D2SRAM3_CLK_ENABLE();

        /* Enable HSE Oscillator and activate PLL with HSE as source */
        RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
        RCC_OscInitStruct.HSEState = RCC_HSE_ON;
        RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
        RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
        RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
        RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

        if(Fosc == 25)   //25MHz
        {
                RCC_OscInitStruct.PLL.PLLM = 5;
                RCC_OscInitStruct.PLL.PLLN = 160;
        }
        else if(Fosc == 8)  //8MHz
        {
                RCC_OscInitStruct.PLL.PLLM = 2;
                RCC_OscInitStruct.PLL.PLLN = 200;
        }
        RCC_OscInitStruct.PLL.PLLP = 2;
        RCC_OscInitStruct.PLL.PLLR = 2;
        RCC_OscInitStruct.PLL.PLLQ = 4;

        RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
        RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
        ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
        if(ret != HAL_OK)
        {
                while(1) { ; }
        }

        /* Select PLL as system clock source and configure  bus clocks dividers */
        RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1
        | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
        RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
        RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
        RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
        RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
        RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
        RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
        RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
        ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
        if(ret != HAL_OK)
        {
                while(1) { ; }
        }
       
        /*activate CSI clock mondatory for I/O Compensation Cell*/  
        __HAL_RCC_CSI_ENABLE() ;

        /* Enable SYSCFG clock mondatory for I/O Compensation Cell */
        __HAL_RCC_SYSCFG_CLK_ENABLE() ;

        /* Enables the I/O Compensation Cell */   
        HAL_EnableCompensationCell();
}





#define UART_LSR_RDR  (1<<5)    //接收完成标志
#define UART_LSR_THRE (1<<6)    //发送完成标志

#define SEND_BUF1 (USART1->TDR)
#define RECV_BUF1 (USART1->RDR)
#define USART1_SR (USART1->ISR)

#define SEND_BUF2 (USART2->TDR)
#define RECV_BUF2 (USART2->RDR)
#define USART2_SR (USART2->ISR)

#define SEND_BUF3 (USART3->TDR)
#define RECV_BUF3 (USART3->RDR)
#define USART3_SR (USART3->ISR)

#define SEND_BUF6 (USART6->TDR)
#define RECV_BUF6 (USART6->RDR)
#define UART6_SR (USART6->ISR)

#define SEND_BUF7 (UART7->TDR)
#define RECV_BUF7 (UART7->RDR)
#define UART7_SR (UART7->ISR)

#define SEND_BUF8 (UART8->TDR)
#define RECV_BUF8 (UART8->RDR)
#define UART8_SR (UART8->ISR)


#define SEND_BUF4 (UART4->TDR)
#define RECV_BUF4 (UART4->RDR)
#define UART4_SR  (UART4->ISR)

#define SEND_BUF5 (UART5->TDR)
#define RECV_BUF5 (UART5->RDR)
#define UART5_SR  (UART5->ISR)

#define LP_SEND_BUF1 (LPUART1->TDR)
#define LP_RECV_BUF1 (LPUART1->RDR)
#define LP_UART1_SR  (LPUART1->ISR)


typedef struct
{
        void (*U1TXOver)(void);                       //UART1 发送完成
        void (*U1RXOperation)(unsigned char RxData);  //UART1 接收回调
        void (*U2TXOver)(void);
        void (*U2RXOperation)(unsigned char RxData);  //UART2 接收回调
        void (*U3TXOver)(void);
        void (*U3RXOperation)(unsigned char RxData);  //UART3 接收回调
        void (*U6TXOver)(void);
        void (*U6RXOperation)(unsigned char RxData);  //UART6 接收回调       
        void (*U4TXOver)(void);
        void (*U4RXOperation)(unsigned char RxData);  //UART4 接收回调
        void (*U5TXOver)(void);
        void (*U5RXOperation)(unsigned char RxData);  //UART5 接收回调
        void (*U7TXOver)(void);
        void (*U7RXOperation)(unsigned char RxData);  //UART7 接收回调       
        void (*U8TXOver)(void);
        void (*U8RXOperation)(unsigned char RxData);  //UART8 接收回调       
        void (*LUTXOver)(void);
        void (*LURXOperation)(unsigned char RxData);  //LPUART 接收回调
}_USART_ISR_;
extern _USART_ISR_        Usart_ISR;



_USART_ISR_        Usart_ISR;
UART_HandleTypeDef Uart1_Handle;
UART_HandleTypeDef Uart2_Handle;
UART_HandleTypeDef Uart3_Handle;

UART_HandleTypeDef Uart6_Handle;
UART_HandleTypeDef Uart7_Handle;
UART_HandleTypeDef Uart8_Handle;

UART_HandleTypeDef Uart4_Handle;
UART_HandleTypeDef Uart5_Handle;

void USART1_IRQHandler(void)
{       
        if(USART1_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U1RXOperation != NULL) Usart_ISR.U1RXOperation(RECV_BUF1);                
        }
       
        HAL_UART_IRQHandler(&Uart1_Handle);
}

void USART1_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        /*
   下面这个配置可以注释掉,预留下来是为了方便以后选择其它时钟使用
   默认情况下,USART1和USART6选择的PCLK2,时钟100MHz。
    USART2,USART3,UART4,UART5,UART6,UART7和UART8选择的时钟是PLCK1,时钟100MHz。
  */
       
        RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
       
        RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART16;      
        RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
  HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);   
       
        RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit2;
        RCC_PeriphClkInit2.PeriphClockSelection =         RCC_PERIPHCLK_USART234578;   
        RCC_PeriphClkInit2.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit2);   


        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U1TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U1RXOperation = RxFunction;  //接收数据函数
       
        __GPIOA_CLK_ENABLE();      //使能GPIOA时钟
        __GPIOB_CLK_ENABLE();      //使能GPIOB时钟
        __GPIOC_CLK_ENABLE();      //使能GPIOA时钟
        __GPIOD_CLK_ENABLE();      //使能GPIOB时钟
        __GPIOE_CLK_ENABLE();      //使能GPIOA时钟

       
        __USART1_CLK_ENABLE();     //
        __USART2_CLK_ENABLE();
        __USART3_CLK_ENABLE();
        __USART4_CLK_ENABLE();
        __USART5_CLK_ENABLE();
       
        __USART6_CLK_ENABLE();
        __USART7_CLK_ENABLE();
        __USART8_CLK_ENABLE();
       
        //USART1端口配置       
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  //快速
        GPIO_InitStruct.Pull = GPIO_PULLUP;            //上拉
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1;   //复用功能
       
        GPIO_InitStruct.Pin = GPIO_PIN_9; //UASRT1对应IO口PA9 TX
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;        //复用推挽模式
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化PA9
       
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  //快速
        GPIO_InitStruct.Pull = GPIO_PULLUP;            //上拉
        GPIO_InitStruct.Alternate = GPIO_AF4_USART1;   //复用功能
       
        GPIO_InitStruct.Pin = GPIO_PIN_15; //UASRT1对应IO口PB15  RX
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;;   //复用推挽模式
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);        //初始化PB15  RX
       
        //------------------------

   //USART1 初始化设置
        Uart1_Handle.Instance          = USART1;                //串口1
        Uart1_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart1_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart1_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart1_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart1_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart1_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart1_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart1_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart1_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart1_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(USART1_IRQn, 4, 1);
        HAL_NVIC_EnableIRQ(USART1_IRQn);
}


void USART1_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart1_Handle, (uint8_t*)buff, Size);
}

//重定义fputc函数,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{           
        while((USART1_SR&UART_LSR_THRE)==0);        //等待发送完成  
        SEND_BUF1 = (u8) ch;
       
        return ch;
}


void USART2_IRQHandler(void)
{       
        if(USART2_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U2RXOperation != NULL) Usart_ISR.U2RXOperation(RECV_BUF2);                
        }
       
        HAL_UART_IRQHandler(&Uart2_Handle);
}

void USART2_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U2TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U2RXOperation = RxFunction;  //接收数据函数
       
//        __HAL_RCC_USART2_CLK_ENABLE();

   // __HAL_RCC_GPIOA_CLK_ENABLE();
   // __HAL_RCC_GPIOD_CLK_ENABLE();
    /**USART2 GPIO Configuration
    PA3     ------> USART2_RX
    PD5     ------> USART2_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
               
       
       
   //USART2 初始化设置
        Uart2_Handle.Instance          = USART2;                //串口1
        Uart2_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart2_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart2_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart2_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart2_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart2_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart2_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart2_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart2_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart2_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(USART2_IRQn, 4, 2);
        HAL_NVIC_EnableIRQ(USART2_IRQn);
}


void USART2_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart2_Handle, (uint8_t*)buff, Size);
}

void USART3_IRQHandler(void)
{       
        if(USART3_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U3RXOperation != NULL) Usart_ISR.U3RXOperation(RECV_BUF3);                
        }
       
        HAL_UART_IRQHandler(&Uart3_Handle);
}


void USART3_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U3TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U3RXOperation = RxFunction;  //接收数据函数
       
        //  __HAL_RCC_USART3_CLK_ENABLE();

   // __HAL_RCC_GPIOB_CLK_ENABLE();
   // __HAL_RCC_GPIOD_CLK_ENABLE();
    /**USART3 GPIO Configuration
    PB10     ------> USART3_TX
    PD9     ------> USART3_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
               
                GPIO_InitTypeDef  GPIO_InitStruct2;
       
                        //GPIOD12初始化设置
        GPIO_InitStruct2.Pin = GPIO_PIN_12;              //DE
        GPIO_InitStruct2.Mode = GPIO_MODE_OUTPUT_PP;    //普通推挽输出模式
        GPIO_InitStruct2.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
        GPIO_InitStruct2.Pull = GPIO_PULLUP;            //上拉
        HAL_GPIO_Init(GPIOD, &GPIO_InitStruct2);        //初始化GPIO
       
                        //DE  高发送  低接收
         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

   //USART3 初始化设置
        Uart3_Handle.Instance          = USART3;                //串口1
        Uart3_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart3_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart3_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart3_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart3_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart3_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart3_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart3_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart3_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart3_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(USART3_IRQn, 4, 3);
        HAL_NVIC_EnableIRQ(USART3_IRQn);
}


void USART3_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart3_Handle, (uint8_t*)buff, Size);
}



void  UART4_IRQHandler(void)
{       
        if(UART4_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U4RXOperation != NULL) Usart_ISR.U4RXOperation(RECV_BUF4);                
        }
       
        HAL_UART_IRQHandler(&Uart4_Handle);
}

void USART4_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U4TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U4RXOperation = RxFunction;  //接收数据函数
       
          // __HAL_RCC_UART4_CLK_ENABLE();

   // __HAL_RCC_GPIOA_CLK_ENABLE();
    /**UART4 GPIO Configuration
    PA0     ------> UART4_TX
    PA11     ------> UART4_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF6_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
               
                GPIO_InitTypeDef  GPIO_InitStruct2;
       
                        //GPIOB14初始化设置
        GPIO_InitStruct2.Pin = GPIO_PIN_14;              //DE
        GPIO_InitStruct2.Mode = GPIO_MODE_OUTPUT_PP;    //普通推挽输出模式
        GPIO_InitStruct2.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
        GPIO_InitStruct2.Pull = GPIO_PULLUP;            //上拉
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct2);        //初始化GPIO
       
                        //DE  高发送  低接收
         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
               
   //USART4 初始化设置
        Uart4_Handle.Instance          = UART4;                //串口1
        Uart4_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart4_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart4_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart4_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart4_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart4_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart4_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart4_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart4_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart4_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(UART4_IRQn, 4, 4);
        HAL_NVIC_EnableIRQ(UART4_IRQn);
}


void USART4_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart4_Handle, (uint8_t*)buff, Size);
}


void  UART5_IRQHandler(void)
{       
        if(UART5_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U5RXOperation != NULL) Usart_ISR.U5RXOperation(RECV_BUF5);                
        }
       
        HAL_UART_IRQHandler(&Uart5_Handle);
}

void USART5_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U5TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U5RXOperation = RxFunction;  //接收数据函数
       
         // __HAL_RCC_UART5_CLK_ENABLE();

   // __HAL_RCC_GPIOC_CLK_ENABLE();
   // __HAL_RCC_GPIOD_CLK_ENABLE();
    /**UART5 GPIO Configuration
    PC12     ------> UART5_TX
    PD2     ------> UART5_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART5;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART5;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
               
                         
   //USART5 初始化设置
        Uart5_Handle.Instance          = UART5;                //串口1
        Uart5_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart5_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart5_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart5_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart5_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart5_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart5_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart5_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart5_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart5_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(UART5_IRQn, 4, 5);
        HAL_NVIC_EnableIRQ(UART5_IRQn);
}


void USART5_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart5_Handle, (uint8_t*)buff, Size);
}

void  USART6_IRQHandler(void)
{       
        if(UART6_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U6RXOperation != NULL) Usart_ISR.U6RXOperation(RECV_BUF6);                
        }
       
        HAL_UART_IRQHandler(&Uart6_Handle);
}

void USART6_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U6TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U6RXOperation = RxFunction;  //接收数据函数
       
         //  __HAL_RCC_USART6_CLK_ENABLE();

  //  __HAL_RCC_GPIOC_CLK_ENABLE();
    /**USART6 GPIO Configuration
    PC6     ------> USART6_TX
    PC7     ------> USART6_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART6;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
         
   //USART6 初始化设置
        Uart6_Handle.Instance          = USART6;                //串口1
        Uart6_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart6_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart6_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart6_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart6_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart6_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart6_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart6_Handle.AdvancedInit.AdvFeatureInit =  UART_ADVFEATURE_SWAP_INIT;
  Uart6_Handle.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
       
       
        HAL_UART_Init(&Uart6_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart6_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(USART6_IRQn, 4, 6);
        HAL_NVIC_EnableIRQ(USART6_IRQn);
}


void USART6_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart6_Handle, (uint8_t*)buff, Size);
}


void  USART7_IRQHandler(void)
{       
        if(UART7_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U7RXOperation != NULL) Usart_ISR.U7RXOperation(RECV_BUF7);                
        }
       
        HAL_UART_IRQHandler(&Uart7_Handle);
}

void USART7_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U7TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U7RXOperation = RxFunction;  //接收数据函数


        RCC_PeriphCLKInitTypeDef PeriphClkInitStruct ;
         PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART7;
    PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
     // Error_Handler();
    }


       
         __HAL_RCC_UART7_CLK_ENABLE();
      __HAL_RCC_GPIOE_CLK_ENABLE();

    /**UART7 GPIO Configuration
    PE7     ------> UART7_RX
    PE8     ------> UART7_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_UART7;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
               
       
       
               
   //USART7 初始化设置
        Uart7_Handle.Instance          = UART7;                //串口1
        Uart7_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart7_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart7_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart7_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart7_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart7_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart7_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart7_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart7_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart7_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(UART7_IRQn, 0, 0);
        //HAL_NVIC_EnableIRQ(UART7_IRQn);
}


void USART7_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart7_Handle, (uint8_t*)buff, Size);
}


void  USART8_IRQHandler(void)
{       
        if(UART8_SR&UART_LSR_RDR)                        //接收到数据
        {          
                if(Usart_ISR.U8RXOperation != NULL) Usart_ISR.U8RXOperation(RECV_BUF8);                
        }
       
        HAL_UART_IRQHandler(&Uart8_Handle);
}


void USART8_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
         RCC_PeriphCLKInitTypeDef PeriphClkInitStruct ;
         PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART8;
    PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
     // Error_Handler();
    }
               
        __HAL_RCC_UART8_CLK_ENABLE();
       __HAL_RCC_GPIOE_CLK_ENABLE();

               
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStruct;
       
        Usart_ISR.U8TXOver = Tx_Over;          //发送完成回调
        Usart_ISR.U8RXOperation = RxFunction;  //接收数据函数
       
          //   __HAL_RCC_UART8_CLK_ENABLE();

   // __HAL_RCC_GPIOE_CLK_ENABLE();
    /**UART8 GPIO Configuration
    PE0     ------> UART8_RX
    PE1     ------> UART8_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART8;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

               
               
   //USART8 初始化设置
        Uart8_Handle.Instance          = UART8;                //串口1
        Uart8_Handle.Init.BaudRate     = BPS;               //波特率设置
        Uart8_Handle.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
        Uart8_Handle.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
        Uart8_Handle.Init.Parity       = UART_PARITY_NONE;      //无校验
        Uart8_Handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
        Uart8_Handle.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
        Uart8_Handle.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
        Uart8_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_Init(&Uart8_Handle);   //初始化串口

    __HAL_UART_ENABLE_IT(&Uart8_Handle, UART_IT_RXNE);   //使能接收中断
       
        HAL_NVIC_SetPriority(UART8_IRQn, 0,0);
        HAL_NVIC_EnableIRQ(UART8_IRQn);
}

void USART8_Send(uint8_t *buff, uint16_t Size)
{
        HAL_UART_Transmit_IT(&Uart8_Handle, (uint8_t*)buff, Size);
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-11 16:39:31 | 显示全部楼层
1、可以看看对应的引脚有波形输出没,波特率是不是对。
2、另外这个写法非常不推荐

void  USART8_IRQHandler(void)
{      
        if(UART8_SR&UART_LSR_RDR)                        //接收到数据
        {         
                if(Usart_ISR.U8RXOperation != NULL) Usart_ISR.U8RXOperation(RECV_BUF8);               
        }
      
        HAL_UART_IRQHandler(&Uart8_Handle);
}

因为函数 HAL_UART_IRQHandler里面什么都处理了,不需要用户再额外做处理了。比如你这里要处理接收,他有专门的接收回调。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-8-11 17:40:35 | 显示全部楼层
接收的还没考虑,现在的问题是  uart7 和 uart8 发不出去数据,波特率是对的,引脚的波形等会我用示波器看看,时钟配置有没啥问题呢?下图红色部分是我加上去的,也许是有问题的
e:/yh.png
yh.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-11 17:42:30 | 显示全部楼层
Z先生 发表于 2024-8-11 17:40
接收的还没考虑,现在的问题是  uart7 和 uart8 发不出去数据,波特率是对的,引脚的波形等会我用示波器看 ...

发不出去,直接CubeMX配置个工程,发送下就锁定问题了。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-8-11 18:19:26 | 显示全部楼层
用 CubeMX  配过,uart1没问题,uart7  和  uart8 也发不出去,再麻烦帮忙看看配置中哪里可能有问题
yh2.png
yh3.png
yh4.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-12 09:17:37 | 显示全部楼层
Z先生 发表于 2024-8-11 18:19
用 CubeMX  配过,uart1没问题,uart7  和  uart8 也发不出去,再麻烦帮忙看看配置中哪里可能有问题

没发现问题。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-12 12:15:30 | 显示全部楼层
帮你用我们V7板子测试下,UART8没问题。


用的PJ8和PJ9

直接UART8做的printf打印。

V7-002_按键检测(软件滤波,FIFO机制 UART8).7z (1.31 MB, 下载次数: 13)

234.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-29 03:26 , Processed in 0.388251 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表