- 一、理论知识简述
-
- 1.串口通信协议和RS-232标准
-
- (1)串口通信协议简介
- (2)串口通信协议原理
- (3)基本协议(主要介绍)RS-232)
- 2.RS232电平与TTL电平的区别
- 3."USB/TTL转232"模块(以CH以340芯片模块为例)工作原理
- 二、使用stm32CubeMX实现流水灯
-
- 1、stm32CubeMX安装配置
- 2.用GPIO端口完成LED红绿灯周期闪烁
- 3.观察3个GPIO端口输出波形
- 三、STM32的USART串口通信程序
-
- 1.USART简述
- 2.汇编实现
- 3.使用hel库实现
- 四、总结
一、理论知识简述
1.串口通信协议和RS-232标准
(1)串口通信协议简介
串口通信是指串口按位(bit)发送和接收字节。尽管比特字节(byte)串行通信缓慢,但串口可以在使用一线接收数据,同时使用一根线发送数据。串口通信协议是指数据包的内容,包括起始位置、主要数据、验证位置和停止位置。双方需要约定一致的数据包格式才能正常收发数据。串口通信中常用的协议包括RS-232、RS-422和RS-485。
(2)串口通信协议原理
串口是嵌入式系统中重要的数据通信接口,其基本功能是 CPU 编码转换器与串行设备之间。当数据从 CPU 字节数据端口发送时,字节数据转换为串行位;接收数据时,串行位置转换为字节数据。使用串口进行通信的应用程序,必须在使用前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。串口用于典型 ASCII 传输代码字符。通信使用3根线完成:①地线,②发送数据线,③接收数据线。波特率、数据位、停止位和奇偶校验是串口通信最重要的参数。对于两个通行端口,这些参数必须匹配:波特率是衡量通信速度的参数,表示每秒传输 bit 数量;数据位是衡量通信中实际数据位的参数。当计算机发送信息包时,标准值为 5,7 和 8 位。如何设置取决于你的需求;停止位置用于表示单个包的最后一个,典型值为 1,1.5和 2 位置、停止位置不仅表示传输的结束,还提供计算机校正时钟同步的机会;奇偶校准位置是串口通信中的一种简单的错误检测方法,有四种错误检测方法——偶、奇怪、高、低,也可以没有校准位置。
(3)基本协议(主要介绍)RS-232)
RS-232(ANSI/EIA-232标准)是IBM-PC以及兼容机上的串行连接标准。可用于连接鼠标、打印机或Modem,工业仪器仪表也可以同时连接。在实际应用中,用于改进驱动和连接RS-传输长度或速度通常超过标准值。RS-232只限于PC串口与设备间点对点通信。RS-232串口通信最远距离是50英尺。 DB-9针连接头
从计算机串口截面图。 RS-232针脚功能: ①数据: TXD(pin 三、串口数据输出(Transmit Data) RXD(pin 二、串口数据输入(Receive Data) ②握手: RTS(pin 7):发送数据请求(Request to Send) CTS(pin 8):清除发送(Clear to Send) DSR(pin 6):数据发送就绪(Data Send Ready) DCD(pin 1):数据载波检测(Data Carrier Detect) DTR(pin 4):数据终端就绪(Data Terminal Ready) ③地线: GND(pin 5):地线 ④其它 RI(pin 9):铃声指示
2.RS232电平与TTL电平的区别
(1)TTL电平信号之所以被广泛使用,是因为我们通常使用二进制来表示数据。并规定, 5V等价于逻辑“1”,0V等同于逻辑0。这种数据通信和电平规定被称为TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制设备各部分之间通信的标准技术。
(2)rs电子工业协会是个人电脑上的通信接口之一(Electronic Industries AssociaTIon,EIA) 异步传输标准接口。通常 RS-232 接口有9个引脚 (DB-9) 或是25个引脚 (DB-25) 一般来说,个人电脑上会有两组型态 RS-232 接口,分别称为 COM1 和 COM2。RS232的电平标准为 12V逻辑负,-12逻辑正,TTL电平为5V逻辑正,逻辑负
3."USB/TTL转232"模块(以CH以340芯片模块为例)工作原理
二、使用stm32CubeMX实现流水灯
1、stm32CubeMX安装配置
(1)安装地址https://www.st.com/en/development-tools/stm32cubemx.html (2)点击下载,填写注册信息和邮箱,然后 在邮箱中查看下载信息 (3)解压安装包,点击安装 (4)打开Cube,安装依赖包
2.用GPIO端口完成LED红绿灯周期闪烁
(1)修改stm32CubeMX代码 ①在stm32CubeMX中新建一个项目 ②完成配置 ③右键选择output,选择引脚设置输出寄存器(PAO、PB9、PC15) ④创建项目并在keli中打开运行 ⑤在keil中找到main.c文件中的while函数,添加
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(500);//延时0.5s
⑥点击编译,并在FlyMcu中烧录运行
3.观察3个GPIO端口的输出波形
三、STM32的USART串口通信程序
1.USART简述
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。
2.汇编实现
(1)创建项目 新建项目,选择芯片STM32F103C8,并在里面添加一个.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] ;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] ;切换成用户级线程序模式 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] 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, #'i' bl send_a_char mov r0, #'n' bl send_a_char mov r0, #'d' bl send_a_char mov r0, #'o' bl send_a_char mov r0, #'w' bl send_a_char mov r0, #'\n' bl send_a_char b main 山妖的阶梯 2:26:52 ;主循环 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] 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, #'i' bl send_a_char mov r0, #'n' bl send_a_char mov r0, #'d' bl send_a_char mov r0, #'o' bl send_a_char mov r0, #'w' bl send_a_char mov r0, #'\n' bl send_a_char b main ———————————————— 版权声明:本文为CSDN博主「觉觉睡了没醒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_61682562/article/details/120931199 山妖的阶梯 2:27:14 ;子程序 串口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 ;异常程序 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
编译烧录用野火调试助手打开串口查看输出
(2)观察管教的时序波形 添加寄存器
点击运行
3.使用hel库实现
(1)再CubeMX中新建项目并进行配置 设置生成HEX文件 在main.c文件中添加while函数的代码实现功能
char data[]="hello windows!\n";
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
HAL_Delay(1000);
编译烧录,并通过野火调试助手查看输出结果
(2)观察管脚的时序波形 调整真机模拟参数 添加针脚 运行
四、总结
https://blog.csdn.net/weixin_46129506/article/details/120895633 https://blog.csdn.net/junseven164/article/details/120808687