文章目錄
- 一、UART介紹
- 二、項目建立及編譯
- 三、電路連接及燒錄
- 四、串口輸出
- 五、總結
- 參考鏈接
一、UART介紹
通用同步異步收發器(Universal Synchronous Asynchronous Receiver and Transmitter)是一 個串行通信設備,可以靈活地與外部設備進行全雙工數據交換。有別于 USART 還有一個 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸 出,我們平時用的串口通信基本都是UART。 串行通信一般是以幀格式傳輸數據,即是一幀一幀的傳輸,每幀包含有起始信號、數 據信息、停止信息,可能還有校驗信息。USART就是對這些傳輸參數有具體規定,當然也 不是只有唯一一個參數值,很多參數值都可以自定義設置,只是增強它的兼容性。 USART滿足外部設備對工業標準 NRZ 異步串行數據格式的要求,并且使用了小數波 特率發生器,可以提供多種波特率,使得它的應用更加廣泛。USART支持同步單向通信和 半雙工單線通信;還支持局域互連網絡 LIN、智能卡(SmartCard)協議與 lrDA(紅外線數據協 會) SIRENDEC 規范。
二、項目建立及編譯
1.新建項目
①新建項目Project->New uVision Project
②芯片選擇STM32F103下的STM32F103C8
③點擊OK完成創建
2.代碼
①右擊Source Group1點擊選ADD New item to Gourp…
②新建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, str r1,
[r0
] ;開啟外部晶振使能
;啟動外部8M晶振 ClkOk ldr r1,
[r0
] ands r1, beq ClkOk
;等待外部晶振就緒 ldr r1,
[r0
] orr r1,str r1,
[r0
] ;FLASH緩沖器 ldr r0,
=FLASH_ACR mov r1, str r1,
[r0
] ;設置PLL鎖相環倍率為7,HSE輸入不分頻 ldr r0,
=RCC_CFGR ldr r1,
[r0
] orr r1, orr r1, str r1,
[r0
] ;啟動PLL鎖相環 ldr r0,
=RCC_CR ldr r1,
[r0
] orr r1, str r1,
[r0
]
PllOk ldr r1,
[r0
] ands r1, beq PllOk
;選擇PLL時鐘作為系統時鐘 ldr r0,
=RCC_CFGR ldr r1,
[r0
] orr r1, orr r1, orr r1, str r1,
[r0
] ;其它RCC相關設置 ldr r0,
=RCC_APB2ENR mov r1, str r1,
[r0
] ;IO端口設置 ldr r0,
=GPIOC_CRL ldr r1,
[r0
] orr r1,
;PC.7輸出模式,最大速度50MHz and r1,
;PC.7通用推挽輸出模式 str r1,
[r0
] ;PA9串口0發射腳 ldr r0,
=GPIOA_CRH ldr r1,
[r0
] orr r1,
;PA.9輸出模式,最大速度50MHz orr r1, and r1,
;10:復用功能推挽輸出模式 str r1,
[r0
] ldr r0,
=USART1_BRR mov r1, str r1,
[r0
] ;配置波特率-
> 115200 ldr r0,
=USART1_CR1 mov r1, str r1,
[r0
] ;USART模塊總使能 發送與接收使能
;71 02 00 00 2c
20 00 00
;AFIO 參數設置
;Systick 參數設置 ldr r0,
=SYSTICKRVR
;Systick裝初值 mov r1, str r1,
[r0
] ldr r0,
=SYSTICKCSR
;設定,啟動Systick mov r1, str r1,
[r0
] ;NVIC
;ldr r0,
=SETENA0
;mov r1, 0x00800000
;str r1,
[r0
] ;ldr r0,
=SETENA1
;mov r1,
;str r1,
[r0
] ;切換成用戶級線程序模式 ldr r0,
=PSP_TOP
;初始化線程堆棧 msr psp, r0 mov r0, msr control, r0
;初始化SRAM寄存器 mov r1, 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,
;SysTick產生0.5s,置位bit
1 beq main
;0.5s標志還沒有置位
;0.5s標志已經置位 ldr r0,
=b_05s
;位帶操作清零0.5s標志 mov r1, str r1,
[r0
] bl LedFlas mov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, bl send_a_charmov r0, 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, beq b1
;發送完成
(Transmission complete
)等待 pop
{r0 - r3
} bx lr
;子程序 led閃爍
LedFlas push
{r0 - r3
} ldr r0,
=Flag1 ldr r1,
[r0
] tst r1,
;bit0 閃爍標志位 beq ONLED
;為0 打開led燈
;為1 關閉led燈 ldr r0,
=b_flas mov r1, str r1,
[r0
] ;閃爍標志位置為0,下一狀態為打開燈
;PC.7輸出0 ldr r0,
=GPIOC_BRR ldr r1,
[r0
] orr r1, str r1,
[r0
] b LedEx
ONLED
;為0 打開led燈 ldr r0,
=b_flas mov r1, str r1,
[r0
] ;閃爍標志位置為1,下一狀態為關閉燈
;PC.7輸出1 ldr r0,
=GPIOC_BSRR ldr r1,
[r0
] orr r1, str r1,
[r0
]
LedEx pop
{r0 - r3
} bx lr
;異常程序
NMI_Handler bx lr HardFault_Handler bx lr SysTick_Handler ldr r0,
=SysTim ldr r1,
[r0
] add r1, str r1,
[r0
] cmp r1, bcc TickExit mov r1, str r1,
[r0
] ldr r0,
=b_05s
;大于等于500次 清零時鐘滴答計數器 設置0.5s標志位
;位帶操作置1 mov r1, str r1,
[r0
]
TickExit bx lr ALIGN
;通過用零或空指令NOP填充,來使當前位置與一個指定的邊界對齊 END
3.編譯
①編譯生成hex文件
勾選hex文件選項
②點擊編譯生成文件
三、電路連接及燒錄
1.串口連接
連接串口
TXD——A10
RXD——A9
3V3——3V3
GND——G
2.燒錄
①注意燒錄時boot0置1,boot1置0
②打開FlyMcu,勾選以下選項
③燒錄成功
四、串口輸出
使用串口調試助手sscom5.13.1
端口號選擇插入的端口
點擊打開串口即可運行成功!
五、總結
使用STM32發送“hello windows”,燒錄的過程與上一個流水燈實驗大同小異,但是這次有STM32的返回文字,收獲頗豐。
參考鏈接
STM32第五章-串口通訊詳解
總結
以上是生活随笔為你收集整理的STM32 汇编程序——串口输出 Hello world的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。