Решил для общего развития поизучать 32-битные контроллеры, взял bluepill с stm32f103 и st-link, "доапгрейдил" свой keil до arm (до этого работал в нем с C51, а с AVR, соответственно в AVR Studio 4).
Почитал интернет, даташиты, обучалки, конечно все в основном на С со всякими библиотеками и прочим, но это все мне не интересно, мне нужен ассемблер, а по нему маловато... Ну не в этом дело.
В общем кое-что покопипастил, кое-что сам понаписал, разогнал ядро до 72МГц, светодиодиком помигал, таймером SysTick ногой с частотой 1кГц подрыгал, стал разбираться дальше и застрял на тупой вещи...
В AVR и 51-х я делал какой-нибудь Define.asm и пихал туда все определения, для которых не было места с отдельных модулях, потом один раз писал include "Define.asm" в главном модуле и все, все модули видят все определения. Тут че-то затык.
Написал в Define.s:
Код: Выделить всё
FLG_1MS_BIT EQU 0x08 ; какой-нибудь флаг, например что прошла 1 мс
AREA __data, DATA, READWRITE
FLAGS DCD 0 ; кусок памяти где все флаги собраны
END
Код: Выделить всё
include C:\KEIL\ARM\Projects\stm32f10x.asm ;определения регистров и прочего
include C:\KEIL\ARM\Projects\MacroSTM.asm
include Define.s
EXPORT FLAGS ;чтобы было видно в других модулях
EXPORT FLG_1MS_BIT
[...] ;тут всякий код...
LOOP
LDR R0,=FLAGS ;проверяем флаг
LDR R1,[R0]
TST R1,ONE, LSL #FLG_1MS_BIT
BLNE EXEC_1MS_TIMER ;если прошла 1мс, переход на обработчик
B LOOP
ENDP
END
Код: Выделить всё
include C:\KEIL\ARM\Projects\stm32f10x.asm
include C:\KEIL\ARM\Projects\MacroSTM.asm
EXTERN FLAGS
EXTERN FLG_1MS_BIT
[...] ;тут всякий код...
ISR_SYSTIMER PROC ;обработчик прерывания SysTick, раз в 1мс
PERIH_BIT_CONTROL SET,GPIOC_ODR,GPIO_ODR_ODR13 ;импульс, чтобы видеть частоту осциллографом
LDR R0,=FLAGS ;читаем адрес флагов, тут без проблем
LDR R1,[R0] ;загружаем флаги
BFI R1,ONE,#FLG_1MS_BIT,#1 ;выставляем нужный бит (ONE=R11=#0x01, определено в макросах)... А ВОТ НИФИГА, не работает!!!
STR R1,[R0] ;сохраняем флаги
PERIH_BIT_CONTROL CLEAR,GPIOC_ODR,GPIO_ODR_ODR13 ;задний фронт импульса
BX LR
ENDP
Если написать напрямую " BFI R1,ONE,#0х08,#1" или закомментить "EXTERN FLG_1MS_BIT " и вписать его тут же с equ, то все естественно компилится и работает.
PS: чето внутри тега code форматирование не работает...


