使用的是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 }