当前位置:   article > 正文

串口通信小试_hal_uart_transmit

hal_uart_transmit

目录

hal库实现

调试

编译

烧录

汇编实现

编译

烧录使用 


        今日份的实验来啦,上期我们用STM32F103C8T6实现了流水灯,这次我们要完成一个STM32的USART串口通讯程序。

hal库实现

调试

        首先,我们打开上期用到过的stm32cubemx,选择中间的access to mcu selector,选择STM32F103C8开发板,然后点击右上角start project,然后找到rcc,把高速时钟改为crystal

 

        然后找到下面界面,修改参数如下图,然后点击Clock Configuration选择HSE和PLLCLK。

 

        回刚刚的pinout,继续设置。

        选择右上角project manager,找到toolchain/IDE改为mdk-ARM,然后点击右上角generate code,选择open project。

编译

        在main.c里面找到所有的while函数,在其中加入如下代码,如图例。此处应该有两处while。

  1. char data[]="hello windows!\n";
  2. HAL_UART_Transmit(&huart2, (uint8_t *)data, 15, 0xffff);
  3. //高电平点亮A12
  4. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
  5. HAL_Delay(100);
  6. //低电平熄灭A12
  7. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
  8. HAL_Delay(900);

 

        开始设置参数。设置完编译。 

 

  1. DARMSTM.DLL
  2. -pSTM32F103C8
  1. TARMSTM.DLL
  2. -pSTM32F103C8

烧录

        此处我们要先下载一个小助手,解压包里直接就有,这是我能找到的最方便的。https://cloud.embedfire.com/software/FireTools/fireTools-win64-v1.0.1.5.zip

 

        这里首先要改一点电路,看到USB接口的背面(我的是USB接口的),观察字母位置,rxd接A9,txd接A10,boot0置1,boot1置0,然后接上电脑烧录。

        打开小助手,先把电路板断电,然后rxd接A2,txd接A3,boot0置0,boot1置1,再通电。串口调试助手设置波特率为115200,校验位无,数据位为8,停止位为1,然后点击打开串口。

如上图所示,就是成功了。

汇编实现

编译

        首先在keil当中新建一个文件,选择STM32F103C8芯片,再在文件夹里新建.s文件。

 

 

        在文件里写入以下代码。 

  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. ;IO端口设置
  186. ldr r0, =GPIOC_CRL
  187. ldr r1, [r0]
  188. orr r1, #(Bit28 :OR: Bit29)
  189. ;PC.7输出模式,最大速度50MHz
  190. and r1, #(~Bit30 & ~Bit31)
  191. ;PC.7通用推挽输出模式
  192. str r1, [r0]
  193. ;PA9串口0发射脚
  194. ldr r0, =GPIOA_CRH
  195. ldr r1, [r0]
  196. orr r1, #(Bit4 :OR: Bit5)
  197. ;PA.9输出模式,最大速度50MHz
  198. orr r1, #Bit7
  199. and r1, #~Bit6
  200. ;10:复用功能推挽输出模式
  201. str r1, [r0]
  202. ldr r0, =USART1_BRR
  203. mov r1, #0x271
  204. str r1, [r0]
  205. ;配置波特率-> 115200
  206. ldr r0, =USART1_CR1
  207. mov r1, #0x200c
  208. str r1, [r0]
  209. ;USART模块总使能 发送与接收使能
  210. ;71 02 00 00 2c 20 00 00
  211. ;AFIO 参数设置
  212. ;Systick 参数设置
  213. ldr r0, =SYSTICKRVR
  214. ;Systick装初值
  215. mov r1, #9000
  216. str r1, [r0]
  217. ldr r0, =SYSTICKCSR
  218. ;设定,启动Systick
  219. mov r1, #0x03
  220. str r1, [r0]
  221. ;NVIC
  222. ;ldr r0, =SETENA0
  223. ;mov r1, 0x00800000
  224. ;str r1, [r0]
  225. ;ldr r0, =SETENA1
  226. ;mov r1, #0x00000100
  227. ;str r1, [r0]
  228. ;切换成用户级线程序模式
  229. ldr r0, =PSP_TOP
  230. ;初始化线程堆栈
  231. msr psp, r0
  232. mov r0, #3
  233. msr control, r0
  234. ;初始化SRAM寄存器
  235. mov r1, #0
  236. ldr r0, =Flag1
  237. str r1, [r0]
  238. ldr r0, =DlyI
  239. str r1, [r0]
  240. ldr r0, =DlyJ
  241. str r1, [r0]
  242. ldr r0, =DlyK
  243. str r1, [r0]
  244. ldr r0, =SysTim
  245. str r1, [r0]
  246. ;主循环
  247. main
  248. ldr r0, =Flag1
  249. ldr r1, [r0]
  250. tst r1, #Bit1
  251. ;SysTick产生0.5s,置位bit 1
  252. beq main ;0.5s标志还没有置位
  253. ;0.5s标志已经置位
  254. ldr r0, =b_05s
  255. ;位带操作清零0.5s标志
  256. mov r1, #0
  257. str r1, [r0]
  258. bl LedFlas
  259. mov r0, #'H'
  260. bl send_a_char
  261. mov r0, #'e'
  262. bl send_a_char
  263. mov r0, #'l'
  264. bl send_a_char
  265. mov r0, #'l'
  266. bl send_a_char
  267. mov r0, #'o'
  268. bl send_a_char
  269. mov r0, #' '
  270. bl send_a_char
  271. mov r0, #'w'
  272. bl send_a_char
  273. mov r0, #'o'
  274. bl send_a_char
  275. mov r0, #'r'
  276. bl send_a_char
  277. mov r0, #'l'
  278. bl send_a_char
  279. mov r0, #'d'
  280. bl send_a_char
  281. mov r0, #'\n'
  282. bl send_a_char
  283. b main
  284. ;子程序 串口1发送一个字符
  285. send_a_char
  286. push {r0 - r3}
  287. ldr r2, =USART1_DR
  288. str r0, [r2]
  289. b1
  290. ldr r2, =USART1_SR
  291. ldr r2, [r2]
  292. tst r2, #0x40
  293. beq b1
  294. ;发送完成(Transmission complete)等待
  295. pop {r0 - r3}
  296. bx lr
  297. ;子程序 led闪烁
  298. LedFlas
  299. push {r0 - r3}
  300. ldr r0, =Flag1
  301. ldr r1, [r0]
  302. tst r1, #Bit0
  303. ;bit0 闪烁标志位
  304. beq ONLED ;为0 打开led灯
  305. ;为1 关闭led灯
  306. ldr r0, =b_flas
  307. mov r1, #0
  308. str r1, [r0]
  309. ;闪烁标志位置为0,下一状态为打开灯
  310. ;PC.7输出0
  311. ldr r0, =GPIOC_BRR
  312. ldr r1, [r0]
  313. orr r1, #Bit7
  314. str r1, [r0]
  315. b LedEx
  316. ONLED
  317. ;为0 打开led灯
  318. ldr r0, =b_flas
  319. mov r1, #1
  320. str r1, [r0]
  321. ;闪烁标志位置为1,下一状态为关闭灯
  322. ;PC.7输出1
  323. ldr r0, =GPIOC_BSRR
  324. ldr r1, [r0]
  325. orr r1, #Bit7
  326. str r1, [r0]
  327. LedEx
  328. pop {r0 - r3}
  329. bx lr
  330. ;异常程序
  331. NMI_Handler
  332. bx lr
  333. HardFault_Handler
  334. bx lr
  335. SysTick_Handler
  336. ldr r0, =SysTim
  337. ldr r1, [r0]
  338. add r1, #1
  339. str r1, [r0]
  340. cmp r1, #500
  341. bcc TickExit
  342. mov r1, #0
  343. str r1, [r0]
  344. ldr r0, =b_05s
  345. ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位
  346. ;位带操作置1
  347. mov r1, #1
  348. str r1, [r0]
  349. TickExit
  350. bx lr
  351. ALIGN
  352. ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐
  353. END

烧录使用 

        然后编译烧录。这里注意,又要把rxd接A9,txd接A10,boot0置1,boot1置0,然后接上电脑烧录。

        烧录后先断电,boot0置0,再接点进行串口调试

        可以看到,这里都是乱码。but,很遗憾我解决不了,所以,这次实验就只能失败告终了,对不起!!!!!(====▄█▀█●滑跪)

 

 

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

闽ICP备14008679号