STM32F100RB.
И что конкретно делает команда bfi R1,R2,#$Pin,#4 ?
Определение макросов:
Код
;--------------------------------------
;Start_GPIO_Conf $Port,$PinRange - начало настройки порта, где $Port - имя порта (GPIOA,..), $PinRange - верхняя/нижняя тетрада порта (GPIO_CR_H/GPIO_CR_L)
macro
Start_GPIO_Conf $Port,$PinRange
mov32 R0,#$Port ;загружаем в регистр "R0" имя порта (его код) из памяти
ldr R1,[R0,#$PinRange];загружаем в регистр "R1" значение по адресу из памяти "R0 + #GPIO_CR_H(0x00)" или "R0 + #GPIO_CR_H(0x04)"
mend
;--------------------------------------
;GPIO_Conf $Pin,$Mode - настройка ножек выбраного порта, где $Pin - номер ножки (CNF_Pin_0,..), $Mode - режим ножки (GPIO_OUT_50_PP,..)
macro
PinConfig $Pin,$Mode
movs R2,#$Mode
bfi R1,R2,#$Pin,#4
mend
;--------------------------------------
;End_GPIO_Conf $Port,$PinRange - конец настройки порта, где $Port - имя порта (GPIOA,..), $PinRange - верхняя/нижняя тетрада порта (GPIO_CR_H/GPIO_CR_L)
macro
End_GPIO_Conf $Port,$PinRange
str R1,[R0,#$PinRange];загружаем в память по адресу "R0 + #GPIO_CR_H(0x00)" или "R0 + #GPIO_CR_H(0x04)" значение "R1"
mend
;--------------------------------------
;SetBit_GPIO $Port,$Pin
macro
SetBit_GPIO $Port,$Pin
mov32 R0,#($Port + GPIO_BSRR)
mov32 R1,#$Pin
str R1,[R0]
mend
;--------------------------------------
;ResetBit_GPIO $Port,$Pin
macro
ResetBit_GPIO $Port,$Pin
mov32 R0,#($Port + GPIO_BRR)
mov32 R1,#$Pin
str R1,[R0]
mend
;--------------------------------------
;Start_GPIO_Conf $Port,$PinRange - начало настройки порта, где $Port - имя порта (GPIOA,..), $PinRange - верхняя/нижняя тетрада порта (GPIO_CR_H/GPIO_CR_L)
macro
Start_GPIO_Conf $Port,$PinRange
mov32 R0,#$Port ;загружаем в регистр "R0" имя порта (его код) из памяти
ldr R1,[R0,#$PinRange];загружаем в регистр "R1" значение по адресу из памяти "R0 + #GPIO_CR_H(0x00)" или "R0 + #GPIO_CR_H(0x04)"
mend
;--------------------------------------
;GPIO_Conf $Pin,$Mode - настройка ножек выбраного порта, где $Pin - номер ножки (CNF_Pin_0,..), $Mode - режим ножки (GPIO_OUT_50_PP,..)
macro
PinConfig $Pin,$Mode
movs R2,#$Mode
bfi R1,R2,#$Pin,#4
mend
;--------------------------------------
;End_GPIO_Conf $Port,$PinRange - конец настройки порта, где $Port - имя порта (GPIOA,..), $PinRange - верхняя/нижняя тетрада порта (GPIO_CR_H/GPIO_CR_L)
macro
End_GPIO_Conf $Port,$PinRange
str R1,[R0,#$PinRange];загружаем в память по адресу "R0 + #GPIO_CR_H(0x00)" или "R0 + #GPIO_CR_H(0x04)" значение "R1"
mend
;--------------------------------------
;SetBit_GPIO $Port,$Pin
macro
SetBit_GPIO $Port,$Pin
mov32 R0,#($Port + GPIO_BSRR)
mov32 R1,#$Pin
str R1,[R0]
mend
;--------------------------------------
;ResetBit_GPIO $Port,$Pin
macro
ResetBit_GPIO $Port,$Pin
mov32 R0,#($Port + GPIO_BRR)
mov32 R1,#$Pin
str R1,[R0]
mend
;--------------------------------------
Использование в программе:
Код
;--------------------------------------
Start_GPIO_Conf GPIOC,GPIO_CR_H
PinConfig CNF_Pin_9,GPIO_OUT_50_PP
PinConfig CNF_Pin_8,GPIO_OUT_50_PP
End_GPIO_Conf GPIOC,GPIO_CR_H
;--------------------------------------
SetBit_GPIO GPIOC,PIN9
SetBit_GPIO GPIOC,PIN8
;--------------------------------------
Start_GPIO_Conf GPIOC,GPIO_CR_H
PinConfig CNF_Pin_9,GPIO_OUT_50_PP
PinConfig CNF_Pin_8,GPIO_OUT_50_PP
End_GPIO_Conf GPIOC,GPIO_CR_H
;--------------------------------------
SetBit_GPIO GPIOC,PIN9
SetBit_GPIO GPIOC,PIN8
;--------------------------------------
Пробный проект в Keil 5 прикреплен: