stm32f103c8t6 usart1不工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32f103c8t6 usart1不工作相关的知识,希望对你有一定的参考价值。
初学stm32f103,LED闪烁已成功,在此基础上,在LED每次闪烁后,通过USART1向外发送一个数字,从0开始累加。发现问题如下:1、LED闪烁正常。2、单步调试发现LED闪烁后发送数据调用正常。3、通过逻辑分析仪发现USART1的PA9无数据输出,始终都是高电平。请问到底我的程序什么地方错了呢?
参考技术A首先GPIO配置中因为你是使用了USART复用功能所以需要打开以下时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
一般我的STM32串口发送多配置为DMA模式,读取使用中断模式。串口确实可以不使用中断模式(采用轮询但是很影响芯片效率,除非你得单片机就做一个串口读写)。而你的程序配置了串口读中断使能但是没有配置中断NVIC相关。
//Usart1 NVIC ÅäÖÃ
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure);
说说开发中常用的USART的协议和工作原理
1、什么是串口USART?
USART是全双工通用同步/异步收发器,是一种串行的通信设备。在嵌入式开发设计中经常被使用到,广泛的被应用于主机与外围设备的通信交互中,应用相当的广泛。
1.1、串口中的 UART 和 USART有什么不同?
UART:指的是通用异步收发器;
USART:指的是通用同步和异步收发器。
当只使用异步通信功能时,这两者是没有区别的,区别在于USART比UART多了同步(时钟)通信功能。
2、通信方式有哪些?
2.1、并行通信
并行通信指的是数据同时在多根数据线上进行发送或者接收。如下所示:
并行通信的优点:控制方式简单,传输速度快,适用于距离比较近的传输。
并行通信的缺点:占用的数据线较多,对MCU资源少的单片机而言不是很友好,线路布局变复杂。
2.2、串行通信
串行通信指的是数据在同一根数据线上依次按位(bit)进行发送或者接收。如下图所示:
串行通信方式的优点:占用数据线少,适合用于远距离传输,系统布线简单;
串行通信方式的缺点:控制方式复杂,传输速度较并行通信的方式要慢。
3、串行通信方式中的两种方式
3.1、同步串行通信方式
同步通信的方式是发送方和接收方都必须采用同一个时钟,收发双方利用时钟信号来确定每个信号位。如下图所示:
这种方式把多个字符组成一个信息帧,每帧的开头用同步字符来指示,是一种连续传送数据的通信方式。即使在传输中没有信息需要传输时,因为同步传输不允许中间有空隙,所以也要填上空字符。如下图所示:
3.2、异步串行通行方式
异步串行通信方式是指通信的双方使用各自的时钟,以一个字符作为数据传输单元并且发送方发送字符的时间间隔不一定,是一种不规则数据段传送的通信方式。如下图所示:
4、串行通信方式的传送方向
根据串行数据的传输方向,可以将通信分为单工、半双工、全双工。
1)单工:是指数据传输仅能沿一个方向,不能实现反向传输。
2)半双工:是指数据传输可以沿两个方向,但需要分时进行传输。
3)全双工:是指数据可以同时进行双向传输。
5、常用到的 USART 通信方式
在嵌入式中最常使用到的就是异步全双工的USART通信方式,收发两方各自使用自身的时钟,收发可以相互独立的进行。数据传输的示意图如下:
异步串行通信是将一个字节数据加上起始位、校验位、停止位,构成的字符帧。由于异步通信没有同步时钟,所以接收端要时刻处于接收状态。
起始位:在没有数据需要传送时,此时通信线上为逻辑“1”状态。当发送端要发送一个字符时,首先发送一个逻辑“0”信号,即起始位,告诉接收端要开始发送一帧数据了。接收端检测到这个低电平时,就开始准备接收数据信息了。
数据位:在起始位发送完毕之后,发送端发出的就是数据位了,数据位一般是没有严格的规定的,5~9位都可以。一般是低位先发,高位后发,按位依次进行传输。平时使用中一般都是选择8bit的。
校验位:数据位发送完成之后,为了检验数据在传输过程中是否有出错,可以选择发送一个位进行校验。使用的是奇偶校验,当然也可以选择不进行检验。
波特率:是指数据传输的速率。表示每秒钟传送的bit位数。比如,一秒钟传送了120个字符,每个字符传送10个bit(1个起始位 + 8个数据位 + 1个停止位),那么:波特率 = 10x120 = 1200 (bit/s)。平常使用中常用的波特率有9600、115200、19200、25600等。
6、GD32 与 STM32 的 USART 的差异
6.1、USART编号上的差异
通过对比GD32和STM32同样内核已经同样引脚数的MCU手册可以知道,两者是有区别的。如下图:
6.2、通信协议上的细微差异
GD在连续发送数据的时候每两个字节之间会有一个Bit的Idle,而STM32没有,如下图为GD的发送波形:
GD的串口在发送的时候停止位只有1/2两种停止位模式。STM32有0.5/1/1.5/2四种停止位模式。
GD 和STM32 USART的这两个差异对通信基本没有影响,只是GD的通信时间会加长一点。
以上是关于stm32f103c8t6 usart1不工作的主要内容,如果未能解决你的问题,请参考以下文章
STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发
三实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
三实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
三实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方