STM32串口通信USART1轉USART2問題解決


使用的是STM32f103ZET6.

1、把文件main.c和usart.c中的所有usart1換成usart2

2、查看手冊得知USART2的引腳是Tx->PA2,Rx->PA3,改變usart.c文件GPIO設置。

3、 Error: L6218E: Undefined symbol UART_INIT (referred from main.o).

 Not enough information to list image symbols.

解決辦法:在usart.h文件里#define EN_USART1_RX 改為#define EN_USART2_RX ,因為使用到了串口2的中斷接收,所以必須在usart.h里面定義EN_USART2_RX,這樣才可以配置中斷使能,以及開啟NVIC中斷。

4、usart1和usart2時鍾不一樣,usart1掛載在APB2上,usart2掛載在APB1上。使能GPIOA和使能USART2的時候要注意,使能GPIOA用RCC_APB2PeriphClockCmd,使能USART2用RCC_APB1PeriphClockCmd。(調很久才發現這里的問題。。。)

5、串口通信中白線、綠線、黑線如何對應TX、RX、GND,這個問題百度沒有找到答案,自己試的結果是白線->TX,綠線->RX,黑線->GND,紅線->VCC。聽說不同廠家規格不一樣,測試的時候一個不行就換另一個吧。

6、燒程序時彈出SWD Communication Failure,百度了也沒找到原因,或找到一堆復雜的看不懂的東西。之前開發板電源接的是USB1,現在電源在USART2那里。USART2的VCC不接,繼續用數據線接USB1口通電就解決這個問題了。

 

串口2的初始化函數如下:

void uart_init(u32 bound){
  //GPIO端口設置
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
     
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    //使能USART2,GPIOA時鍾//USART2_TX   GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //復用推挽輸出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
   
  //USART2_RX      GPIOA.3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  

  //USART2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子優先級3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根據指定的參數初始化NVIC寄存器//USART 初始化設置

    USART_InitStructure.USART_BaudRate = bound;//串口波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式
    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(USART2, &USART_InitStructure); //初始化串口2
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
  USART_Cmd(USART2, ENABLE);                    //使能串口2
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM