1. 程式人生 > >STM32串口通信USART學習筆記

STM32串口通信USART學習筆記

nvic spl new 接收 clock priority 數據接收 類別 rec

1. 實驗環境:

開發板:野火指南者(STM32F103VE)

STM32庫版本:STM32F10x_StdPeriph_Lib_V3.5.0

IDE:KEIL5(代碼編寫很不方便,只在編譯的時候用到)

代碼編寫工具:Source Insight 4.0(跟讀代碼、編寫代碼的最佳工具)

使用到的串口:USART1

硬件原理圖:

技術分享圖片

效果:

技術分享圖片

2. 新建NVIC.h、NVIC.c、User_USART.h、User_USART.c、main.c 5個文件,並從

STM32官方庫的例子中將stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h拷貝到自己的工程目錄下。

3. 在NVIC.h中添加如下代碼

技術分享圖片
1 #ifndef __NVIC_H
2 #define __NVIC_H
3 
4 void User_NVIC_Config(void);
5 
6 
7 
8 #endif
View Code

4. 在NVIC.c中添加如下代碼

技術分享圖片
 1 #include "NVIC.h"
 2 #include "stm32f10x.h"
 3 
 4 void User_NVIC_Config(void)
 5 {
 6     NVIC_InitTypeDef NVIC_Config;
 7     
 8
//設置中斷控制器優先級組類別 9 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 10 11 //初始化NVIC_InitTypeDef結構體 12 NVIC_Config.NVIC_IRQChannel = USART1_IRQn; 13 NVIC_Config.NVIC_IRQChannelPreemptionPriority = 1; 14 NVIC_Config.NVIC_IRQChannelSubPriority = 1; 15 NVIC_Config.NVIC_IRQChannelCmd = ENABLE;
16 17 //初始化NVIC中斷控制器 18 NVIC_Init(&NVIC_Config); 19 20 }
View Code

5. 在User_USART.h中添加如下代碼

技術分享圖片
 1 #ifndef __USER_USART_H
 2 #define __USER_USART_H
 3 #include "stm32f10x.h"
 4 
 5 void User_USART_GPIO_Config(void); //USART使用到的GPIO口設置
 6 void User_USART_Config(void);    //USART相關寄存器設置
 7 void User_USART_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data);     //向串口發送一個字節數據
 8 void User_UART_Send_String(USART_TypeDef* pUSARTX, char* str);        //向串口發送一個字符串數據,即可以發送包含多個字節的數據
 9 
10 
11 #endif
View Code

6. 在User_USART.c中添加如下代碼

技術分享圖片
 1 #include "User_USART.h"
 2 #include "stm32f10x.h"
 3 
 4 
 5 //USART使用到的GPIO口設置
 6 void User_USART_GPIO_Config(void)
 7 {
 8     GPIO_InitTypeDef USART_GPIO_TX,USART_GPIO_RX;
 9 
10     //先使能USART對應的GPIO口使用,USART使用的都是GPIOA組
11     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
12 
13     //初始化GPIO_InitTypeDef結構體--USART TX PIN
14     USART_GPIO_TX.GPIO_Mode = GPIO_Mode_AF_PP;
15     USART_GPIO_TX.GPIO_Pin = GPIO_Pin_9;
16     USART_GPIO_TX.GPIO_Speed = GPIO_Speed_50MHz;
17     
18     //設置USART TX PIN對應的控制寄存器
19     GPIO_Init(GPIOA, &USART_GPIO_TX);
20 
21     
22     //初始化GPIO_InitTypeDef結構體--USART RX PIN  此為輸入,所以不用初始化速率GPIO_Speed成員
23     USART_GPIO_RX.GPIO_Mode = GPIO_Mode_IN_FLOATING;
24     USART_GPIO_RX.GPIO_Pin = GPIO_Pin_10;
25     
26     //設置USART RX PIN對應的控制寄存器
27     GPIO_Init(GPIOA, &USART_GPIO_RX);
28     
29 
30 }
31 
32 
33 //USART相關寄存器設置
34 void User_USART_Config(void)
35 {
36 
37     USART_InitTypeDef USART_Config;
38 
39     //使能USART1時鐘
40     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
41 
42     //初始化USART_InitTypeDef結構體
43     USART_Config.USART_BaudRate = 115200;
44     USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
45     USART_Config.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
46     USART_Config.USART_Parity = USART_Parity_No;
47     USART_Config.USART_StopBits = USART_StopBits_1;
48     USART_Config.USART_WordLength = USART_WordLength_8b;
49 
50     //設置USART1對應的寄存器
51     USART_Init(USART1, &USART_Config);
52 
53     //使能USART1 數據接收RXEN中斷寄存器,即接收數據寄存器有數據可讀時,RXEN寄存器產生中斷
54     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
55 
56     //使能串口USART1,使其進行工作
57     USART_Cmd(USART1, ENABLE);
58     
59     
60 }
61 
62 
63 
64 //向串口發送一個字節數據
65 void User_USART_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data)
66 {
67 
68     //向數據寄存器寫入8bit數據
69     pUSARTX->DR = (Data & (uint16_t)0x01FF);    
70 
71     //USART_GetFlagStatus檢查數據是否發送完成
72     while(USART_GetFlagStatus(pUSARTX, USART_FLAG_TXE) == RESET);
73     
74 }
75 
76 
77 //向串口發送一個字符串數據,即可以發送包含多個字節的數據,char類型為8bit,其字符串中的每個字符都可用一個int數表示,即ASCII標準
78 void User_UART_Send_String(USART_TypeDef* pUSARTX, char* str)
79 {
80     int i;
81 
82     for(i = 0; i < sizeof(str); i++)
83     {
84         User_USART_Send_Byte(pUSARTX, *(str + i));
85 
86         //USART_GetFlagStatus檢查多個數據是否發送完成
87         while(USART_GetFlagStatus(pUSARTX, USART_FLAG_TC) == RESET);
88 
89 
90     }
91 
92 }
View Code

7. 在stm32f10x_it.h中添加如下代碼

技術分享圖片
1 void USART1_IRQHandler(void); //中斷服務函數
View Code

8. 在stm32f10x_it.c中添加如下代碼

技術分享圖片
 1 //中斷服務函數,前面在User_USART.c  void User_USART_Config(void)函數中
 2 //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了數據接收中斷,所以
 3 //將處理接收數據時的中斷服務
 4 void USART1_IRQHandler(void)
 5 {
 6 
 7     uint8_t temp;
 8 
 9     if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET)
10     {
11         temp = USART_ReceiveData(USART1);
12         USART_SendData(USART1, temp);
13 
14 
15     }
16 
17 
18 }
View Code

9. 在main.c中添加如下代碼

技術分享圖片
 1 #include "NVIC.h"
 2 #include "User_USART.h"
 3 #include "stm32f10x.h"
 4 
 5 int main(void)
 6 {
 7 
 8     User_USART_GPIO_Config();
 9     User_NVIC_Config();
10     User_USART_Config();
11 
12     User_UART_Send_String(USART1, "test!\n");
13 
14     while(1)
15     {
16 
17     }
18 
19 }
View Code

總結:

1、設置USART硬件中實際使用到的GPIO口,這裏為GPIOA的PIN8、PIN10,具體設置如下

  1.1、使能GPIO時鐘,使用RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)庫函數

  1.2、初始化GPIO_InitTypeDef結構體成員,若為輸入則不需要初始化GPIO_Speed成員

  1.3、將GPIO_InitTypeDef結構體的值寫入到對應GPIO寄存器中,使用GPIO_Init(GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_InitStruct)庫函數

2、設置USART對應的寄存器

  2.1、使能USART時鐘,使用RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)庫函數,若不是USART1則需要使用RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)庫函數,因為USART1掛載在APB2總線上,USART2~USART5掛載在APB1總線上。

  2.2、初始化USART_InitTypeDef結構體成員。一般為8N1,即數據長度為8bit、無校驗位、1個停止位

  2.3、將USART_InitTypeDef結構體的值寫入到對應的USART寄存器中,使用USART_Init(USART_TypeDef * USARTx, USART_InitTypeDef * USART_InitStruct)庫函數

  2.4、打開對應的中斷寄存器來響應中斷,即中斷到來時可進入對應的中斷服務程序,若不需要中斷,則不用設置,跳過此不走。本實驗使用了數據

    接收中斷,使用USART_ITConfig(USART_TypeDef * USARTx, uint16_t USART_IT, FunctionalState NewState)庫函數設置

  2.5、使能串口USART1,使其進行工作,使用USART_Cmd(USART_TypeDef * USARTx, FunctionalState NewState)庫函數

3、因為使用了中斷,所以設置NVIC中斷控制寄存器

  3.1、設置中斷優先級組,使用NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)庫函數

  3.2、初始化NVIC_InitTypeDef結構體成員

  3.3、將NVIC_InitTypeDef結構體的值寫入NVIC對應的寄存器中,使用NVIC_Init(NVIC_InitTypeDef * NVIC_InitStruct)庫函數

4、編寫中斷服務程序

實驗代碼:

鏈接:https://pan.baidu.com/s/1Ghg1FzTQ8l0cvyGuQnIaZA
提取碼:8rwq

STM32串口通信USART學習筆記