锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

stm32串口通信

时间:2022-09-06 21:30:00 36v指示灯串电阻2c公形引脚插头线对线连接器led串电容1608b1贴片电容18种常用贴片三极管包型公头负载终端连接器

目录

一.串口通信协议简介

二.RS-232标准

三.RS232电平与TTL电平的区别

芯片模块为例)的工作原理。-toc' style="margin-left:0px;">四.USB/TTL转232"模块(以CH以340芯片模块为例)工作原理。

五.安装 stm32CubeMX

六.LED流水灯

七.观察GPIO波形

八.总结


一.串口通信协议简介

串口通讯(Serial Communication)是设备间常用的串行通信方式,电子工程师在调试设备时经常使用这种通信方式输出调试信息。我们以分层的方式理解通信协议,最基本的是将其分为物理层和协议层。物理层规定,通信系统具有机电功能部分的特点,以确保物理媒体中原始数据的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

二.RS-232标准

RS-232标准接口(又称EIA RS-232)是美国电子工业协会常用的串行通信接口标准之一(EIA)1970年,贝尔系统公司、调制解调器制造商和计算机终端制造商联合制定了其全名数据终端设备( DTE)以及数据通信设备(DCE)串行二进制数据交换接口技术标准。

rs232??9é???¥?£

串行通信时,要求通信双方使用标准接口,使不同的设备能够轻松连接通信。RS-232-C接口(又称EIARS-232-C)是目前最常用的一种串行通讯接口。(“RS-232-C”中的“-C只是表示RS-232版,所以与RS-简称232)。

1970年,美国电子工业协会(EIA)串行通信标准由贝尔系统、调制解调器制造商和计算机终端制造商联合制定。它的全名是数据终端设备(DTE)数据通信设备(DCE)串行二进制数据交换接口技术标准本标准规定25脚DB-25连接器规定了连接器每个引脚的信号内容和各种信号的电平。后来IBM的PC机将RS232简化成了DB-9连接器成为事实标准。工业控制RS-一般只使用232口RXD、TXD、GND三条线。

传统的串行接口标准包括 22 根线,采用标准 25 芯 D 型插头座(DB25)后来简化为使用 9 芯 D 型

插座(DB9),现在在应用中 25 很少使用芯插头座。 就像现在说的几行串口,一般是指使用了几条线,最初 RS-232 串口是 25 针,所有针脚

义都有用,后来变成了 9 针的,所谓全功能串口就是所有的针脚定义都使用上了,例如流量控制,握手

信号等都是有用的。一般来说,国外产品做产品比较规则,所有串口信号都做好了。但国内技术

人发现,其实 RS-232 串口的主要用途是 2,3 如果不使用其他接口,就不会有很大的接口

所以,就在这里 9 在针的基础上简化,所以有所谓的 2,3,4,5,6,8 线的串口出来了。

2 线串口只有 RXD,TXD 两条基本收发信号线;3 线串口除了 RXD 和 TXD,还有 GND;所谓 4~9

线只是在 TXD 和 RXD 根据实际需要设计相应的控制信号线。一般来说,使用 5 线

的 232 通信增加了硬件流控,即 RTS,CTS 如果你的通信,信号主要是为了保证高速通信的可靠性

速度不是很高,你可以忽略它。根据信息传输方向,串行通信可进一步分为单工、半双工和全双工

三种工作。信息只能单向传输为单工;信息可以双向传输,但不能同时双向传输称为半双工;信息可以同时双向传输

传输称为全双工。


三.RS232电平与TTL电平的区别

结论:TTL电平和RS无论是在电压范围还是极性上,232电平(RS232是负逻辑)差别很大。显然,这两个电平不能直接连接。为了单片机TTL电平转换成RS通常我们需要一个特殊的转换芯片,如232电平SP3232。

RS232是工业上常用的串口标准,无论是PLC的RS232串口模块,或工控机串口模块(COM),输出电平称为RS232电平。同时,我们知道这些模块的内部控制单元是单片机,其电平为TTL电平。

TTL电平

TTL(Transistor-Transistor Logic,晶体管-晶体管逻辑),TTL电平即TTL电路输出电平,TTL工作电压为5V,它的输出可以是高电平(3.6V)或低电平(0.3V)。为了用这种模拟电压来表示数字量的逻辑1和逻辑0,TTL电平规定:

输出电路:电压大于等于等于(≥)2.4V逻辑1;电压小于等于等于;(≤)0.4V为逻辑0;

输入电路:电压大于或等于(≥)2.0V逻辑1;电压小于等于等于;(≤)0.8V为逻辑0;

RS232电平

RS1962年,美国电子工业协会发布了串行通信接口标准,RS即Recomend Standard,推荐标准,232为标号。本标准规定了串行通信的物理接口和逻辑电平。最简单的RS232通信由三条数据线组成,即TxD、RxD和GND。RS232采用负逻辑电平,即-15V~-3V代表逻辑"1", 3V~ 15V代表逻辑"0"。这里的电平,是的TxD线(或者RxD线)相对于GND的电压。

1.电平的上限和下限定义不同,CMOS抗噪区域较大。 如果是5伏供电,ttl一般是1.7V和3.5V的样子,CMOS一般是2.2V,2.9V的样子,不准确,仅供参考。

2.电流驱动能力不同,ttl一般提供25毫安的驱动能力,CMOS一般在10毫安左右。

3.所需的电流输入尺寸一般不同ttl需要2.5毫安左右,CMOS几乎不需要电流输入。

4.许多设备兼容TTL和CMOS的,datasheet会有解释。如果不考虑速度和性能,一般设备可以交换。但需要注意的是,有时负载效应会导致电路异常工作,因为有些ttl电路需要下一级输入阻抗作为负载才能正常工作。TTL电路和CMOS电路逻辑电平
VOH: 逻辑电平 1 的输出电压
VOL: 逻辑电平 0 的输出电压
VIH : 逻辑电平 1 的输入电压
VIH : 逻辑电平 0 的输入电压
6.TTL和CMOS逻辑电平转换
CMOS电平能驱动TTL电平
TTL无法驱动电平CMOS电平时,应增加拉电阻。

四.USB/TTL转232"模块(以CH以340芯片模块为例)工作原理。


TXD:发送端一般表示为自己的发送端,正常通信必须连接另一个设备RXD。

RXD:接收端一般表示为自己的接收端,正常通信必须连接另一个设备TXD。
正常通信本身TXD永远接设备RXD!

自收自发:正常通信时RXD接其他设备TXD,因此,如果你想接收你发送的数据,顾名思义,也就是说,你接收你发送的数据,即你自己TXD直接连接到RXD,测试本身的发送和接收是否正常是最快、最简单的测试方法,当出现问题时先做该测试确定是否产品故障。也称回环测试。

电平逻辑:

TTL电平:通常数据表示采用二进制,规定+5V等价于逻辑“1”,0V等价于逻辑“0”,称作TTL信号系统,是正逻辑

RS232电平:采用-12V到-3V,等价于逻辑“0”,+3V到+12V的逻辑电平,等价于逻辑“1”,是负逻辑的。

产品说明:

1、主芯片为CP2102,安装驱动后生成虚拟串口

2、USB取电,引出接口包括3.3V(《40mA),5V,GND,TX,RX,信号脚电平为3.3V,正逻辑

3、板载状态指示灯、收发指示灯,正确安装驱动后状态指示灯会常亮,收发指示灯在通信的时候会闪烁,波特率越高亮度越低

4、支持从300bps~1Mbps间的波特率

5、通信格式支持:1)5,6,7,8位数据位;2)支持1,1.5,2停止位;3)odd,even,mark,space,none校验

6、支持操作系统:windowsvista/xp/server2003/200,MacOS-X/OS-9,Linux

7、USB头为公头,可直接连接电脑USB口

8、贴片元件为SMT工艺生产,质量稳定

9、不含USB头体积为:33*15(mm)

模块与单片机请遵循以下连接:

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

usb转ttl电路图(一):USB转3线制RS232串口
图中也是USB转3线制RS232串口,只是输出RS232信号的电平幅度略低。CH340的R232引脚为高电平,启用了辅助RS232功能,只需外加二极管、三极管、电阻和电容就可代替7.2.节中专用的电平转换电路U5,所以硬件成本更低。

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

usb转ttl电路图(二):USB转RS232串口
图中是USB转最基本也最常用的3线制RS232串口,U5为MAX232/ICL232/SP232等。

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

usb转ttl电路图(三):USB转9线串口
下图是由CH340T实现的USB转RS232串口。CH340提供了常用的串口信号及MODEM信号,通过电平转换电路U8将TTL串口转换为RS232串口,端口P11是DB9插针,其引脚及功能与计算机的普通9针串口相同,U8的类似型号有MAX213/ADM213/SP213/MAX211等。

如果只需要实现USB转TTL串口,那么可以去掉图中的U8及电容C46/C47/C48/C49/C40。图中的信号线可以只连接RXD、TXD以及公共地线,其它信号线根据需要选用,不需要时都可以悬空。

P2是USB端口,USB总线包括一对5V电源线和一对数据信号线,通常,+5V电源线是红色,接地线是黑色,D+信号线是绿色,D-信号线是白色。USB总线提供的电源电流最大可以达到500mA,一般情况下,CH340芯片和低功耗的USB产品可以直接使用USB总线提供的5V电源。如果USB产品通过其它供电方式提供常备电源,那么CH340也应该使用该常备电源,如果需要同时使用USB总线的电源,那么可以通过阻值约为1Ω的电阻连接USB总线的5V电源线与USB产品的5V常备电源,并且两者的接地线直接相连接。

C8容量为4700pF到0.02μF,用于CH340内部电源节点退耦,C9容量为0.1μF,用于外部电源退耦。晶体X2、电容C6和C7用于时钟振荡电路。X2是频率为12MHz的石英晶体,C6和C7是容量为22pF的独石或高频瓷片电容。如果X2选用低成本的陶瓷晶体,那么C6和C7的容量必须用该晶体厂家的推荐值,一般情况下是47pF。

在设计印刷线路板PCB时,需要注意:退耦电容C8和C9尽量靠近CH340的相连引脚;使D+和D-信号线贴近平行布线,尽量在两侧提供地线或者覆铜,减少来自外界的信号干扰;尽量缩短XI和XO引脚相关信号线的长度,为了减少高频干扰,可以在相关元器件周边环绕地线或者覆铜。

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

usb转ttl电路图(四)
USB转串口设计原理

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

USB接口:主要由3部分组成:USB接头、USB供电、USB数据收发,其原理如如下:

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

1.USB接头:提供USB物理接口,通过USB线与USB设备进行连接。

2.USB供电:整个USB转串口线无需外接电源,直接使用USB供电即可。

3.USB数据收发:USB接口与USB转串口芯片主芯片(PL2303)的通讯。

USB转串口主芯片:USB转串口主芯片模块,USB转串口主芯片是电路的核心部分,提供USB和串口的桥转换,它主要由三个部分组成,分别是USB转串口芯片PL2303、PL2303工作晶振和PL2303外围电路。

1.USB转串口主芯片:USB转串口芯片内部功能框图如下:

usb转ttl电路图大全(RS232/串口/CH340T/PL2303)

2.PL2303工作晶振:提供PL2303工作时钟,最大支持12M频率。

3.PL2303外围电路:依据PL2303数据手册要求添加外围电路,具体各外围电路功能,见PL2303手册。

RS232接口:RS232接口部分实现串口RS232电平与TTL电平的转换。模块原理图如下,主要由2个部分组成,SP232EH芯片、串口接口。

1.SP213EH芯片:将SP2303的TTL电平的串行接口,转换成普通的RS232电平。以及将普通的RS232电平电平转换成TTL电平串行接口。

2.标准的DB9公头,可以直接设备进行数据通信。

 

五.安装 stm32CubeMX

1.官网下载www.st.com/stm32cubemx

 

打安装包

 

 

 

 

 

2.安装HAL库

打开安装好的 STM32CubeMX 软件  点上面的Help -> Manage embedded software packages 

 

会跳出来一个选择型号界面   勾选上你要安装的HAL库, 点击“Install Now” 直到安装成功。 如下图:

 到此,恭喜你的STM32 CubeMx安装成功了。

六.LED流水灯

1.在keil下新建项目

 2.选择芯片

 

 

 

main.s

;RCC寄存器地址映像             
RCC_BASE            EQU    0x40021000 
RCC_CR              EQU    (RCC_BASE + 0x00) 
RCC_CFGR            EQU    (RCC_BASE + 0x04) 
RCC_CIR             EQU    (RCC_BASE + 0x08) 
RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C) 
RCC_APB1RSTR        EQU    (RCC_BASE + 0x10) 
RCC_AHBENR          EQU    (RCC_BASE + 0x14) 
RCC_APB2ENR         EQU    (RCC_BASE + 0x18) 
RCC_APB1ENR         EQU    (RCC_BASE + 0x1C) 
RCC_BDCR            EQU    (RCC_BASE + 0x20) 
RCC_CSR             EQU    (RCC_BASE + 0x24) 
                              
;AFIO寄存器地址映像            
AFIO_BASE           EQU    0x40010000 
AFIO_EVCR           EQU    (AFIO_BASE + 0x00) 
AFIO_MAPR           EQU    (AFIO_BASE + 0x04) 
AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08) 
AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C) 
AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10) 
AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14) 
                                                           
;GPIOA寄存器地址映像              
GPIOA_BASE          EQU    0x40010800 
GPIOA_CRL           EQU    (GPIOA_BASE + 0x00) 
GPIOA_CRH           EQU    (GPIOA_BASE + 0x04) 
GPIOA_IDR           EQU    (GPIOA_BASE + 0x08) 
GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C) 
GPIOA_BSRR          EQU    (GPIOA_BASE + 0x10) 
GPIOA_BRR           EQU    (GPIOA_BASE + 0x14) 
GPIOA_LCKR          EQU    (GPIOA_BASE + 0x18) 
                                                       
;GPIO C口控制                   
GPIOC_BASE          EQU    0x40011000 
GPIOC_CRL           EQU    (GPIOC_BASE + 0x00) 
GPIOC_CRH           EQU    (GPIOC_BASE + 0x04) 
GPIOC_IDR           EQU    (GPIOC_BASE + 0x08) 
GPIOC_ODR           EQU    (GPIOC_BASE + 0x0C) 
GPIOC_BSRR          EQU    (GPIOC_BASE + 0x10) 
GPIOC_BRR           EQU    (GPIOC_BASE + 0x14) 
GPIOC_LCKR          EQU    (GPIOC_BASE + 0x18) 
                                                           
;串口1控制                       
USART1_BASE         EQU    0x40013800 
USART1_SR           EQU    (USART1_BASE + 0x00) 
USART1_DR           EQU    (USART1_BASE + 0x04) 
USART1_BRR          EQU    (USART1_BASE + 0x08) 
USART1_CR1          EQU    (USART1_BASE + 0x0c) 
USART1_CR2          EQU    (USART1_BASE + 0x10) 
USART1_CR3          EQU    (USART1_BASE + 0x14) 
USART1_GTPR         EQU    (USART1_BASE + 0x18) 
                            
;NVIC寄存器地址                
NVIC_BASE           EQU    0xE000E000 
NVIC_SETEN          EQU    (NVIC_BASE + 0x0010)     
;SETENA寄存器阵列的起始地址 
NVIC_IRQPRI         EQU    (NVIC_BASE + 0x0400)     
;中断优先级寄存器阵列的起始地址 
NVIC_VECTTBL        EQU    (NVIC_BASE + 0x0D08)     
;向量表偏移寄存器的地址     
NVIC_AIRCR          EQU    (NVIC_BASE + 0x0D0C)     
;应用程序中断及复位控制寄存器的地址                                                
SETENA0             EQU    0xE000E100 
SETENA1             EQU    0xE000E104 
                            
                              
;SysTick寄存器地址            
SysTick_BASE        EQU    0xE000E010 
SYSTICKCSR          EQU    (SysTick_BASE + 0x00) 
SYSTICKRVR          EQU    (SysTick_BASE + 0x04) 
                              
;FLASH缓冲寄存器地址映像     
FLASH_ACR           EQU    0x40022000 
                             
;SCB_BASE           EQU    (SCS_BASE + 0x0D00) 
                             
MSP_TOP             EQU    0x20005000               
;主堆栈起始值                
PSP_TOP             EQU    0x20004E00               
;进程堆栈起始值             
                            
BitAlias_BASE       EQU    0x22000000               
;位带别名区起始地址         
Flag1               EQU    0x20000200 
b_flas              EQU    (BitAlias_BASE + (0x200*32) + (0*4))               
;位地址 
b_05s               EQU    (BitAlias_BASE + (0x200*32) + (1*4))               
;位地址 
DlyI                EQU    0x20000204 
DlyJ                EQU    0x20000208 
DlyK                EQU    0x2000020C 
SysTim              EQU    0x20000210 


;常数定义 
Bit0                EQU    0x00000001 
Bit1                EQU    0x00000002 
Bit2                EQU    0x00000004 
Bit3                EQU    0x00000008 
Bit4                EQU    0x00000010 
Bit5                EQU    0x00000020 
Bit6                EQU    0x00000040 
Bit7                EQU    0x00000080 
Bit8                EQU    0x00000100 
Bit9                EQU    0x00000200 
Bit10               EQU    0x00000400 
Bit11               EQU    0x00000800 
Bit12               EQU    0x00001000 
Bit13               EQU    0x00002000 
Bit14               EQU    0x00004000 
Bit15               EQU    0x00008000 
Bit16               EQU    0x00010000 
Bit17               EQU    0x00020000 
Bit18               EQU    0x00040000 
Bit19               EQU    0x00080000 
Bit20               EQU    0x00100000 
Bit21               EQU    0x00200000 
Bit22               EQU    0x00400000 
Bit23               EQU    0x00800000 
Bit24               EQU    0x01000000 
Bit25               EQU    0x02000000 
Bit26               EQU    0x04000000 
Bit27               EQU    0x08000000 
Bit28               EQU    0x10000000 
Bit29               EQU    0x20000000 
Bit30               EQU    0x40000000 
Bit31               EQU    0x80000000 


;向量表 
    AREA RESET, DATA, READONLY 
    DCD    MSP_TOP            ;初始化主堆栈 
    DCD    Start              ;复位向量 
    DCD    NMI_Handler        ;NMI Handler 
    DCD    HardFault_Handler  ;Hard Fault Handler 
    DCD    0                   
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    SysTick_Handler    ;SysTick Handler 
    SPACE  20                 ;预留空间20字节 








                 
;代码段 
    AREA |.text|, CODE, READONLY 
    ;主程序开始 
    ENTRY                            
    ;指示程序从这里开始执行 
Start 
    ;时钟系统设置 
    ldr    r0, =RCC_CR 
    ldr    r1, [r0] 
    orr    r1, #Bit16 
    str    r1, [r0] 
    ;开启外部晶振使能  
    ;启动外部8M晶振 
                                            
ClkOk           
    ldr    r1, [r0] 
    ands   r1, #Bit17 
    beq    ClkOk 
    ;等待外部晶振就绪 
    ldr    r1,[r0] 
    orr    r1,#Bit17 
    str    r1,[r0] 
    ;FLASH缓冲器 
    ldr    r0, =FLASH_ACR 
    mov    r1, #0x00000032 
    str    r1, [r0] 
            
    ;设置PLL相环倍率为7,HSE输入不分频 
    ldr    r0, =RCC_CFGR 
    ldr    r1, [r0] 
    orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) 
    orr    r1, #Bit10 
    str    r1, [r0] 
    ;启动PLL锁相环 
    ldr    r0, =RCC_CR 
    ldr    r1, [r0] 
    orr    r1, #Bit24 
    str    r1, [r0] 
PllOk 
    ldr    r1, [r0] 
    ands   r1, #Bit25 
    beq    PllOk 
    ;选择PLL时钟作为系统时钟 
    ldr    r0, =RCC_CFGR 
    ldr    r1, [r0] 
    orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) 
    orr    r1, #Bit10 
    orr    r1, #Bit1 
    str    r1, [r0] 
    ;其它RCC相关设置 
    ldr    r0, =RCC_APB2ENR 
    mov    r1, #(Bit14 :OR: Bit4 :OR: Bit2) 
    str    r1, [r0]      


    ;IO端口设置 
    ldr    r0, =GPIOC_CRL 
    ldr    r1, [r0] 
    orr    r1, #(Bit28 :OR: Bit29)          
    ;PC.7输出模式,最大速度50MHz  
    and    r1, #(~Bit30 & ~Bit31)   
    ;PC.7通用推挽输出模式 
    str    r1, [r0] 
            
    ;PA9串口0发射脚 
    ldr    r0, =GPIOA_CRH 
    ldr    r1, [r0] 
    orr    r1, #(Bit4 :OR: Bit5)          
    ;PA.9输出模式,最大速度50MHz  
    orr    r1, #Bit7 
    and    r1, #~Bit6 
    ;10:复用功能推挽输出模式 
    str    r1, [r0]    


    ldr    r0, =USART1_BRR   
    mov    r1, #0x271 
    str    r1, [r0] 
    ;配置波特率-> 115200 
                   
    ldr    r0, =USART1_CR1   
    mov    r1, #0x200c 
    str    r1, [r0] 
    ;USART模块总使能 发送与接收使能 
    ;71 02 00 00   2c 20 00 00 
             
    ;AFIO 参数设置             
    ;Systick 参数设置 
    ldr    r0, =SYSTICKRVR           
    ;Systick装初值 
    mov    r1, #9000 
    str    r1, [r0] 
    ldr    r0, =SYSTICKCSR           
    ;设定,启动Systick 
    mov    r1, #0x03 
    str    r1, [r0] 
            
    ;NVIC                     
    ;ldr   r0, =SETENA0 
    ;mov   r1, 0x00800000 
    ;str   r1, [r0] 
    ;ldr   r0, =SETENA1 
    ;mov   r1, #0x00000100 
    ;str   r1, [r0] 
              
    ;切换成用户级线程序模式 
    ldr    r0, =PSP_TOP                   
    ;初始化线程堆栈 
    msr    psp, r0 
    mov    r0, #3 
    msr    control, r0 
              
    ;初始化SRAM寄存器 
    mov    r1, #0 
    ldr    r0, =Flag1 
    str    r1, [r0] 
    ldr    r0, =DlyI 
    str    r1, [r0] 
    ldr    r0, =DlyJ 
    str    r1, [r0] 
    ldr    r0, =DlyK 
    str    r1, [r0] 
    ldr    r0, =SysTim 
    str    r1, [r0] 
               
;主循环            
main            
    ldr    r0, =Flag1 
    ldr    r1, [r0] 
    tst    r1, #Bit1                 
    ;SysTick产生0.5s,置位bit 1 
    beq    main                  ;0.5s标志还没有置位       
     
    ;0.5s标志已经置位 
    ldr    r0, =b_05s                
    ;位带操作清零0.5s标志 
    mov    r1, #0 
    str    r1, [r0] 
    bl     LedFlas 


    mov    r0, #'H' 
    bl     send_a_char
	
	mov    r0, #'e' 
    bl     send_a_char
	
	mov    r0, #'l' 
    bl     send_a_char
	
	mov    r0, #'l' 
    bl     send_a_char
	
	mov    r0, #'o' 
    bl     send_a_char
	
	mov    r0, #' ' 
    bl     send_a_char
	
	mov    r0, #'w' 
    bl     send_a_char
	
	mov    r0, #'o' 
    bl     send_a_char
	
	mov    r0, #'r' 
    bl     send_a_char
	
	mov    r0, #'l' 
    bl     send_a_char
	
	mov    r0, #'d' 
    bl     send_a_char
	
	mov    r0, #'\n' 
    bl     send_a_char
	
	b      main
            
              
            
;子程序 串口1发送一个字符 
send_a_char 
    push   {r0 - r3} 
    ldr    r2, =USART1_DR   
    str    r0, [r2] 
b1 
    ldr    r2, =USART1_SR  
    ldr    r2, [r2] 
    tst    r2, #0x40 
    beq    b1 
    ;发送完成(Transmission complete)等待 
    pop    {r0 - r3} 
    bx     lr 


                 
;子程序 led闪烁 
LedFlas      
    push   {r0 - r3} 
    ldr    r0, =Flag1 
    ldr    r1, [r0] 
    tst    r1, #Bit0 
    ;bit0 闪烁标志位 
    beq    ONLED        ;为0 打开led灯 
    ;为1 关闭led灯 
    ldr    r0, =b_flas 
    mov    r1, #0 
    str    r1, [r0] 
    ;闪烁标志位置为0,下一状态为打开灯 
    ;PC.7输出0 
    ldr    r0, =GPIOC_BRR 
    ldr    r1, [r0] 
    orr    r1, #Bit7 
    str    r1, [r0] 
    b      LedEx 
ONLED       
    ;为0 打开led灯 
    ldr    r0, =b_flas 
    mov    r1, #1 
    str    r1, [r0] 
    ;闪烁标志位置为1,下一状态为关闭灯 
    ;PC.7输出1 
    ldr    r0, =GPIOC_BSRR 
    ldr    r1, [r0] 
    orr    r1, #Bit7 
    str    r1, [r0] 
LedEx        
    pop    {r0 - r3} 
    bx     lr 
                                
;异常程序 
NMI_Handler 
    bx     lr 


HardFault_Handler 
    bx     lr 
              
SysTick_Handler 
    ldr    r0, =SysTim 
    ldr    r1, [r0] 
    add    r1, #1 
    str    r1, [r0] 
    cmp    r1, #500 
    bcc    TickExit 
    mov    r1, #0 
    str    r1, [r0] 
    ldr    r0, =b_05s  
    ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位 
    ;位带操作置1 
    mov    r1, #1 
    str    r1, [r0] 
TickExit    
    bx     lr 
                                                                           
    ALIGN            
    ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐 
    END

勾选Create HEX File

 

 编译

 

利用USB转串口烧录程序,参考STM32 F103之点亮LED流水灯 (STM32入门学习),不同的是,将波特率改为115200

打开野火串口调试助手,设置如图:

 

 七.观察GPIO波形

设置

 

 

 调试

 

打开分析仪

加观察引脚 

 

运行

 

观察

 

 设置起始点

 

八.总结 

通过学习了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。实现流水灯与通过观察GPIO波形可以通过观察波形检测设置的周期是否正确。

参考博客

https://blog.csdn.net/NiceBabyaaa/article/details/120933917
https://blog.csdn.net/big_west/article/details/120953789
https://blog.csdn.net/wofreeo/article/details/82389002
https://blog.csdn.net/weixin_46628481/article/details/120852364
https://blog.csdn.net/as480133937/article/details/98885316?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%AE%89%E8%A3%85%20stm32CubeMX&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-98885316.pc_search_result_hbase_insert&spm=1018.2226.3001.4187

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章