日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【嵌入式06】寄存器方式和HAL库方式实现 串口通信“hello windows!”+流水灯

發布時間:2023/12/16 windows 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【嵌入式06】寄存器方式和HAL库方式实现 串口通信“hello windows!”+流水灯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、STM32的USART串口通訊(查詢方式)
    • (一)題目要求
    • (二)USB轉TTL與C8T6相連
    • (三)HAL庫實現串口通信
    • (四)寄存器地址方式實現串口通信
  • 二、流水燈
    • (一)器材準備
    • (二)電路連接
    • (三)燒錄
  • 三、總結
  • 四、參考

一、STM32的USART串口通訊(查詢方式)

(一)題目要求

1.設置波特率為115200,1位停止位,無校驗位;
2.STM32系統給上位機(win10)連續發送“hello windows!”。win10采用“串口助手”工具接收。
3.在沒有示波器條件下,可以使用Keil的軟件仿真邏輯分析儀功能觀察管腳的時序波形,觀察串口輸出波形,并分析時序狀態正確與否,高低電平轉換周期(LED閃爍周期)實際為多少。

(二)USB轉TTL與C8T6相連

USB轉TTLSTM32F103C8T6
GNDG
3V33V3
RXDPA9
TXDPA10

參考STM32F103的中文教程,實際連接中boot0接跳線帽置1。

(三)HAL庫實現串口通信

1.打開STM32CubeMX,新建工程,選擇所需芯片

2.選擇USERT1,Mode選擇Asynchronous異步通信,設置波特率、數據長度、奇偶校驗。

3.在Project Manager中對Project進行相應設置,填寫好好工程名,選擇路徑,Application Structure選擇basic,IDE選擇MDK-ARM。

4.Code Generator中勾選生成對應的.c和.h文件方便管理,最后點擊生成代碼。

6.在Keil中修改main.c文件的內容,在主函數的while循環中添加以下代碼:

char data[]="hello windows!\n";HAL_UART_Transmit(&huart1,(uint8_t*)data,15,0xffff);HAL_Delay(1000);

編輯好文件后,點擊魔法棒選擇生成HEX文件,然后進行編譯。

7.打開mcuisp軟件進行燒錄,燒錄步驟如下:

8.打開串口通信助手,注意波特率大小,點擊打開串口,即可看到串口輸出“hello windows!”。
9.波形圖觀察,波形圖每隔一段時間電平位就會發生變化,代表燒錄的程序在周期性輸出,一個周期大約為1s。


(四)寄存器地址方式實現串口通信

1.在keil中新建一工程,選擇STM32F103C8芯片,出現以下界面不進行選擇,直接點擊OK。

2.新建一個hello.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_charmov r0, #'e' bl send_a_charmov r0, #'l' bl send_a_charmov r0, #'l' bl send_a_charmov r0, #'o' bl send_a_charmov r0, #' ' bl send_a_charmov r0, #'W' bl send_a_charmov r0, #'o' bl send_a_charmov r0, #'r' bl send_a_charmov r0, #'l' bl send_a_charmov r0, #'d' bl send_a_charmov r0, #'\n' bl send_a_charb 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 ;異常程序 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

3.對文件進行調試生成HEX文件后燒錄。
4.燒錄串口通信實現如下,可以看出直接使用匯編語言實現串口通信是串口通信助手出現亂碼。

5.觀察串口輸出波形如下:

二、流水燈

寄存器代碼編寫和HAL庫代碼實現過程的具體過程參考上一篇博客內容。鏈接如下:
https://blog.csdn.net/qq_58869016/article/details/127137840?spm=1001.2014.3001.5502

(一)器材準備

LED燈(紅、黃、綠)、杜邦線若干、STM32F103C8T6、USB to TTL、面包板

(二)電路連接

當對應引腳的電平為低時,LED才能亮。

STM32F103C8T6USB to TTL
3V33V3
A9RXD
A10TXD
GNDGND
STM32F103C8T6LED
A5紅LED負極
B9黃LED負極
C14綠LED負極
3.3正極

(三)燒錄

根據前一篇博客的操作,將生成的hex文件燒錄到板子上。boot0置1,boot1置0。
1.將USB to TTL插到電腦接口上,打開“設備管理器”可以看到是否插入成功。(需要安裝CH340驅動,否則在對應端口前有一個感嘆號的提示符)

2.打開mcuisp軟件進行燒錄,燒錄步驟如下:


點擊“讀器件信息”后成功截圖如下所示。如果遲遲連接不上,可以從以下幾方面入手:
①檢查端口是否接入成功;
②檢查一下TXD和RXD的連接是否正確;
③在圖中Port:COM3查看端口是否選擇正確;
④關閉軟件,拔下USB重新進行操作;
⑤是否正確選擇“DTR的低電平復位,RST高電平進BootLoader”;
⑥跳線帽是否安裝正確,boot0置1,boot1置0。

點擊開始變成,出現以下情況,不要著急,再點一次即可。
出現以下情況即燒錄成功。

成功燒錄可以看到:

HAL庫實現LED流水燈


其對應引腳輸出波形圖如下所示,可觀察的LED燈閃爍周期接近1s:

上述是燒錄的運用HAL庫實現的流水燈,運用寄存器實現流水燈的代碼編程在上述鏈接(之前的博客)中有具體操作步驟,hex文件燒錄步驟同上,選擇正確的hex文件即可。最終結果如下所示:

寄存器實現流水燈

輸出波形觀察可知LED燈閃爍周期為1s:

三、總結

運用匯編語言直接實現串口通信時出現了亂碼,但是使用HAL庫實現時一切正常。流水燈運用C語言和HAL庫實現是效果一樣。對比上述操作過程兩種實現方式可以看出使用HAL實現更加簡單。

四、參考

mcuisp百度云盤資源:
鏈接:https://pan.baidu.com/s/1TuecWD0T1HTMkEpobuesFw
提取碼:visk
串口調試助手:
鏈接:https://pan.baidu.com/s/11z3KBA8hGjRz4Ck2dfvqvw
提取碼:1ex5
http://t.csdn.cn/OoAqN
http://t.csdn.cn/qHpVQ

總結

以上是生活随笔為你收集整理的【嵌入式06】寄存器方式和HAL库方式实现 串口通信“hello windows!”+流水灯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。