//本文件是在stm32103ve中實現串列埠中斷接收和中斷傳送資料,將採用迴圈邊收邊發將串列埠接收到的資料實時傳送出去。
//串列埠接收傳送**用彙編編寫。
//本軟體測試在波特率115200通過串列埠軟體從上位機傳送節的文件,微控制器接收後將資料傳送回上位機。
u8 recevie_num;
u8 recevie_send_data[200];
void usart_init(void);
void usart_send_data(u8* pp, u8 datalen);
void usart_recevie_data(u8 *pp, u8 datalen);
u8 usart_get_recevie_len(void);
int main(void)}}
import my_nvic_init
max_buf_num equ 200 ;陣列最大接收傳送值
preserve8 ;堆疊對齊
area usart_data, data, readwrite
buf_recevie space max_buf_num ;接收快取
recevie_**t dcb 0 ;接收串列埠資料到陣列的指標
recevie_get_ct dcb 0 ;接收到的資料個數
recevie_data_ct dcb 0 ;讀取陣列資料的指標
buf_send space max_buf_num ;傳送快取
send_**t dcb 0 ;傳送陣列資料到串列埠的指標
send_send_ct dcb 0 ;要傳送的資料個數
send_data_ct dcb 0 ;將要傳送的資料裝載到傳送陣列的指標
area usart_pro, code, readonly
;;;;;;;串列埠初始化;;;;;;
usart_init
export usart_init [weak]
push
;開串列埠1時鐘
ldr r0, =rcc_apb2enr
ldr r1, [r0]
orr r1, #bit14
orr r1, #bit2
str r1, [r0]
;配置串列埠管腳
ldr r0, =gpioa_crh
ldr r1, [r0]
and r1, #0xfffff00f
orr r1, #0x000008b0
str r1, [r0]
;復位usart1,先置位再清零
ldr r0, =rcc_apb2rstr
ldr r1, [r0]
orr r1, #bit14
str r1, [r0]
ldr r1, [r0]
bic r1, #bit14
str r1, [r0]
;設定成9600波特率
ldr r0, =usart1_brr
;mov r1, #0x1d4c ;9600
mov r1, #0x271 ;115200
;mov r1, #0x3a98 ;4800
str r1, [r0]
;usart1使能傳送使能接收使能
;8位資料位無校驗
ldr r0, =usart1_cr1
ldr r1, =0x200c
str r1, [r0]
;開啟中斷,開啟資料接收中斷
ldr r0, =usart1_cr1
ldr r1, [r0]
orr r1, #0x0120
str r1, [r0]
;中斷分組,設定中斷優先順序,開啟串列埠總中斷
mov r0, #0
mov r1, #1
ldr r2, =usart1_irqchannel
mov r3, #2
bl my_nvic_init
pop;;;;;得到串列埠接收到的資料個數;;;;;
usart_get_recevie_len
export usart_get_recevie_len
push
ldr r1, =recevie_get_ct ;接收
到的資料個數
ldrb r0, [r1]
popmov r6, #0
loop2
cpsid i ;由於recevie_get_ct變數在接收中斷裡面也用所以要先關閉中斷不然變數值會不同步
ldr r5, =recevie_get_ct ;接收陣列的資料個數
ldrb r2, [r5]
cmp r2, #0
beq data_enpty
sub r2, #1
strb r2, [r5]
cpsie i
ldr r5, =recevie_data_ct ;得到接收陣列資料指標
ldrb r2, [r5]
ldr r3, =buf_recevie ;將資料從接收陣列拷貝到目標位址
ldrb r4, [r3, r2]
strb r4, [r0, r6]
add r2, #1 ;接收陣列資料指標加1
cmp r2, #max_buf_num
moveq r2, #0
strb r2, [r5]
add r6, #1
cmp r6, r1
bne loop2
data_enpty
popmov r6, #0
loop1
cpsid i ;由於send_send_ct變數在傳送中斷裡面也用所以要先關閉中斷不然變數值會不同步
ldr r2, =send_send_ct ;要傳送資料的個數
ldrb r3, [r2]
cmp r3, #max_buf_num
beq usart_send_full
add r3, #1
strb r3, [r2]
cpsie i
ldr r3, =send_data_ct ;得到傳送資料陣列指標
ldrb r5, [r3]
ldr r2, =buf_send ;將要傳送的資料裝載到傳送陣列
ldrb r4, [r0, r6]
strb r4, [r2, r5]
add r5, #1 ;傳送資料陣列指標加1
cmp r5, #max_buf_num
moveq r5, #0
strb r5, [r3]
add r6, #1
cmp r6, r1 ;資料裝載完成?
bne loop1
ldr r0, =usart1_cr1 ;開發送中斷
ldr r1, [r0]
orr r1, #0x80
str r1, [r0]
popusart_send_full ;傳送滿
popldr r0, =usart1_dr
ldr r1, =recevie_get_ct ;接收到的資料個數
ldrb r2, [r1]
cmp r2, #max_buf_num
beq recevie_full
add r2, #1
strb r2, [r1]
ldr r1, =recevie_**t ;資料接收陣列指標
ldrb r2, [r1]
ldrb r4, [r0] ;將資料從串列埠裝載到資料接收陣列
ldr r3, =buf_recevie
strb r4, [r3, r2]
add r2, #1 ;資料接收陣列指標加1
cmp r2, #max_buf_num
moveq r2, #0
strb r2, [r1]
poprecevie_full ;接收滿
popldr r0, =send_send_ct ;要傳送資料的個數
ldrb r1, [r0]
cmp r1, #0
beq usart_send_end
sub r1, #1
strb r1, [r0]
ldr r0, =send_**t ;要傳送資料指標
ldrb r1, [r0]
ldr r4, =usart1_dr ;將資料傳送陣列的資料
據傳送到串列埠
ldr r2, =buf_send
ldrb r3, [r2, r1]
strb r3, [r4]
add r1, #1 ;要傳送資料指標加1
cmp r1, #max_buf_num
moveq r1, #0
strb r1, [r0]
popusart_send_end
ldr r0, =usart1_cr1 ;關閉傳送中斷
ldr r1, [r0]
bic r1, #0x80
str r1, [r0pop
ldr r0, =usart1_sr
ldr r1, [r0]
tst r1, #bit5
blne usart_recevie ;接收資料
popne
tst r1, #bit7
blne usart_send ;傳送資料
popalignend
第4天ARM彙編基礎
arm處理器一共有七種工作模式 管理模式 svc 處理器復位或者軟中斷之後以進入該模式 快速中斷模式 fiq 發生高階優先中斷時加入該模式 中斷模式 irq 發生低優先順序中斷時進入該模式 終止模式 abort 用於處理非正常訪問儲存器 訪問記憶體異常 未定義模式 undef 用於處理未定義指令 系...
嵌入式ARM彙編指令實驗
5 選擇選單項project build target 或快捷鍵f7,生成目標 6 選擇選單項debug start stop debug session 或快捷鍵ctrl f5,即可進入除錯模式。這裡使用的是 vision3 ide中的軟體 器。7 選擇選單項debug run 或快捷鍵f5,即可...
組合語言 第3章巨集組合語言
第三章巨集組合語言 一 巨集組合語言格式 3.1.1 指令語句格式 指令語句的一般格式如下 標號 指令助記符運算元 注釋 1 標號 標號是機器指令語句存放位址的符號表示,代表該指令目標 的第乙個位元組位址,後面必須緊跟冒號 2 指令助記符 指令助記符為語句的核心成分,表示了該語句的操作型別。3 運算...