STM32串口通信USART学习笔记

Wesley13
• 阅读 806

1. 实验环境:

开发板:野火指南者(STM32F103VE)

STM32库版本:STM32F10x_StdPeriph_Lib_V3.5.0

IDE:KEIL5(代码编写很不方便,只在编译的时候用到)

代码编写工具:Source Insight 4.0(跟读代码、编写代码的最佳工具)

使用到的串口:USART1

硬件原理图:

STM32串口通信USART学习笔记

效果:

STM32串口通信USART学习笔记

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中添加如下代码

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

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中添加如下代码

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

 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中添加如下代码

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

 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中添加如下代码

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

 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中添加如下代码

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

1 void USART1_IRQHandler(void); //中断服务函数

View Code

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

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

 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中添加如下代码

STM32串口通信USART学习笔记 STM32串口通信USART学习笔记

 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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
STM32 I2C EEPROM学习笔记
开发板:野火指南者(STM32F103VE)STM32库版本:STM32F10x\_StdPeriph\_Lib\_V3.5.0IDE:KEIL5(代码编写很不方便,只在编译的时候用到)代码编写工具:SourceInsight4.0(跟读代码、编写代码的最佳工具)使用到的串口:USART1使用到的I2C:I2C1EEPROM型号:
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这