ARM彙編STM32F103VE串列埠中斷傳送接收

2021-03-04 00:29:42 字數 4880 閱讀 3618

//本文件是在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 運算...