零死角玩转stm32-中级篇1、调试必备-串口(UART)

合集下载

零死角玩转stm32-中级篇2、ADC(DMA模式)

零死角玩转stm32-中级篇2、ADC(DMA模式)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!2、ADC(DMA模式)2.1 ADC简介ADC (Analog to Digital Converter),模/数转换器。

在模拟信号需要以数字形式处理、存储或传输时,模/数转换器几乎必不可少。

STM32在片上集成的ADC外设非常强大。

在STM32F103xC、STM32F103xD和STM32F103xE增强型产品,内嵌3个12位的ADC,每个ADC共用多达21个外部通道,可以实现单次或多次扫描转换。

如野火STM32开发板用的是STM32F103VET6,属于增强型的CPU,它有18个通道,可测量16个外部和2个内部信号源。

各通道的A/D转换可以单次、连续、扫描或间断模式执行。

ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

2.2 STM32的ADC主要技术指标对于ADC来说,我们最关注的就是它的分辨率、转换速度、ADC类型、参考电压范围。

●分辨率12位分辨率。

不能直接测量负电压,所以没有符号位,即其最小量化单位LSB = V ref+ / 212。

●转换时间转换时间是可编程的。

采样一次至少要用14个ADC时钟周期,而ADC的时钟频率最高为14MHz,也就是说,它的采样时间最短为1us。

足以胜任中、低频数字示波器的采样工作。

●ADC类型ADC的类型决定了它性能的极限,STM32的是逐次比较型ADC。

stm32跑RT-thread之串口操作简介

stm32跑RT-thread之串口操作简介

UART 设备 UART 简介UART( Uni versal Asynchronous Receiver/Tra nsmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符 一位接一位地传输。

是在应用程序开发过程中使用频率最高的数据总线。

UART 串口的特点是将数据一位一位地顺序传送,只要 实现双向通信,一根线发送数据的同时用另一根线接收数据。

几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对 于两个使用UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常 完成。

UART 串口传输的数据格式如下图所示:2根传输线就可以UART 串口通信有? 起始位:表示数据传输的开始,电平逻辑为 “0 。

?数据位:可能值有5、6、7、8、9,表示传输这几个bit 取值为8,因为一个ASCII 字符值为8位。

?奇偶校验位:用于接收方对接收到的数据进行校验,校验 为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性, 要此位也可以。

? 停止位:表示一帧数据的结束。

电平逻辑为“ 1”。

?波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数 bit/s(bps)4800、9600、14400、38400、115200 等, 115200表示每秒钟传输115200位数据。

访问串口设备应用程序通过RT-Thread 提供的I 关接口如下所示:I/O 位数据。

一般 “ 1 ”的位数使用时不需。

常见的波特率值有 数值越大数据传输的越快,波特率为设备管理接口来访问串口硬件,相查找串口设备应用程序根据串口设备名称获取设备句柄,进而可以操作串口设备,查找 设备函数如下所示,rt_device_t rt_device_find( const char* name);描述返回©找到对应设备将返回相应的S 备句柄/*接收模式参数*/narrc设备名称IRT NULL没有找到拾应的设笛对觀一般情况下,注册到系统的串口设备名称为 uart0 如下所示: ,uartl 等,使用示例#defi ne SAMP LE_UART_NAME "uart2"/*串口设备名称*/static rt device t serial; /*串口设备句柄*//*查找串口设备*/serial = rt_device_fi nd(SA MP LE_UART_NAME);打开串口设备通过设备句柄,应用程序可以打开和关闭设备,打开设备时,会检测设备 是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。

STM32UART详细使用说明整理

STM32UART详细使用说明整理

STM32UART详细使用说明整理1.引脚和时钟配置:首先,需要配置UART的引脚和时钟。

在STM32的引脚复用配置中选择UART功能,并配置GPIO的工作模式和引脚配置,使其与UART通信引脚相对应。

然后,配置UART的时钟源和时钟分频系数。

时钟源可以选择为系统时钟或外部时钟源。

2.初始化和配置:使用STM32提供的库函数,初始化UART控制寄存器。

配置波特率、数据位数、停止位数、奇偶校验位以及流控制等参数。

可以使用HAL库函数来完成配置,例如:```c/*初始化UART控制寄存器*/UART_HandleTypeDef huart;huart.Instance = USARTx;huart.Init.WordLength = UART_WORDLENGTH_8B;huart.Init.StopBits = UART_STOPBITS_1;huart.Init.Parity = UART_PARITY_NONE;huart.Init.Mode = UART_MODE_TX_RX;huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart);```3.数据发送:使用HAL库函数发送数据。

可以选择使用轮询方式还是中断方式发送数据。

轮询方式:```cuint8_t data[] = "Hello, World!";HAL_UART_Transmit(&huart, data, sizeof(data), HAL_MAX_DELAY);```中断方式:```cuint8_t data[] = "Hello, World!";HAL_UART_Transmit_IT(&huart, data, sizeof(data));```需要在发送数据之前开启UART的发送中断,并处理发送完成中断回调函数。

STM32HAL库之串口详细篇(基于HAL库)

STM32HAL库之串口详细篇(基于HAL库)

STM32HAL库之串⼝详细篇(基于HAL库)⼀、基础认识(⼀) 并⾏通信原理:数据的各个位同时传输优点:速度快缺点:占⽤引脚资源多,通常⼯作时有多条数据线进⾏数据传输8bit数据传输典型连接图:传输的数据是⼆进制:11101010,则通信使⽤8条线同时进⾏数据传输,发送端⼀次性发送8位数据,接收端⼀次性接收8位数据。

(⼆) 串⾏通信原理:数据按位顺序传输优点:占⽤引脚资源少缺点:速度相对较慢,通常⼯作时只有⼀条数据线进⾏数据传输8bit数据传输典型连接图:传输的数据是⼆进制:11101010,则通信使⽤8条线同时进⾏数据传输,发送端⼀次性发送8位数据,接收端⼀次性接收8位数据。

8bit数据传输典型连接图:传输的数据是⼆进制:11101010,则通信使⽤1条线进⾏数据传输,发送端⼀次性发送1位数据,接收端⼀次性接收1位数据。

串⾏通信的分类:1.单⼯:数据只能在⼀个⽅向上传输,通信双⽅数据只能由⼀⽅传输到另⼀⽅2.半双⼯:数据可以错时双向传输,通信双⽅数据可以⽀持两个⽅向传输,但是同⼀时间只能由⼀⽅传输到另外⼀⽅。

3.全双⼯:数据可以同时双向传输,通信双⽅数据可以同时进⾏双向传输,对于其中⼀个设备来说,设备需要⽀持发送数据时可以进⾏数据接收。

串⾏通信的通讯⽅式:l 同步通信:带时钟同步信号的传输,如SPI、IIC、USART(同步)l 异步通信:不带时钟同步信号的传输,如UART、USART(异步)常见数据传输协议:(三) UART和USARTUART:通⽤异步收发器USART:通⽤同步/异步收发器,其可选使⽤异步⽅式,那将和UART⽆区别,如果是同步,则需要多⼀根时钟线(USART_CK)(四) STM32的USART注意:l 通常USART1接⼝的通信速率较快,其它USART接⼝较慢。

如STM32F103C8T6的USART1接⼝通信速率是4.5Mbps,其它USART接⼝的通信速率是2.25Mbps。

STM32F030_USART详细配置说明_stm32f030串口

STM32F030_USART详细配置说明_stm32f030串口

STM32F030_USART详细配置说明_stm32f030串口串口是我们在编程时最经常用的问题,通常用它来发送和接收数据,同时它还有另外一个功能——检测程序是否正确,stm32f030系类单片机自然而然少不了串口,本文主要介绍STM32F030_USART的几个常用的简单应用和它的功能配置。

1、概述通用同步异步收发器(USART)提供了一个灵活的方式,使 MCU 可以与外部设备通过工业标准 NRZ 的形式实现全双工异步串行数据通讯。

USART 可以使用分数波特率发生器,提供了超宽的波特率设置范围。

可以使用DMA 实现多缓冲区设置,从而能够支持高速数据通讯•全双工,异步通讯•可配置的 16 倍或 8 倍过采样方法提供速度和时钟容忍度间的灵活选择•小数波特率发生器•自动波特率检测•单线半双工通讯•停止位个数可设置 - 支持 1 个或 2 个停止位•十四个中断源和中断标志•- CTS 切换•- LIN 断开检测•-发送数据寄存器空•-发送完成•-接收数据寄存器满•-检测到线路空闲•-溢出错误•-帧错误•-噪声错误•-奇偶错误•-地址 / 字符匹配•-接收超时中断•-块结束中断•-从 Stop 模式唤醒•校验控制:•-发送奇偶校验位•-接收数据的奇偶检查2、准备工作1.认真阅读STM32F030x数据手册2.了解USART的运行原理3.查看STM32F030开发板原理图和封装图4.电脑装有keil等编译软件3、寄存器说明控制寄存器 1(USART_CR1)控制寄存器 2(USART_CR2)控制寄存器 3(USART_CR3)波特率寄存器( USART_BRR)保护时间和预分频器寄存器( USART_GTPR)中断和状态寄存器(USART_ISR)中断标志清除寄存器( USART_ICR)数据接收寄存器( USART_RDR)数据发送寄存器( USART_TDR)4、USART配置ART原理图ART代码分析3.①USART初始化void Usart_Init(uint32_t BaudRate){ USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); /* PA9-TX-推挽复用PA10-RX-浮空输入/上拉输入*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStruct); /*USART基本配置*/ USART_ART_BaudRate=BaudRate;USART_ART_HardwareFlowControl=USART_Hardwa reFlowControl_None;USART_ART_Mode=USART_Mode_Tx|USART_Mode_ Rx; USART_ART_Parity=USART_Parity_No; USART_ART_StopBits=USART_StopBits_1;USART_ART_WordLength=USART_WordLength_8b; USART_Init(USART1,&USART_InitStruct); /*使能接收中断*/ NVIC_Config(USART1_IRQn); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1,ENABLE);}②USART发送数据void USART1_SendBuf(uint8_t *pBuf, uint32_tu32Len){ while(u32Len--) { /*判断发送缓冲区是否为空*/ while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1,*pBuf++); }}③USART接收数据uint8_t USART1_ReciverBuf(void){ /*判断接收缓冲区是否为非空*/ while(!USART_GetFlagStatus(USART1,USART_FLAG_RXNE)); return USART_ReceiveData(USART1);}3 . printf函数重映射int fputc(int ch, FILE*f){ USART_SendData(USART1,(uint8_t)ch); while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE)); return (ch);}5、总结在进行USART的printf函数的使用时,一定要记得将微库打开:点击keil工具栏的小魔术棒符号,进入Target配置,勾选Use MicroLib。

stm32跑RT-thread之串口操作简介

stm32跑RT-thread之串口操作简介

#define SAMPLE_UART_NAME
"uart2" /* 串口设备名称 */
static rt_device_t serial;
/* 串口设备句柄 */
/* 查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);
/* 以 DMA 接收及轮询发送模式打开串口设备 */
460800
#define BAUD_RATE_921600
921600
#define BAUD_RATE_2000000
2000000
#define BAUD_RATE_3000000 /* 数据位可取值 */
3000000
#define DATA_BITS_5
5
#define DATA_BITS_6
要此位也可以。

停止位: 表示一帧数据的结束。电平逻辑为 “1”。

波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效
位(bit)数来表示,其单位为每秒比特数 bit/s(bps)。常见的波特率值有
4800、9600、14400、38400、115200 等,数值越大数据传输的越快,波特率为
#define RT_DEVICE_FLAG_STREAM
0x040 /* 流模式
*/
/* 接收模式参数 */
#define RT_DEVICE_FLAG_INT_RX
0x100 /* 中断接收模式 */
#define RT_DEVICE_FLAG_DMA_RX /* 发送模式参数 */ #define RT_DEVICE_FLAG_INT_TX
UART 设备 UART 简介

STM32HAL库UART串口读写功能笔记

STM32HAL库UART串口读写功能笔记

STM32HAL库UART串⼝读写功能笔记串⼝发送功能:uint8_t TxData[10]= "01234abcde";HAL_UART_Transmit(&huart2,TxData,10,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最⼤值0xffff串⼝接收功能1:uint8_t value='F';HAL_UART_Receive(&huart2,(uint8_t *)&value,1,1000);//在这个语句停留1000ms内等待接收1个字节数据,把数据存放在value中串⼝接收功能2:HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1);//程序不会在这个语句停留,直接会按照中断⽅式把接收数据存放在value中,但是这个语句只能使能⼀次串⼝中断。

所以要在中断服务函数或者回调函数中重新使能串⼝接收功能3:if(HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1) != HAL_OK){ //这⼀句写在main函数的while(1)上⾯。

⽤于启动程序启动⼀次中断接收HAL_UART_Transmit(&huart2, (uint8_t *)&"ERROR\r\n",7,10);while(1);}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){HAL_UART_Transmit(&huart2, (uint8_t *)&"\r\ninto HAL_UART_RxCpltCallback\r\n",32,0xffff); //验证进⼊这个函数了HAL_UART_Transmit(&huart2,(uint8_t *)&value,1,0xffff); //把接收到的数据通过串⼝发送出去HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1); //重新打开串⼝中断}串⼝DMA发送DMA的TX要这样设置uint8_t txData[] = {"HelloWorld\r\n"};HAL_UART_Transmit_DMA(&huart2,txData,sizeof(txData));//可以通过DMA把数据发出去DMA接收if(HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1) != HAL_OK)//main函数while(1)前,启动⼀次DMA接收{Error_Handler();}串⼝回调函数:void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){uint8_t temp[] = {"\r\nin Callback\r\n"};HAL_UART_Transmit_DMA(&huart2,temp,sizeof(temp)-1);//可以通过DMA把数据发出去HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1); //重新使能接收}main函数while(1)中不断输出rxData值HAL_UART_Transmit_DMA(&huart2,rxData,sizeof(rxData)-1);//可以通过DMA把数据发出去写在前⾯ 最近需要使⽤⼀款STM32L4系列的芯⽚进⾏开发,需要学习使⽤HAL库。

stm32 uart dma 接收原理 -回复

stm32 uart dma 接收原理 -回复

stm32 uart dma 接收原理-回复STM32 UART DMA 接收原理一、引言串行通信是一种常用的数据传输方式,UART(通用异步收发传输器)是其中一种常见的串行通信接口。

对于STM32微控制器,它支持使用DMA (直接内存访问)来处理UART的接收和发送操作。

本文将重点讨论STM32 UART DMA 接收的原理,详细介绍DMA的工作原理以及如何在STM32中配置和使用DMA来实现UART的接收功能。

二、DMA 简介DMA是一种由硬件支持的直接内存访问技术,它可以在不依赖CPU的情况下,实现外设和内存之间的数据传输。

在传统的方式中,CPU需要花费大量的时间和资源来处理数据的传输,而DMA可以减轻CPU的负担,提高数据传输的效率。

对于STM32微控制器,它提供了多个DMA通道,可以与不同的外设进行数据传输。

三、UART 接收过程UART的接收过程通常分为两步:接收数据和处理数据。

1. 接收数据:UART接收数据的原理是通过接收数据寄存器(Receive Data Register)将接收到的数据保存在寄存器中,然后CPU读取该寄存器以获得接收到的数据。

在传统的方式中,CPU需要不断地查询是否有接收到的数据,并进行读取操作。

但这种方式会浪费CPU的时间和资源。

2. 处理数据:接收到的数据通常需要进行处理,例如判断数据的格式是否正确、提取有效的数据等。

这些处理过程需要CPU的参与,因此如果CPU在不断查询接收数据的过程中被占用,那么处理数据的效率将会大大降低。

四、DMA 接收原理DMA 可以在不依赖CPU的情况下自动执行数据传输操作,因此可以大大提高数据传输的效率。

对于UART的接收过程,STM32提供了DMA 来进行数据的接收,并提供了相应的寄存器和寄存器位来进行配置。

1. 配置UART DMA 模式:首先需要配置UART和DMA的工作模式。

通过UART的控制寄存器和DMA的配置寄存器,可以设置相关的模式。

stm32串口实验:stm32通过usart1进行串口收发,PA9(TX)和PA10(RX)

stm32串口实验:stm32通过usart1进行串口收发,PA9(TX)和PA10(RX)

stm32串⼝实验:stm32通过usart1进⾏串⼝收发,PA9(TX)和PA10(RX)这是stm32开发中⽐较简单的实验,原理是通过串⼝助⼿发送信息,stm32接收到信息以后在串⼝助⼿中打印相同的内容。

这⾥直接分享keil5⼯程代码,是在⼯程模板的基础上移植和修改了正点原⼦的串⼝代码(如果失效的话可以在下⽅评论留下邮箱,我看到会给你发⼀份)顺便把usart.c和usart.h还有mian.c中的代码复制到下⾯,⼩伙伴可以直接移植到⾃⼰的⼯程中实现的效果也在下⾯放上串⼝助⼿中显⽰的图⽚usart.c1 #include "sys.h"2 #include "usart.h"345//STM32F103核⼼板例程6//库函数版本例程7/********** 出品 ********/8910//////////////////////////////////////////////////////////////////////////////////11//如果使⽤ucos,则包括下⾯的头⽂件即可.12#if SYSTEM_SUPPORT_UCOS13 #include "includes.h"//ucos 使⽤14#endif15//////////////////////////////////////////////////////////////////////////////////16//STM32开发板17//串⼝1初始化1819//////////////////////////////////////////////////////////////////////////////////202122//////////////////////////////////////////////////////////////////23//加⼊以下代码,⽀持printf函数,⽽不需要选择use MicroLIB24#if 125#pragma import(__use_no_semihosting)26//标准库需要的⽀持函数27struct __FILE28 {29int handle;3031 };3233 FILE __stdout;34//定义_sys_exit()以避免使⽤半主机模式35void _sys_exit(int x)36 {37 x = x;38 }39//重定义fputc函数40int fputc(int ch, FILE *f)41 {42while((USART1->SR&0X40)==0);//循环发送,直到发送完毕43 USART1->DR = (u8) ch;44return ch;45 }46#endif4748/*使⽤microLib的⽅法*/49/*50int fputc(int ch, FILE *f)51{52 USART_SendData(USART1, (uint8_t) ch);5354 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}5556 return ch;57}58int GetKey (void) {5960 while (!(USART1->SR & USART_FLAG_RXNE));6162 return ((int)(USART1->DR & 0x1FF));63}64*/6566#if EN_USART1_RX //如果使能了接收67//串⼝1中断服务程序68//注意,读取USARTx->SR能避免莫名其妙的错误69 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最⼤USART_REC_LEN个字节.70//接收状态71//bit15,接收完成标志72//bit14,接收到0x0d73//bit13~0,接收到的有效字节数⽬74 u16 USART_RX_STA=0; //接收状态标记7576void uart_init(u32 bound){77//GPIO端⼝设置78 GPIO_InitTypeDef GPIO_InitStructure;79 USART_InitTypeDef USART_InitStructure;80 NVIC_InitTypeDef NVIC_InitStructure;8182 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 83//USART1_TX PA.984 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.985 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;86 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复⽤推挽输出87 GPIO_Init(GPIOA, &GPIO_InitStructure);8889//USART1_RX PA.1090 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;91 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输⼊92 GPIO_Init(GPIOA, &GPIO_InitStructure);9394//Usart1 NVIC 配置9596 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;97 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级398 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //⼦优先级399 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能100 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器101102//USART 初始化设置103104 USART_ART_BaudRate = bound;//⼀般设置为9600;105 USART_ART_WordLength = USART_WordLength_8b;//字长为8位数据格式106 USART_ART_StopBits = USART_StopBits_1;//⼀个停⽌位107 USART_ART_Parity = USART_Parity_No;//⽆奇偶校验位108 USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;//⽆硬件数据流控制109 USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式110111 USART_Init(USART1, &USART_InitStructure); //初始化串⼝112 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断113 USART_Cmd(USART1, ENABLE); //使能串⼝114115 }116117118119void USART1_IRQHandler(void) //串⼝1中断服务程序120 {121 u8 Res;122 #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使⽤ucosII了.123 OSIntEnter();124#endif125if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)126 {127 Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据128129if((USART_RX_STA&0x8000)==0)//接收未完成130 {131if(USART_RX_STA&0x4000)//接收到了0x0d132 {133if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始134else USART_RX_STA|=0x8000; //接收完成了135 }136else//还没收到0X0D137 {138if(Res==0x0d)USART_RX_STA|=0x4000;139else140 {141 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;142 USART_RX_STA++;143if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收144 }145 }146 }147 }148 #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使⽤ucosII了.149 OSIntExit();150#endif151 }152#endifusart.h1 #ifndef __USART_H2#define __USART_H3 #include "stdio.h"4 #include "sys.h"56//STM32F103核⼼板例程7//库函数版本例程8/********** 出品 ********/910//////////////////////////////////////////////////////////////////////////////////11//STM32开发板12//串⼝1初始化1314#define USART_REC_LEN 200 //定义最⼤接收字节数 20015#define EN_USART1_RX 1 //使能(1)/禁⽌(0)串⼝1接收1617extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最⼤USART_REC_LEN个字节.末字节为换⾏符18extern u16 USART_RX_STA; //接收状态标记19//如果想串⼝中断接收,请不要注释以下宏定义20void uart_init(u32 bound);21#endifmain.c1 #include "sys.h"2 #include "delay.h"3 #include "usart.h"45 uint8_t t;6 uint8_t len;7 uint16_t times=0;89int main(void)10 {11 delay_init(); //延时函数初始化12 uart_init(115200); //串⼝初始化为1152001314while(1)15 {16if(USART_RX_STA&0x8000) //USART_RX_STA第⼗六位为1则括号内为1,表⽰接收完数据17 {18 len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度19 printf("\r\n您发送的消息为:\r\n\r\n");20for(t=0;t<len;t++)21 {22 USART_SendData(USART1, USART_RX_BUF[t]);//向串⼝1发送数据23while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束24 }25 printf("\r\n\r\n");//插⼊换⾏26 USART_RX_STA=0;27 }else28 {29 times++;30if(times%500==0)printf("请输⼊数据,以回车键结束\n");31 delay_ms(10);32 }33 }34 }串⼝实验效果图:未发送时发送数据时:祝⼩伙伴们2020加油!。

STM32串口通信学习总结

STM32串口通信学习总结

STM32串口通信学习总结STM32是STMicroelectronics推出的一款32位单片机系列,具有高性能、低功耗、丰富的外设等特点,广泛应用于工业控制、消费电子、汽车电子等领域。

其中,串口通信是单片机中常用的通信方式之一,本文将对STM32串口通信学习进行总结。

1.串口通信原理及基础知识在STM32中,USART(通用同步/异步收发器)是负责串口通信的外设。

USART提供了多种模式的串口通信,包括异步模式(Asynchronous)、同步模式(Synchronous)以及单线模式(Single-wire)等。

2.STM32串口通信配置步骤(1)GPIO配置:首先需要配置串口通信所涉及的GPIO引脚,通常需要配置为复用功能,使其具备USART功能。

(2)USART配置:根据需要选择USART1、USART2、USART3等串口进行配置,设置通信模式、波特率等参数。

在配置时需要注意与外部设备的通信标准和参数保持一致。

(3)中断配置(可选):可以选择中断方式来实现串口数据的收发。

通过配置中断,当接收到数据时会触发中断,从而实现接收数据的功能。

(4)发送数据:通过USART的发送寄存器将数据发送出去,可以通过查询方式或者中断方式进行发送。

(5)接收数据:通过读取USART的接收寄存器,获取接收到的数据。

同样可以通过查询方式或者中断方式进行接收。

3.常见问题及解决方法(1)波特率设置错误:在进行串口通信时,波特率设置错误可能会导致通信失败。

需要根据外设的要求,选择适当的波特率设置,并在STM32中进行配置。

(2)数据丢失:在高速通信或大量数据传输时,由于接收速度跟不上发送速度,可能会导致数据丢失。

可以通过增加接收缓冲区大小、优化接收中断处理等方式来解决该问题。

(3)数据帧错误:在数据传输过程中,可能发生数据位错误、校验错误等问题。

可以通过对USART的配置进行检查,包括校验位、停止位、数据位等的设置是否正确。

stm32串口调参数

stm32串口调参数

stm32串口调参数串口调参数是指在使用STM32单片机进行串口通信时,需要通过设置一系列参数来控制串口的工作方式。

下面将详细介绍调整这些参数的方法:1. 总线速率(Baud Rate):通过修改USART_CR1寄存器的USART_CR1_BR位来设置串口的波特率。

BR通常是一个由APB1总线频率和所需波特率计算得出的值。

例如,如果APB1总线频率为72MHz,希望设置波特率为9600,那么BR的计算公式为:BR=APB1总线频率/所需波特率BR=72MHz/9600=7500通过设置USART_BRR寄存器的USART_BRR_DIV位为BR来实现调整。

2. 数据位长度(Data Bits):STM32单片机的USART_CR1寄存器的USART_CR1_M位用于设置数据位长度。

有两个选项可供选择:8位和9位。

3. 校验位(Parity Bits):STM32单片机的USART_CR1寄存器的USART_CR1_PCE位用于启用或禁用校验位。

如果启用校验位,还需要根据实际情况选择奇校验还是偶校验。

4. 停止位长度(Stop Bits):STM32单片机的USART_CR2寄存器的USART_CR2_STOP位用于设置停止位长度。

有两个选项可供选择:1位和2位。

5. 硬件流控制(Hardware Flow Control):如果需要使用硬件流控制,可以设置STM32单片机的USART_CR3寄存器的USART_CR3_RTSE、USART_CR3_CTSE和USART_CR3_CTSIE位。

6.中断控制:STM32单片机的USART_CR1寄存器的USART_CR1_TXEIE和USART_CR1_RXNEIE位可用于使能或禁用发送和接收中断。

7.DMA控制:STM32单片机的USART_CR3寄存器的USART_CR3_DMAT和USART_CR3_DMAR位可用于使能或禁用DMA传输。

调整这些参数的步骤如下:1.初始化串口:配置引脚,设置GPIO模式为复用模式,选择对应的复用功能映射,然后初始化USART控制器。

零死角玩转stm32-高级篇6、UsbDevice(模拟U盘)

零死角玩转stm32-高级篇6、UsbDevice(模拟U盘)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!6、UsbDevice(模拟U盘)6.1 实验描述及工程文件清单实验描述这是一个USB Mass Storage 实验,用USB线连接PC机与开发板,在电脑上就可以像操作普通U盘那样来操作开发板中的MicroSD卡,并在超级终端中打印出相应的调试信息。

在这里野火用的MicroSD卡的容量是1G。

硬件连接PE3-USB-MODE (PE3为普通I/O)PA11-USBDM(D-)PA12-USBDP(D+)用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/misc.cFWlib/stm32f10x_dma.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_flash.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/sdcard.cUSER/usb_istr.cUSER/usb_prop.cUSER/usb_pwr.cUSER/hw_config.cUSER/memory.cUSB文件usb_core.cusb_init.cusb_mem.cusb_regs.cusb_bot.cusb_scsi.cusb_data.cusb_desc.cusb_endp.c其中USER文件夹下红色标注的5个c文件也是USB库文件,只因为我们需要修改它们才没有把它们放在USBLIB目录下。

STM32调试方法

STM32调试方法

STM32调试方法STM32是一款非常受欢迎的单片机系列,广泛应用于各种嵌入式系统中。

在开发STM32项目时,调试是一个非常重要的环节,它能帮助开发者检测和解决程序中的问题。

本文将介绍STM32的调试方法,包括硬件调试和软件调试。

一、硬件调试硬件调试是通过硬件工具来实现的,通常使用的工具有JTAG、SWD和UART等。

下面将详细介绍这些调试工具的使用方法。

1.JTAG调试JTAG是一种用于测试和调试电子系统的接口标准,它能够提供对目标设备的非侵入式访问。

在STM32项目中,JTAG接口一般用于调试目的,下面是使用JTAG调试STM32的步骤:步骤1:连接JTAG调试器和目标设备。

将JTAG调试器的TCK、TMS、TDI、TDO和GND引脚分别连接到目标设备的相应引脚上。

步骤2:配置STM32的调试模式。

在STM32的配置文件中,将调试模式设置为JTAG模式。

步骤3:使用调试工具进行调试。

使用JTAG调试工具,如OpenOCD或J-Link等,连接到JTAG调试器,然后启动调试器进行调试。

调试工具会与STM32建立连接,并允许开发者对程序进行单步调试、断点设置等操作。

2.SWD调试SWD(Serial Wire Debug)是一种单线(加地线)调试接口,它是ARM公司推出的一种调试接口标准。

SWD相比JTAG接口更简洁、更省引脚,因此在STM32项目中被广泛应用。

下面是使用SWD调试STM32的步骤:步骤1:连接SWD调试器和目标设备。

将SWD调试器的SWCLK、SWDIO和GND引脚分别连接到目标设备的相应引脚上。

步骤2:配置STM32的调试模式。

在STM32的配置文件中,将调试模式设置为SWD模式。

步骤3:使用调试工具进行调试。

使用SWD调试工具,如ST-Link或J-Link等,连接到SWD调试器,然后启动调试器进行调试。

调试工具会与STM32建立连接,并允许开发者对程序进行单步调试、断点设置等操作。

【原创】stm32f407(cortex-M4)USART串口调试程序

【原创】stm32f407(cortex-M4)USART串口调试程序
【原创】stm32f407(cortex-M4)USART 串口调试程序
2012-04-26 20:33:43| 分类: stm32 |字号大中小 订阅 小枣年糕
上文通过调试 TIM1遇到了一些问题,深入了解了 stm32F407的复用功能。网上流传的很多 资料都是 cortex-M3的,现在都 M4了,观念自然得跟上,一味照搬没有自己的思考是不行 的。记得我最早的调试的程序就是串口 USART,刚入手嘛,就网上找了个例程,例程对 IO 复用是这么写的: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); //打开复用时钟 GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PA9 作为 US1 的 TX 端,打 开复用,负责发送数据 GPIO_Init(GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA10 作为 US1 的 RX 端,负责接收数据 GPIO_Init(GPIOA, &GPIO_InitStructure); 因为 M4没有复用时钟功能,故复用功能打开如下: GPIO_PinAFConfig(GPIOC, GPIO_PinSource6 | GPIO_PinSource7, GPIO_AF_USART6); //复用 RX 与 TX

零死角玩转stm32-高级篇1、SDIO(4bit + DMA、支持SDHC、带协议分析)

零死角玩转stm32-高级篇1、SDIO(4bit + DMA、支持SDHC、带协议分析)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!1、SDIO(4bit + DMA、支持SDHC)1.1 实验描述及工程文件清单实验描述MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。

没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上打印出来。

硬件连接PC12-SDIO-CLK:CLKPC10-SDIO-D2 :DATA2PC11-SDIO-D3:CD/DATA3PD2-SDIO-CMD :CMDPC8-SDIO-D0:DATA0PC9-SDIO-D1:DATA1用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/misc.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/sdio_sdcard.c野火STM32开发板 MicroSD卡硬件原理图:1.2 SDIO简介野火STM32开发板的CPU ( STM32F103VET6 )具有一个SDIO接口。

stm32 虚拟串口原理

stm32 虚拟串口原理

stm32 虚拟串口原理STM32的虚拟串口(Virtual COM Port)通常是通过USART(通用同步异步收发器)或者UART(通用异步收发器)实现的,它允许STM32与PC或其他设备通过串行通信进行数据交换。

虚拟串口的概念并不是STM32特有的,而是在很多嵌入式系统中都存在的一个概念。

这里简要介绍一下STM32虚拟串口的工作原理:1.硬件设置:首先,你需要在STM32上配置USART或UART的硬件参数,如波特率、数据位、停止位和校验位等。

这些参数需要与你的通信对端(通常是PC)的设置相匹配。

2.驱动编写:你需要为STM32编写USART或UART的驱动程序。

驱动程序通常包括初始化函数、发送数据函数和接收数据函数。

初始化函数用于设置USART或UART的硬件参数,发送和接收函数用于处理数据的发送和接收。

3.虚拟串口映射:在PC端,你需要安装一个虚拟串口驱动程序,这个驱动程序会在PC上创建一个或多个虚拟串口设备。

然后,你需要将STM32的USART或UART端口映射到PC上的一个虚拟串口设备上。

这通常是通过配置STM32的BOOT引脚和复位引脚来实现的。

4.数据通信:一旦STM32的USART或UART端口与PC的虚拟串口设备建立连接,你就可以通过这两个设备进行数据通信了。

STM32可以通过USART或UART发送数据到PC,PC也可以通过虚拟串口设备接收这些数据。

同样,PC也可以通过虚拟串口设备发送数据到STM32,STM32也可以通过USART或UART接收这些数据。

总的来说,STM32的虚拟串口就是通过USART或UART实现的一种串行通信方式,它允许STM32与PC 或其他设备进行数据交换。

1。

STM32中断法USART串口简单使用

STM32中断法USART串口简单使用

STM32中断法USART串口简单使用
1.初始化USART外设:首先需要在STM32的寄存器中对USART进行初始化。

具体的步骤包括:选择时钟源、配置波特率、设置数据长度、设置停止位、设置校验位等。

这些设置都可以在USART的控制寄存器中进行。

2.配置串口引脚:需要将USART的引脚与STM32的GPIO引脚进行连接。

具体的配置方法包括将GPIO引脚设置为复用功能,并且选择对应的USART信号。

3.编写中断服务函数:为了使用中断方式接收和发送数据,需要编写中断服务函数。

中断服务函数通常由硬件自动调用,当USART接收到数据或发送数据完成时触发。

在中断服务函数中,我们可以读取接收到的数据或者发送下一个数据。

4.使能中断:要使能USART的串口接收中断,需要在USART的控制寄存器中设置相应的位。

通常有RXNE和TC中断位,分别表示接收缓冲区非空和发送完成。

5.启动USART:启动USART外设,使其处于工作状态。

可以在相应的控制寄存器中设置TE(发送使能)和RE(接收使能)位。

6.外部中断配置:在STM32中,需要在NVIC寄存器中配置和使能USART接收中断的优先级。

这样才能通过中断向量表触发中断。

通过上述步骤,可以完成USART串口的简单使用,实现数据的接收和发送。

在编写中断服务函数时,可以根据实际需求进行数据处理,例如打印接收的数据或根据接收到的数据触发其他功能。

STM32HAL库UART的使用

STM32HAL库UART的使用

STM32HAL库UART的使⽤初始化⾸先讲下UART的初始化1.声明UART的初始化结构体,并赋值2.MX⽣成的代码会调⽤HAL_UART_MspInit();来初始化UART,当然这个代码也是⾃动⽣成,不过⽤户可以在这个函数⾥⾯添加⾃⼰想要添加的操作,时⾯包括了NVIC_Configuration,DMA_Configuration等,也可以添加⼀些置位操作如__HAL_UART_ENABLE,__HAL_UART_ENABLE_IT等等3.在HAL_UART_MspDeInit()中添加⼀些与HAL_UART_MspInit相反的操作来完成UART的重置操作对于以上的初始化操作,都可以由stm32cubemx⾃动⽣成,⽆需去具体配置寄存器。

⽽⽤户使⽤HAL库来驱动UART,在初始化好参数之后,官⽅提供了三种⽅式⼀、轮询模式(Polling mode IO operation)使⽤HAL_UART_Transmit()与HAL_UART_Receive()来配合超时操作来发送与接收数据以ECHO⽅式(即收到什么发什么)为例,这种⽅式进⾏操作⽤轮询⽅式的代码是⽐较简短的if(HAL_UART_Receive(&huart1, testReceiveData, 10, 1000) == HAL_OK){HAL_UART_Transmit(&huart1, testReceiveData, 10, 1000);}以这种⽅式就可以实现发送接收的数据,不过这种⽅式来处理的话,长度不定的时候,数据的丢失量会⽐较⼤减少等待超时,与调整BUFFER的长度都还是会有不同程度的数据丢失如果将BUFFER的长度调整为1,数据丢失量会减少,不过这个时候会出现UART⼯作⼀段时间之后就发⽣异常,因为UART发⽣ORE错误置位,需要将这个错误置位清除掉才可以再正常接收代码如下if(HAL_UART_Receive(&huart1, testReceiveData, 1, 10) == HAL_OK){HAL_UART_Transmit(&huart1, testReceiveData, 1, 10);}else{__HAL_UART_CLEAR_OREFLAG(&huart1);}如果将发送改为由寄存器直接操作的话if(HAL_UART_Receive(&huart1, testReceiveData, 1, 10) == HAL_OK){huart1.Instance->DR = testReceiveData[0];}else{__HAL_UART_CLEAR_OREFLAG(&huart1);}这样测试过来数据就没有丢失。

03STM32的串口设置步骤

03STM32的串口设置步骤

03STM32的串口设置步骤STM32系列微控制器具有多个串口接口,常用的有USART、UART和USB等。

下面是使用STM32的串口进行配置的一般步骤:1.初始化GPIO引脚:在使用串口之前,首先需要初始化相关的GPIO引脚。

需要配置的引脚包括串口的TX和RX引脚。

可以使用GPIO_Init(函数进行初始化,设置引脚的模式和输出电平。

2.使能串口时钟:在配置串口之前,需要先使能对应串口的时钟。

可以使用RCC_APBPeriphClockCmd(函数来使能时钟。

3.配置串口的参数:配置串口的波特率、数据位、停止位以及校验位等参数。

可以使用USART_Init(或UART_Init(函数进行配置。

4.使能串口:配置完串口参数之后,需要使能串口,才能开始进行数据的收发。

可以使用USART_Cmd(或UART_Cmd(函数进行使能。

5.发送数据:若需要发送数据,可以使用USART_SendData(或UART_SendData(函数将数据发送到相应的串口寄存器中。

6.接收数据:若需要接收数据,可以使用USART_ReceiveData(或UART_ReceiveData(函数从相应的串口寄存器中读取接收到的数据。

7.中断处理:对于大量的数据传输和实时的数据接收,一般会使用中断处理。

可以配置相关的中断使能,通过编写中断服务程序来处理接收到的数据。

需要注意的是,具体的配置步骤会根据使用的串口接口、芯片型号以及所用的开发环境有所不同。

在进行串口配置时,可以参考STM32提供的官方文档和示例代码,以确保配置正确和稳定运行。

STM32USART的使用

STM32USART的使用

STM32USART的使用USART是通用同步/异步收发器的缩写,它可以同时支持同步和异步通信模式。

USART有两个可配置的串行数据线,一个用于发送数据,另一个用于接收数据。

同时,USART还提供了硬件流控功能,可以实现数据流的控制,确保数据的可靠传输。

使用STM32USART模块,需要进行一系列的配置操作,包括时钟配置、GPIO引脚配置、USART模块初始化和中断配置等。

下面是一个基本的使用流程:1.配置USART时钟:首先需要使能USART外设对应的时钟。

通过设置相关的RCC寄存器或使用库函数来配置时钟。

2.配置GPIO引脚:选择合适的GPIO引脚作为USART的收发引脚。

通过设置GPIO寄存器或使用库函数来配置引脚。

ART初始化:配置USART外设的工作模式、波特率、数据位数、校验位、停止位等参数。

通过设置USART寄存器或使用库函数来初始化USART。

4.使能USART:使能USART外设,开始进行串口通信。

通过设置相应的USART寄存器或使用库函数来使能USART。

5.数据收发:通过USART的发送寄存器,向USART外设发送数据;通过USART的接收寄存器,从USART外设中读取接收到的数据。

6.中断配置:可选项,如果需要使用中断来处理USART数据收发,需要配置中断优先级和中断使能。

在STM32USART模块的使用过程中,需要注意一些常见问题:2.数据位数、校验位和停止位配置:根据通信协议要求,需要正确设置数据位数、校验位和停止位。

如果设置不正确,通信可能无法正常进行。

3.数据收发的时序:USART在数据收发时,需要遵循特定的时序要求。

在进行数据收发之前,要确保已经进行了正确的初始化,并且等待发送/接收缓冲区就绪。

4.DMA传输:STM32USART模块还支持通过DMA传输数据,可以大大减轻CPU的负担。

通过配置DMA外设进行数据传输,可以提高通信的效率。

综上所述,STM32USART模块是STM32系列微控制器中用于串行通信的重要外设模块。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!1、调试必备-串口(USART1)当我们在学习一款CPU的时候,最经典的实验莫过于流水灯了,会了流水灯的话就基本等于学会会操作I/O口了。

那么在学会操作I/O之后,面对那么多的片上外设我们又应该先学什么呢?有些朋友会说用到什么就学什么,听起来这也不无道理呀。

但对于野火来说会把学习串口的操作放在第二位。

在程序运行的时候我们可以通过点亮一个LED来显示代码的执行的状态,但有时候我们还想把某些中间量或者其他程序状态信息打印出来显示在电脑上,那么这时串口的作用就可想而知了。

1.1 异步串口通讯协议阅读过《STM32中文参考手册》的读者会发现,STM32的串口非常强大,它不仅支持最基本的通用串口同步、异步通讯,还具有LIN总线功能(局域互联网)、IRDA功能(红外通讯)、SmartCard功能。

为实现最迫切的需求,利用串口来帮助我们调试程序,本章介绍的为串口最基本、最常用的方法,全双工、异步通讯方式。

图 1-1为串口异步通讯协议。

图 1-1 异步串口通讯协议重温串口的通讯协议,我们知道要配置串口通讯,至少要设置以下几个参数:字长(一次传送的数据长度)、波特率(每秒传输的数据位数)、奇偶校验位、还有停止位。

对ST库函数的使用已经上手的读者应该能猜到,在初始化串口的时候,必然有一个串口初始化结构体,这个结构体的几个成员肯定就是有来存储这些控制参数的。

1.2 直通线和交叉线野火STM32开发板串口硬件原理图图 1-2 野火开发板串口硬件图见图 1-2,这是野火STM32开发板的接线图,使用的为MAX3232芯片,把STM32的PA10引脚(复用功能为USART1的Rx)接到了DB9接口的第2针脚,把PA9引脚(复用功能为USART的Tx)连接到了DB9接口的第3针脚。

Tx(发送端)接第3针脚,Rx(接收端)接第2针脚。

这种接法是跟PC 的串口接法一样的,如果要实现PC跟野火板子通讯,就要使用两头都是母的交叉线。

串口线主要分两种,直通线(平行线)和交叉线。

它们的区别见图 1-3。

假如PC与板子之间要实现全双工串口通讯,必然是PC的Tx针脚要连接到板子的Rx针脚,而PC的Rx针脚则要连接至板子的Tx针脚了。

由于板子和pc 的串口接法是相同的,就要使用交叉线来连接了。

如果有的开发板是Tx连接至DB9的第2针脚,而Rx连接至第3针脚,这与PC接法是相反的,这样的板子与PC通讯就需要使用直通线了。

为什么野火板子要使用PC的接法?假如使用非PC接法,由于板子与PC的接法相反,通讯就要使用直通线;但两个板子之间想要进行串口通讯时,由于接法相同,就要使用交叉线。

如果使用PC接法,板子与PC之间接法相同,通讯使用交叉线;两个相同板子之间接法也相同,通讯也是使用交叉线。

所以野火建议大家设计板子时,尽量采用与PC相同的标准串口接法。

图 1-3 交叉线与直通线的区别介绍直通线与交叉线的区别,一来是野火发现某些读者因为线的问题而花费了大量宝贵的时间。

二来是介绍串口线的DIY方法。

要实现基本的全双工异步通讯,只要3条线,分别为Rx、Tx、和GND。

如果读者正在为直通线、交叉线、公头、母头不匹配而烦恼,可以根据自己的需要,参照图 1-3,用三根杜邦线连接即可。

1.3 串口工作过程分析图 1-4 串口架构图串口外设的架构图看起来十分复杂,实际上对于软件开发人员来说,我们只需要大概了解串口发送的过程即可。

从下至上,我们看到串口外设主要由三个部分组成,分别是波特率的控制部分、收发控制部分及数据存储转移部分。

1.3.1波特率控制波特率,即每秒传输的二进制位数,用 b/s (bps)表示,通过对时钟的控制可以改变波特率。

在配置波特率时,我们向波特比率寄存器USART_BRR写入参数,修改了串口时钟的分频值USARTDIV。

USART_BRR寄存器包括两部分,分别是DIV_Mantissa(USARTDIV的整数部分)和DIVFraction(USARTDIV 的小数)部分,最终,计算公式为USARTDIV=DIV_Mantissa+(DIVFraction/16)。

USARTDIV是对串口外设的时钟源进行分频的,对于USART1,由于它是挂载在APB2总线上的,所以它的时钟源为f PCLK2;而USART2、3挂载在APB1上,时钟源则为f PCLK1,串口的时钟源经过USARTDIV分频后分别输出作为发送器时钟及接收器时钟,控制发送和接收的时序。

1.3.2收发控制围绕着发送器和接收器控制部分,有好多个寄存器:CR1、CR2、CR3、SR,即USART的三个控制寄存器(Control Register)及一个状态寄存器(Status Register)。

通过向寄存器写入各种控制参数,来控制发送和接收,如奇偶校验位,停止位等,还包括对USART中断的控制;串口的状态在任何时候都可以从状态寄存器中查询得到。

具体的控制和状态检查,我们都是使用库函数来实现的,在此就不具体分析这些寄存器位了。

1.3.3数据存储转移部分收发控制器根据我们的寄存器配置,对数据存储转移部分的移位寄存器进行控制。

当我们需要发送数据时,内核或DMA外设(一种数据传输方式,在下一章介绍)把数据从内存(变量)写入到发送数据寄存器TDR后,发送控制器将适时地自动把数据从TDR加载到发送移位寄存器,然后通过串口线Tx,把数据一位一位地发送出去,在数据从TDR转移到移位寄存器时,会产生发送寄存器TDR已空事件TXE,当数据从移位寄存器全部发送出去时,会产生数据发送完成事件TC,这些事件可以在状态寄存器中查询到。

而接收数据则是一个逆过程,数据从串口线Rx一位一位地输入到接收移位寄存器,然后自动地转移到接收数据寄存器RDR,最后用内核指令或DMA 读取到内存(变量)中。

1.4 串口通讯实验分析1.4.1实验描述及工程文件清单实验描述重新实现C库中的printf() 函数到串口1,这样我们就可以像用C库中的printf() 函数一样将信息通过串口打印到电脑,非常方便我们程序的调试。

硬件连接PA9 - USART1(Tx)PA10 - USART1(Rx)用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.c1.4.2 配置工程环境串口实验中我们用到了GPIO、RCC、USART这三个外设的库文件stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c,所以我们先要把这个库文件添加进工程,新建用户文件usart1.c 。

并在stm32f10x_conf.h 中把相应的头文件的注释去掉。

1./**2. ****************************************************************3. * @file Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h4. * @author MCD Application Team5. * @version V3.5.06. * @date 08-April-20117. * @brief Library configuration file.8. ******************************************************** /9.10.#include "stm32f10x_gpio.h"11.#include "stm32f10x_rcc.h"12.#include "stm32f10x_usart.h"1.4.3 main文件配置好要用的库的环境之后,我们就从main函数看起,层层剥离源代码。

1./*2. * 函数名:main3. * 描述:主函数4. * 输入:无5. * 输出:无6. */7.int main(void)8.{9./* USART1 config 115200 8-N-1 */10. USART1_Config();11.12. printf("\r\n this is a printf demo \r\n");13.14. printf("\r\n 欢迎使用野火M3实验板:) \r\n");15.16. USART1_printf(USART1, "\r\n This is a USART1_printf demo \r\n");17.18. USART1_printf(USART1, "\r\n ("__DATE__ " -" __TIME__ ") \r\n");19.20.for(;;)21. {22.23. }24.}首先调用函数USART1_Config(),函数USART1_Config()主要做了如下工作:1.使能了串口1的时钟2.配置好了usart1的I/O3.配置好了usart1的工作模式,具体为波特率为 115200 、8个数据位、1个停止位、无硬件流控制。

即 115200 8-N-1。

1.4.4 USART初始化配置具体的USART1_Config()在usart1.c这个用户文件中实现:1./*2. * 函数名:USART1_Config3. * 描述:USART1 GPIO 配置,工作模式配置。

115200 8-N-14. * 输入:无5. * 输出 : 无6. * 调用:外部调用7. */8.void USART1_Config(void)9.{10. GPIO_InitTypeDef GPIO_InitStructure;11. USART_InitTypeDef USART_InitStructure;12.13./* config USART1 clock */14. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);15.16./* USART1 GPIO config */17./* Configure USART1 Tx (PA.09) as alternate function push-pull */18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;21. GPIO_Init(GPIOA, &GPIO_InitStructure);22./* Configure USART1 Rx (PA.10) as input floating */23. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;24. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;25. GPIO_Init(GPIOA, &GPIO_InitStructure);26.27./* USART1 mode config */28. USART_ART_BaudRate = 115200;29. USART_ART_WordLength = USART_WordLength_8b;30. USART_ART_StopBits = USART_StopBits_1;31. USART_ART_Parity = USART_Parity_No ;32. USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;33. USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;34. USART_Init(USART1, &USART_InitStructure);35. USART_Cmd(USART1, ENABLE);36.}在代码的第14行,调用了库函数RCC_APB2PeriphClockCmd()初始化了USART1和GPIOA的时钟,这是因为使用了GPIOA的PA9和PA10的默认复用USART1的功能,在使用复用功能的时候,要开启相应的功能时钟USART1。

相关文档
最新文档