当前位置:   article > 正文

基于stm32CubeMX(Hal库)的stm32串口通信_system clock mux

system clock mux

目录

一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

1.1 串口通信协议概念

1.2 RS-232标准

1.3TTL标准

二. 安装 stm32CubeMX,配合Keil,使用寄存器方式(汇编或C,不限) 或HAL库这两种方式,完成下列任务:

2.1 安装Java

2.2安装 stm32CubeMX

2.3 安装固件库

三、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。

3.1 原理图 

3.2 创建项目

3.2.1  双击进入stm32f103c8 

        点击System Core,进入里面的SYS,在debug那里选择Serial Wire

3.2.2 将system clock mux从HSI设为PLLOCK

3.2.3 右边选择要使用到的引脚,本文主要选择PA12,PB1,和PC14,并点击GPIO_Output

  3.2.4 接下来建立项目,输入项目名称和项目地址,在Toolchain/IDE选择MDK-ARM

3.2.5 进入code generate界面,选择生成初始化.c/.h文件,后面点击generate code

 3.2.6 打开文件夹

3.2.7 打开生成的project文件

3.2.8 在while循环中加入亮灯熄灯代码 

 3.2.9 编译成功

 3.2.10 选择hex文件并通过串行口烧录

 3.2.11 烧录

3.2.12 实验成果

四、完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式)

4.1 创建项目

 4.2 添加代码

4.3 程完成情况如图且生成hex文件

4.4烧录与接收

五、在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察第1题中3个GPIO端口的输出波形,和第2题中串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

5.1设置

5.2 点击Run运行程序

5.3 观测波形

5.4 串口调试代码分析波形

六、总结

七、参考链接


 

一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

1.1 串口通信协议概念

串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

1.2 RS-232标准

RS232采用负逻辑电平,定义如下:

电平状态电压
0(space)+3 ~ +15V
1(mark)-15 ~ -3V
非法状态-3 ~ +3V

1.3TTL标准

输出 L: <=0.8V ; H:>=2.4V。

  输入 L: <=1.2V ; H:=>2.0V

  TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。

1.4 "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

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

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

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

二. 安装 stm32CubeMX,配合Keil,使用寄存器方式(汇编或C,不限) 或HAL库这两种方式,完成下列任务:

2.1 安装Java

由于STM32CubeMX是Java实现的,需要安装jdk环境。

jdk官网下载链接:
Java Downloads | Oracle

 

此时关闭就是安装成功了。 

 

2.2安装 stm32CubeMX

下载地址:
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics

选择第三个Windows系统的就行。

 

 

安装过程如图所示。注意安装路径不要出现中文就行。

2.3 安装固件库

 打开cubeMX,在help下选择manage

 

 

此处选择install now  第一个是本地下载 ,仅对于已有固件库的电脑。 

 

 

 

 

三、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。

3.1 原理图 

3.2 创建项目

 

3.2.1  双击进入stm32f103c8 

        点击System Core,进入里面的SYS,在debug那里选择Serial Wire

3.2.2 将system clock mux从HSI设为PLLOCK

接下来设置时钟RCC,在High Speed Clock选择Crystal/Ceramic Resonator

 

 

3.2.3 右边选择要使用到的引脚,本文主要选择PA12,PB1,和PC14,并点击GPIO_Output

将GPIO output level选择high 

GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。


 

  3.2.4 接下来建立项目,输入项目名称和项目地址,在Toolchain/IDE选择MDK-ARM

 

3.2.5 进入code generate界面,选择生成初始化.c/.h文件,后面点击generate code

 

 

 3.2.6 打开文件夹

 

 

 

3.2.7 打开生成的project文件

 

3.2.8 在while循环中加入亮灯熄灯代码 

  1. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);//PA12熄灯
  2. HAL_Delay(500);//延时0.5s
  3. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);//PA12亮灯
  4. HAL_Delay(500);//延时0.5s
  5. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);//PB1熄灯
  6. HAL_Delay(500);//延时0.5s
  7. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);//PB1亮灯
  8. HAL_Delay(500);//延时0.5s
  9. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
  10. HAL_Delay(500);//延时0.5s
  11. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
  12. HAL_Delay(500);//延时0.5s

 

 3.2.9 编译成功

 

 3.2.10 选择hex文件并通过串行口烧录

 

 

 3.2.11 烧录

通电下将boot0置0,然后再次通电后可运行。

3.2.12 实验成果

 

 

四、完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式)

4.1 创建项目

选择合适的芯片。

直接点OK

 4.2 添加代码

  1. ;RCC寄存器地址映像
  2. RCC_BASE EQU 0x40021000
  3. RCC_CR EQU (RCC_BASE + 0x00)
  4. RCC_CFGR EQU (RCC_BASE + 0x04)
  5. RCC_CIR EQU (RCC_BASE + 0x08)
  6. RCC_APB2RSTR EQU (RCC_BASE + 0x0C)
  7. RCC_APB1RSTR EQU (RCC_BASE + 0x10)
  8. RCC_AHBENR EQU (RCC_BASE + 0x14)
  9. RCC_APB2ENR EQU (RCC_BASE + 0x18)
  10. RCC_APB1ENR EQU (RCC_BASE + 0x1C)
  11. RCC_BDCR EQU (RCC_BASE + 0x20)
  12. RCC_CSR EQU (RCC_BASE + 0x24)
  13. ;AFIO寄存器地址映像
  14. AFIO_BASE EQU 0x40010000
  15. AFIO_EVCR EQU (AFIO_BASE + 0x00)
  16. AFIO_MAPR EQU (AFIO_BASE + 0x04)
  17. AFIO_EXTICR1 EQU (AFIO_BASE + 0x08)
  18. AFIO_EXTICR2 EQU (AFIO_BASE + 0x0C)
  19. AFIO_EXTICR3 EQU (AFIO_BASE + 0x10)
  20. AFIO_EXTICR4 EQU (AFIO_BASE + 0x14)
  21. ;GPIOA寄存器地址映像
  22. GPIOA_BASE EQU 0x40010800
  23. GPIOA_CRL EQU (GPIOA_BASE + 0x00)
  24. GPIOA_CRH EQU (GPIOA_BASE + 0x04)
  25. GPIOA_IDR EQU (GPIOA_BASE + 0x08)
  26. GPIOA_ODR EQU (GPIOA_BASE + 0x0C)
  27. GPIOA_BSRR EQU (GPIOA_BASE + 0x10)
  28. GPIOA_BRR EQU (GPIOA_BASE + 0x14)
  29. GPIOA_LCKR EQU (GPIOA_BASE + 0x18)
  30. ;GPIO C口控制
  31. GPIOC_BASE EQU 0x40011000
  32. GPIOC_CRL EQU (GPIOC_BASE + 0x00)
  33. GPIOC_CRH EQU (GPIOC_BASE + 0x04)
  34. GPIOC_IDR EQU (GPIOC_BASE + 0x08)
  35. GPIOC_ODR EQU (GPIOC_BASE + 0x0C)
  36. GPIOC_BSRR EQU (GPIOC_BASE + 0x10)
  37. GPIOC_BRR EQU (GPIOC_BASE + 0x14)
  38. GPIOC_LCKR EQU (GPIOC_BASE + 0x18)
  39. ;串口1控制
  40. USART1_BASE EQU 0x40013800
  41. USART1_SR EQU (USART1_BASE + 0x00)
  42. USART1_DR EQU (USART1_BASE + 0x04)
  43. USART1_BRR EQU (USART1_BASE + 0x08)
  44. USART1_CR1 EQU (USART1_BASE + 0x0c)
  45. USART1_CR2 EQU (USART1_BASE + 0x10)
  46. USART1_CR3 EQU (USART1_BASE + 0x14)
  47. USART1_GTPR EQU (USART1_BASE + 0x18)
  48. ;NVIC寄存器地址
  49. NVIC_BASE EQU 0xE000E000
  50. NVIC_SETEN EQU (NVIC_BASE + 0x0010)
  51. ;SETENA寄存器阵列的起始地址
  52. NVIC_IRQPRI EQU (NVIC_BASE + 0x0400)
  53. ;中断优先级寄存器阵列的起始地址
  54. NVIC_VECTTBL EQU (NVIC_BASE + 0x0D08)
  55. ;向量表偏移寄存器的地址
  56. NVIC_AIRCR EQU (NVIC_BASE + 0x0D0C)
  57. ;应用程序中断及复位控制寄存器的地址
  58. SETENA0 EQU 0xE000E100
  59. SETENA1 EQU 0xE000E104
  60. ;SysTick寄存器地址
  61. SysTick_BASE EQU 0xE000E010
  62. SYSTICKCSR EQU (SysTick_BASE + 0x00)
  63. SYSTICKRVR EQU (SysTick_BASE + 0x04)
  64. ;FLASH缓冲寄存器地址映像
  65. FLASH_ACR EQU 0x40022000
  66. ;SCB_BASE EQU (SCS_BASE + 0x0D00)
  67. MSP_TOP EQU 0x20005000
  68. ;主堆栈起始值
  69. PSP_TOP EQU 0x20004E00
  70. ;进程堆栈起始值
  71. BitAlias_BASE EQU 0x22000000
  72. ;位带别名区起始地址
  73. Flag1 EQU 0x20000200
  74. b_flas EQU (BitAlias_BASE + (0x200*32) + (0*4))
  75. ;位地址
  76. b_05s EQU (BitAlias_BASE + (0x200*32) + (1*4))
  77. ;位地址
  78. DlyI EQU 0x20000204
  79. DlyJ EQU 0x20000208
  80. DlyK EQU 0x2000020C
  81. SysTim EQU 0x20000210
  82. ;常数定义
  83. Bit0 EQU 0x00000001
  84. Bit1 EQU 0x00000002
  85. Bit2 EQU 0x00000004
  86. Bit3 EQU 0x00000008
  87. Bit4 EQU 0x00000010
  88. Bit5 EQU 0x00000020
  89. Bit6 EQU 0x00000040
  90. Bit7 EQU 0x00000080
  91. Bit8 EQU 0x00000100
  92. Bit9 EQU 0x00000200
  93. Bit10 EQU 0x00000400
  94. Bit11 EQU 0x00000800
  95. Bit12 EQU 0x00001000
  96. Bit13 EQU 0x00002000
  97. Bit14 EQU 0x00004000
  98. Bit15 EQU 0x00008000
  99. Bit16 EQU 0x00010000
  100. Bit17 EQU 0x00020000
  101. Bit18 EQU 0x00040000
  102. Bit19 EQU 0x00080000
  103. Bit20 EQU 0x00100000
  104. Bit21 EQU 0x00200000
  105. Bit22 EQU 0x00400000
  106. Bit23 EQU 0x00800000
  107. Bit24 EQU 0x01000000
  108. Bit25 EQU 0x02000000
  109. Bit26 EQU 0x04000000
  110. Bit27 EQU 0x08000000
  111. Bit28 EQU 0x10000000
  112. Bit29 EQU 0x20000000
  113. Bit30 EQU 0x40000000
  114. Bit31 EQU 0x80000000
  115. ;向量表
  116. AREA RESET, DATA, READONLY
  117. DCD MSP_TOP ;初始化主堆栈
  118. DCD Start ;复位向量
  119. DCD NMI_Handler ;NMI Handler
  120. DCD HardFault_Handler ;Hard Fault Handler
  121. DCD 0
  122. DCD 0
  123. DCD 0
  124. DCD 0
  125. DCD 0
  126. DCD 0
  127. DCD 0
  128. DCD 0
  129. DCD 0
  130. DCD 0
  131. DCD 0
  132. DCD SysTick_Handler ;SysTick Handler
  133. SPACE 20 ;预留空间20字节
  134. ;代码段
  135. AREA |.text|, CODE, READONLY
  136. ;主程序开始
  137. ENTRY
  138. ;指示程序从这里开始执行
  139. Start
  140. ;时钟系统设置
  141. ldr r0, =RCC_CR
  142. ldr r1, [r0]
  143. orr r1, #Bit16
  144. str r1, [r0]
  145. ;开启外部晶振使能
  146. ;启动外部8M晶振
  147. ClkOk
  148. ldr r1, [r0]
  149. ands r1, #Bit17
  150. beq ClkOk
  151. ;等待外部晶振就绪
  152. ldr r1,[r0]
  153. orr r1,#Bit17
  154. str r1,[r0]
  155. ;FLASH缓冲器
  156. ldr r0, =FLASH_ACR
  157. mov r1, #0x00000032
  158. str r1, [r0]
  159. ;设置PLL锁相环倍率为7,HSE输入不分频
  160. ldr r0, =RCC_CFGR
  161. ldr r1, [r0]
  162. orr r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14)
  163. orr r1, #Bit10
  164. str r1, [r0]
  165. ;启动PLL锁相环
  166. ldr r0, =RCC_CR
  167. ldr r1, [r0]
  168. orr r1, #Bit24
  169. str r1, [r0]
  170. PllOk
  171. ldr r1, [r0]
  172. ands r1, #Bit25
  173. beq PllOk
  174. ;选择PLL时钟作为系统时钟
  175. ldr r0, =RCC_CFGR
  176. ldr r1, [r0]
  177. orr r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14)
  178. orr r1, #Bit10
  179. orr r1, #Bit1
  180. str r1, [r0]
  181. ;其它RCC相关设置
  182. ldr r0, =RCC_APB2ENR
  183. mov r1, #(Bit14 :OR: Bit4 :OR: Bit2)
  184. str r1, [r0]
  185. ;PA9串口0发射脚
  186. ldr r0, =GPIOA_CRH
  187. ldr r1, [r0]
  188. orr r1, #(Bit4 :OR: Bit5)
  189. ;PA.9输出模式,最大速度50MHz
  190. orr r1, #Bit7
  191. and r1, #~Bit6
  192. ;10:复用功能推挽输出模式
  193. str r1, [r0]
  194. ldr r0, =USART1_BRR
  195. mov r1, #0x271
  196. str r1, [r0]
  197. ;配置波特率-> 115200
  198. ldr r0, =USART1_CR1
  199. mov r1, #0x200c
  200. str r1, [r0]
  201. ;USART模块总使能 发送与接收使能
  202. ;71 02 00 00 2c 20 00 00
  203. ;AFIO 参数设置
  204. ;Systick 参数设置
  205. ldr r0, =SYSTICKRVR
  206. ;Systick装初值
  207. mov r1, #9000
  208. str r1, [r0]
  209. ldr r0, =SYSTICKCSR
  210. ;设定,启动Systick
  211. mov r1, #0x03
  212. str r1, [r0]
  213. ;切换成用户级线程序模式
  214. ldr r0, =PSP_TOP
  215. ;初始化线程堆栈
  216. msr psp, r0
  217. mov r0, #3
  218. msr control, r0
  219. ;初始化SRAM寄存器
  220. mov r1, #0
  221. ldr r0, =Flag1
  222. str r1, [r0]
  223. ldr r0, =DlyI
  224. str r1, [r0]
  225. ldr r0, =DlyJ
  226. str r1, [r0]
  227. ldr r0, =DlyK
  228. str r1, [r0]
  229. ldr r0, =SysTim
  230. str r1, [r0]
  231. ;主循环
  232. main
  233. ldr r0, =Flag1
  234. ldr r1, [r0]
  235. tst r1, #Bit1
  236. ;SysTick产生0.5s,置位bit 1
  237. beq main ;0.5s标志还没有置位
  238. ;0.5s标志已经置位
  239. ldr r0, =b_05s
  240. ;位带操作清零0.5s标志
  241. mov r1, #0
  242. str r1, [r0]
  243. mov r0, #'H'
  244. bl send_a_char
  245. mov r0, #'e'
  246. bl send_a_char
  247. mov r0, #'l'
  248. bl send_a_char
  249. mov r0, #'l'
  250. bl send_a_char
  251. mov r0, #'o'
  252. bl send_a_char
  253. mov r0, #' '
  254. bl send_a_char
  255. mov r0, #'W'
  256. bl send_a_char
  257. mov r0, #'o'
  258. bl send_a_char
  259. mov r0, #'r'
  260. bl send_a_char
  261. mov r0, #'l'
  262. bl send_a_char
  263. mov r0, #'d'
  264. bl send_a_char
  265. mov r0, #'\n'
  266. bl send_a_char
  267. b main
  268. ;子程序 串口1发送一个字符
  269. send_a_char
  270. push {r0 - r3}
  271. ldr r2, =USART1_DR
  272. str r0, [r2]
  273. b1
  274. ldr r2, =USART1_SR
  275. ldr r2, [r2]
  276. tst r2, #0x40
  277. beq b1
  278. ;发送完成(Transmission complete)等待
  279. pop {r0 - r3}
  280. bx lr
  281. ;异常程序
  282. NMI_Handler
  283. bx lr
  284. HardFault_Handler
  285. bx lr
  286. SysTick_Handler
  287. ldr r0, =SysTim
  288. ldr r1, [r0]
  289. add r1, #1
  290. str r1, [r0]
  291. cmp r1, #500
  292. bcc TickExit
  293. mov r1, #0
  294. str r1, [r0]
  295. ldr r0, =b_05s
  296. ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位
  297. ;位带操作置1
  298. mov r1, #1
  299. str r1, [r0]
  300. TickExit
  301. bx lr
  302. ALIGN
  303. ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐
  304. END

 

4.3 程完成情况如图且生成hex文件

 

4.4烧录与接收

此时是在boot0为1情况下烧录。首先先用mcuisp将hex文件烧入stm32芯片,再打开串口调试助手,首先打开刚刚生成的hex文件,再点击发送文件,波特率默认是115200,1位停止位,无校验位。接着将boot0置0,点击reset即可接收到hello world。

 

 

 

 

 

 

五、在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察第1题中3个GPIO端口的输出波形,和第2题中串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

5.1设置

 

 

进入调试模式,并打开逻辑分析功能,选择setup,创建引脚。

举例:第12各引脚对应 1 0000 0000 0000    对应十六进制0x00001000

设置引脚名称和展示数据类型为bit

 

5.2 点击Run运行程序

 

 

 

5.3 观测波形

可以看出三个引脚在周期为0.5s交替出现,从而实现流水灯的闪烁

5.4 串口调试代码分析波形

环境配置与上述一致

不同点:

设置引脚为USART1_SR

观测波形

可以看出烧录的hello world程序的周期为0.5s,每相隔0.5s电平就会变化,从而周期性的输出

 

 

六、总结

通过使用STMCubeMX简化实验过程,因为它能生成一些代码。然后可以根据波形来判断自己的代码是否有问题,对于解决问题有很大帮助。 

七、参考链接

搭建STM32开发环境——STM32CubeMX,Keil5_Harriet的博客-CSDN博客

搭建STM32开发环境——STM32CubeMX,Keil5

STM32实现LED闪烁——基于HAL库_Harriet的博客-CSDN博客_stm32实现led灯的闪烁

STM32实现LED闪烁——基于HAL库

基于 MDK 创建 STM32 汇编程序:串口输出 Hello world_ssj925319的博客-CSDN博客

基于 MDK 创建 STM32 汇编程序:串口输出 Hello world

STM32最小核心板F103串口通信USART_vic_to_ry的博客-CSDN博客

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/463967
推荐阅读
相关标签
  

闽ICP备14008679号