[AT32F407] AT32F407如何配置USART6?

[复制链接]
 楼主| xing650725 发表于 2023-5-6 01:58 | 显示全部楼层 |阅读模式
#21ic问答# 用了一个AT32F407的样板,使用USART1没有问题,能够正常接收发送字符,但USART6就不行,应该如何配置USART6呢?IO使用PC6,PC7
muyichuan2012 发表于 2023-5-6 09:01 | 显示全部楼层
1  建议把配置代码贴一下   我们帮你check‘一下
2  检查电路原理图,确认PC6 PC7是否有占用
 楼主| xing650725 发表于 2023-5-6 12:00 | 显示全部楼层
下面USART初始化代码:
  1. /* 初始化指定的UART */
  2. void Console_Uart_Init(int num)        {   
  3.         GPIO_InitType GPIO_InitStructure;
  4.         USART_InitType USART_InitStructure;
  5.         NVIC_InitType   NVIC_InitStructure;
  6.        
  7.         if(num == 1)         {
  8.                 //打开串口1所在的IO口时钟
  9.                 RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_AFIO , ENABLE);
  10.                 //打开串口1时钟
  11.                 RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, ENABLE);
  12.                
  13.                 //USART1端口配置
  14.                 GPIO_PinsRemapConfig(GPIO_Remap_USART1, DISABLE);//使用原始位置
  15.                 //RX
  16.                 GPIO_InitStructure.GPIO_Pins = GPIO_Pins_10;
  17.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_PU;
  18.                 GPIO_Init(GPIOA, &GPIO_InitStructure);
  19.                
  20.                 //TX
  21.                 GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
  22.                 GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  23.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  24.                 GPIO_Init(GPIOA, &GPIO_InitStructure);

  25.         }        else if(num == 3)        {
  26.                 //打开串口所在的IO口时钟
  27.                 RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOD|RCC_APB2PERIPH_AFIO , ENABLE);
  28.                 //打开串口时钟
  29.                 RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_USART3, ENABLE);
  30.                
  31.                 //USART3端口配置
  32.                 GPIO_PinsRemapConfig(GPIO_FullRemap_USART3, ENABLE);//重映射,问题? PD10 11 12能用普通作IO吗?实际测试可以!
  33.                 //RX
  34.                 GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
  35.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_PU;//注:此处要上拉,不然很可能出问题。
  36.                 GPIO_Init(GPIOD, &GPIO_InitStructure);
  37.                
  38.                 //TX
  39.                 GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
  40.                 GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  41.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  42.                 GPIO_Init(GPIOD, &GPIO_InitStructure);
  43.         }        else if(num == 6)        {
  44.                 //打开串口6所在的IO口时钟
  45.                 RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOC|RCC_APB2PERIPH_AFIO , ENABLE);
  46.                 //打开串口时钟
  47.                 RCC_APB1PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE);
  48.                
  49. //                //USART6端口配置
  50. //???                GPIO_PinsRemapConfig(GPIO_Remap_USART6, ENABLE);//重映射,问题?
  51.                 //RX
  52.                 GPIO_InitStructure.GPIO_Pins = GPIO_Pins_7;
  53.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_PU;  //
  54.                 GPIO_Init(GPIOC, &GPIO_InitStructure);
  55.                
  56.                 //TX
  57.                 GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6;
  58.                 GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  59.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  60.                 GPIO_Init(GPIOC, &GPIO_InitStructure);
  61.         }
  62.        
  63.   // USART初始化设置
  64.         // 波特率设置
  65. //        USART_InitStructure.USART_BaudRate = 115200;
  66.         USART_InitStructure.USART_BaudRate = 57600;
  67.         // 字长为8位数据格式
  68.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  69.         // 一个停止位
  70.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//break;
  71.         //        USART_InitStructure.USART_StopBits = USART_StopBits_0_5;break;           
  72.         USART_InitStructure.USART_Parity = USART_Parity_No;
  73.         // USART_InitStructure.USART_Parity = USART_Parity_Even;
  74.                
  75.         //todo
  76.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  77.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式
  78.        
  79.         if(num == 1)        {
  80.                 USART_Init(USART1, &USART_InitStructure); //初始化串口1
  81.                 USART_Cmd(USART1, ENABLE);  //使能串口1

  82.                 //打开收非空中断
  83.                 USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);
  84. //                USART_INTConfig(USART1, USART_INT_IDLEF, ENABLE);
  85.                                
  86.                 //Usart1 NVIC 配置
  87.                 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
  88.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=10;//抢占优先级10
  89.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //子优先级
  90.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  91.                 NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
  92.         }        else if(num == 3)        {
  93.                 USART_Init(USART3, &USART_InitStructure); //初始化串口
  94.                 USART_Cmd(USART3, ENABLE);  //使能串口

  95.         //打开收非空中断
  96.         //        USART_INTConfig(USART3, USART_INT_RDNE, ENABLE);
  97.         //USART_INTConfig(USART1, USART_INT_IDLEF, ENABLE);
  98.                
  99.         //Usart1 NVIC 配置
  100.         //        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口1中断通道
  101.         //        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=10;//抢占优先级10
  102.         //        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //子优先级
  103.         //        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  104.         //        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
  105.         }        else if(num == 6)        {
  106.                 USART_Init(USART6, &USART_InitStructure); //初始化串口
  107.                 USART_Cmd(USART6, ENABLE);  //使能串口

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

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


移植了freeRTOS
代码中关于USART6重映射IO的部分出错, 硬件是单独使用PC6\PC7的,没有占用
sheltonyu 发表于 2023-5-6 13:16 | 显示全部楼层
本帖最后由 sheltonyu 于 2023-5-6 13:18 编辑

你好,从贴出来的代码来看,串口6开时钟部分有错,RCC_APB1PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE);修改为RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE);再试试呢

打赏榜单

xing650725 打赏了 1.00 元 2023-05-06
理由:解决问题

 楼主| xing650725 发表于 2023-5-6 13:32 | 显示全部楼层
sheltonyu 发表于 2023-5-6 13:16
你好,从贴出来的代码来看,串口6开时钟部分有错,RCC_APB1PeriphClockCmd(RCC_APB2PERIPH_USART6, ENABLE) ...

谢谢。还真是灯下黑了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部