STM32串⼝通讯实现——USB转串⼝
⼀、RS232,TTL简介
RS232是个⼈计算机的通讯接⼝之⼀,⼀般会有两组RS323接⼝,分别为COM1和COM2,电平标准为+12V为逻辑负,-12为逻辑正。TTL电平为5V为逻辑正,0为逻辑负,这样的数据通信及电平规定⽅式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术。 ⼆、串⼝通讯原理
了解了RS232和TTL两种通信标准后,就可以开始了解串⼝通信USART了。
UART :通⽤异步收发传输器,它将要传输的资料在串⾏通信与并⾏通信之间加以转换。作为把并⾏输⼊信号转成串⾏输出信号的芯⽚。同样它是串⾏通信接⼝ UART只有数据线收和发,并⽆时钟线,故为异步串⾏通信接⼝,可以实现全双⼯传输和接收;在嵌⼊式中,常⽤与上位机与外设通信。 电汽锅串⼝通信的概念⾮常简单,串⼝按位发送和接收字节。尽管⽐按字节的并⾏通信慢,但是串⼝可以在使⽤⼀根线发送数据的同时⽤另⼀根线接收数据。它很简单并且能够实现远距离通信。⼀般来说有3种串⼝通讯⽅式。
1. 两设备通过232标准通讯
⽤控制器发出TTL电平,然后经过电平转换芯⽚转换为RS232电平,然后通过D89接⼝进⾏通讯
2. ⽤USB转串⼝进⾏通讯
⽤控制器发出TTL电平,然后经过电平转换芯⽚转换,然后通过USB接⼝和USB转串⼝进⾏通讯,需要安装CH340驱动。本博客就主要针对这种⽅式进⾏串⼝通讯。
3. TTL电平之间直接通讯
不需要控制器和转换芯⽚,直接使⽤TTL电平进⾏通讯。
三、⽣成⽂件
1.建⽴⼯程
打开Keil5软件,新建⼀个⼯程,然后添加⼀个.s⽂件,点击魔法棒选择Output选项,勾选Creat Hex File。
2.输⼊代码
在.s⽂件当中输⼊以下代码,代码是在别⼈的博客当中复制的。
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寄存器地址映像
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) G
PIOC_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)
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模块总使能发送与接收使能;710200002c 200000
;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]
;主循环