找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

132

积分

0

好友

10

主题
发表于 2023-9-22 12:33:08 | 查看: 653| 回复: 3 IP:中国广东省 中国电信

用了一个AT32F407的样板,使用USART1没有问题,能够正常接收发送字符,但USART6就不行,应该如何配置USART6呢?IO使用PC6,PC7

下面USART初始化代码:

/* 初始化指定的UART */
void Console_Uart_Init(int num)        {   
        GPIO_InitType GPIO_InitStructure;
        USART_InitType USART_InitStructure;
        NVIC_InitType   NVIC_InitStructure;

        if(num == 1)         {
                //打开串口1所在的IO口时钟
                RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_AFIO , ENABLE);
                //打开串口1时钟
                RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, ENABLE); 

                //USART1端口配置
                GPIO_PinsRemapConfig(GPIO_Remap_USART1, DISABLE);//使用原始位置
                //RX
                GPIO_InitStructure.GPIO_Pins = GPIO_Pins_10;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_PU;
                GPIO_Init(GPIOA, &GPIO_InitStructure);

                //TX
                GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
                GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_Init(GPIOA, &GPIO_InitStructure);

        }        else if(num == 3)        {
                //打开串口所在的IO口时钟
                RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOD|RCC_APB2PERIPH_AFIO , ENABLE);
                //打开串口时钟
                RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_USART3, ENABLE); 

                //USART3端口配置
                GPIO_PinsRemapConfig(GPIO_FullRemap_USART3, ENABLE);//重映射,问题? PD10 11 12能用普通作IO吗?实际测试可以!
                //RX
                GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_PU;//注:此处要上拉,不然很可能出问题。
                GPIO_Init(GPIOD, &GPIO_InitStructure);

                //TX
                GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
                GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_Init(GPIOD, &GPIO_InitStructure);
        }        else if(num == 6)        {
                //打开串口6所在的IO口时钟
                RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOC|RCC_APB2PERIPH_AFIO , ENABLE);
                //打开串口时钟
                RCC_APB1PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE); 

//                //USART6端口配置
//???                GPIO_PinsRemapConfig(GPIO_Remap_USART6, ENABLE);//重映射,问题? 
                //RX
                GPIO_InitStructure.GPIO_Pins = GPIO_Pins_7;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_PU;  //
                GPIO_Init(GPIOC, &GPIO_InitStructure);

                //TX
                GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6;
                GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_Init(GPIOC, &GPIO_InitStructure);
        }

  // USART初始化设置
        // 波特率设置
//        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_BaudRate = 57600;
        // 字长为8位数据格式
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        // 一个停止位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//break;
        //        USART_InitStructure.USART_StopBits = USART_StopBits_0_5;break;     
        USART_InitStructure.USART_Parity = USART_Parity_No;
        // USART_InitStructure.USART_Parity = USART_Parity_Even;

        //todo
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

        if(num == 1)        {
                USART_Init(USART1, &USART_InitStructure); //初始化串口1
                USART_Cmd(USART1, ENABLE);  //使能串口1 

                //打开收非空中断
                USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);
//                USART_INTConfig(USART1, USART_INT_IDLEF, ENABLE);

                //Usart1 NVIC 配置
                NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=10;//抢占优先级10
                NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //子优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
                NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
        }        else if(num == 3)        {
                USART_Init(USART3, &USART_InitStructure); //初始化串口
                USART_Cmd(USART3, ENABLE);  //使能串口 

        //打开收非空中断
        //        USART_INTConfig(USART3, USART_INT_RDNE, ENABLE);
        //USART_INTConfig(USART1, USART_INT_IDLEF, ENABLE);

        //Usart1 NVIC 配置
        //        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口1中断通道
        //        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=10;//抢占优先级10
        //        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //子优先级
        //        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        //        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
        }        else if(num == 6)        {
                USART_Init(USART6, &USART_InitStructure); //初始化串口
                USART_Cmd(USART6, ENABLE);  //使能串口 

                //打开收非空中断
                USART_INTConfig(USART6, USART_INT_RDNE, ENABLE);
//                USART_INTConfig(USART6, USART_INT_IDLEF, ENABLE);

        //Usart1 NVIC 配置
                NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;//串口6中断通道
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=10;//抢占优先级10
                NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;                //子优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
                NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
        }
}

移植了freeRTOS 代码中关于USART6重映射IO的部分出错, 硬件是单独使用PC6\PC7的,没有占用

发表于 2023-9-22 12:36:22 IP:中国广东省 中国电信

根据雅特力科技的官方网站,AT32F407系列微控制器支持8组UART串口,其中USART6对应的引脚是PC6和PC7。

你的代码中,USART6的初始化部分看起来没有问题,但是需要注意以下几点:

  • 需要配置GPIOC的时钟,否则GPIO_Init函数可能无法正确工作。可以在RCC_APB2PeriphClockCmd函数中添加RCC_APB2PERIPH_GPIOC参数。
  • 需要配置USART6的中断优先级和使能中断,否则USART_INTConfig函数可能无效。可以参考USART1的配置,使用NVIC_Init函数设置NVIC_InitStructure结构体的相关参数。
  • 需要注意USART6挂在APB2总线上,而不是APB1,因此其时钟频率可能不同于其他UART。可以使用RCC_GetClocksFreq函数获取APB2的时钟频率,并根据你的波特率需求调整USART_InitStructure结构体的相关参数。
发表于 2023-9-22 12:37:38 IP:中国广东省 中国电信
你好,从贴出来的代码来看,串口6开时钟部分有错,RCC_APB1PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE);
修改为RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE);
再试试呢


发表于 2023-9-22 12:38:54 IP:中国广东省 中国电信

针对你的问题,可以按照以下步骤配置USART6:

  1. 打开USART6所在的IO口时钟和USART6时钟

    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOC | RCC_APB2PERIPH_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE);
  2. 配置USART6的IO口

    GPIO_InitType GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_7; //RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6; //TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
  3. 配置USART6的参数,例如波特率、数据位数、停止位等

    USART_InitType USART_InitStructure;
    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_Init(USART6, &USART_InitStructure);
  4. 使能USART6

    USART_Cmd(USART6, ENABLE);

这些初始化步骤应该放在程序启动时执行。你还需要在使用USART6的地方调用相应的发送和接收函数,例如USART_SendData()和USART_ReceiveData()。如果仍然无法正常工作,你可以使用示波器或逻辑分析仪来检查信号是否正确。

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|国产电子社区 ( 沪ICP备2023018578号-1|

苏公网安备 32011102010465号


)|网站地图

GMT+8, 2024-7-27 18:23 , Processed in 0.067278 second(s), 26 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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