К1921ВК35: Такт ожидания при снятии блокировки GPIO

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

Ответить
ВитГо
Сообщения: 3
Зарегистрирован: 19 фев 2021, 10:20
Предприятие: Хобби-user
Контактная информация:

К1921ВК35: Такт ожидания при снятии блокировки GPIO

Сообщение ВитГо »

Начал писать настройку GPIO на ВК035
пример - мигалка
Светодиод подключен к GPIOA Pin 6 (JTAG пин!)

Тактирование не настроено
Для разблокировки пина получился такой код:

Код: Выделить всё

            @ настройка пинов GPIOA
                    LDR             R7, = GPIOA_BASE

                    @ Выключение альтернативной функции GPIOA PIN6
                    @ данный пин используется как один из сигналов JTAG интерфейса
                    @ поэтому изменение его режима заблокировано, чтобы перенастроить пин:
                    @ снимем блокировку
                    LDR             R1, = 0xADEADBEE
                    STR             R1, [ R7, GPIO_LOCKKEY ]

                    NOP                                 @ задержка ! блокировка снимется только через такт исполнения  - !!!!!!!

                    MOV             R1, 1 << 6          @ сбросим блокировку перенастройки пина 6 GPIOA
                    STR             R1, [ R7, GPIO_LOCKCLR ]

                    @ выключаем альт. функцию для GPIOA_PIN6
                    mov             R1, 1<<6
                    STR             R1, [ R7, GPIO_ALTFUNCCLR ]
про необходимость задержки (nop помеченный !!!!!! в коде выше) в документации ни слова...
что то не так делаю или просто упущение в документации (в errata тоже ничего) ?

с указанным ноп'ом код работает, без него - пин порта перенастроится только из под отладчика (в DEBUG), в RUN - пин не перенастраивается...
ArmAsmEditor наше все ! :-)
dav
Сообщения: 209
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: К1921ВК35: Такт ожидания при снятии блокировки GPIO

Сообщение dav »

ВитГо писал(а): 04 апр 2023, 15:39 про необходимость задержки (nop помеченный !!!!!! в коде выше) в документации ни слова...
Доброго времени суток!

При записи в регистр средствами компилятора Си, формируется следующий ассемблерный код (IDE Keil, уровень оптимизации 3):

Код: Выделить всё

    61:         GPIOA->LOCKKEY = 0xADEADBEE;
0x000007A8 4805      LDR           r0,[pc,#20]  ; @0x000007C0
0x000007AA 4904      LDR           r1,[pc,#16]  ; @0x000007BC
0x000007AC F8C0109C  STR           r1,[r0,#0x9C]
    62:         GPIOA->LOCKCLR = 1 << 6;
0x000007B0 2140      MOVS          r1,#0x40
0x000007B2 F8C010A4  STR           r1,[r0,#0xA4]
    63:         GPIOA->ALTFUNCCLR = 1 <<6 ;
    64:
0x000007B6 6381      STR           r1,[r0,#0x38]
В этом случае между записью в регистр GPIOA->LOCKKEY и записью в регистр GPIOA->ALTFUNCCLR также выполняется 1 команда и ошибок не возникает.
Провели эксперимент на плате макетно-отладочной - без дополнительных команд NOP все работает корректно.

Какой компилятор используете?
ВитГо
Сообщения: 3
Зарегистрирован: 19 фев 2021, 10:20
Предприятие: Хобби-user
Контактная информация:

Re: К1921ВК35: Такт ожидания при снятии блокировки GPIO

Сообщение ВитГо »

компилятор gnu as

код простейший, но если убрать NOP то работать не будет... что и удивило...

Код: Выделить всё

@.CharSet=CP1251
@GNU AS

@ +----------------------------------------------------+
@ |         Демонстрационный проект "Мигалка"          |
@ |        микроконтроллер: К1921ВК035 (НИИЭТ)         |
@ +----------------------------------------------------+
@ | Светодиод подключается к пину  GPIO A Pin 6, вклю- |
@ | чение прямое, через резистор 1 кОм                 |
@ |                                                    |
@ | Пин 6 GPIOA  является служебным, поэтому при его   |
@ | настройке отключается блокировка смены режима пина |
@ | затем  отключается  альтернативная функция и потом |
@ | производится стандартная настройка пина            |
@ |                                                    |
@ | Паузы при мигании задаются при помощи значений для |
@ | модуля генерации пауз таймера ядра SYSTICK         |
@ +----------------------------------------------------+

.syntax unified     @ синтаксис исходного кода
.Тамб              @ тип используемых инструкций Тамб
.cpu кортекс-m4      @ процессор

.INCLUDE  "/src/inc/siu.inc"
.INCLUDE  "/src/inc/rcu.inc"
.INCLUDE  "/src/inc/gpio.inc"

.section .asmcode

@ основная программа
.global Start
Start:              @ поместите код своей программы ниже
                    BL              SYSTICK_START        @ настройка модуля генерации пауз при помощи системного таймера (SYSTICK)

            @ Включаем GPIOA в блоке RCU
                    LDR             R7, = RCU_BASE

                    @ Включаем тактирование GPIOA
                    LDR             R1, [ R7, RCU_HCLKCFG ]
                    ORR             R1, R1, RCU_HCLKCFG_GPIOAEN
                    STR             R1, [ R7, RCU_HCLKCFG ]

                    @ Включаем GPIOA
                    LDR             R1, [ R7, RCU_HRSTCFG ]
                    ORR             R1, R1, RCU_HRSTCFG_GPIOAEN
                    STR             R1, [ R7, RCU_HRSTCFG ]

            @ настройка пинов GPIOA
                    LDR             R7, = GPIOA_BASE

                    @ Выключение альтернативной функции GPIOA PIN6
                    @ данный пин используется как один из сигналов JTAG интерфейса
                    @ поэтому изменение его режима заблокировано, чтобы перенастроить пин:
                    @ снимем блокировку
                    LDR             R1, = 0xADEADBEE
                    STR             R1, [ R7, GPIO_LOCKKEY ]
                    NOP                                       @ задержка ! блокировка снимется только через такт исполнения

                    MOV             R1, 1 << 6                           @ сбросим блокировку перенастройки пина 6 GPIOA
                    STR             R1, [ R7, GPIO_LOCKCLR ]

                    @ выключаем альт. функцию для GPIOA_PIN6
                    STR             R1, [ R7, GPIO_ALTFUNCCLR ]

                    @ Настройка режима работы пинов
                    LDR             R1, [ R7, GPIO_DENSET ]
                    ORR             R1, R1, GPIO_DENSET_PIN6              @ цифровой ввод\вывод
                    STR             R1, [ R7, GPIO_DENSET ]

                    @ настройка скорости и нагрузочной способности
                    LDR             R1, [ R7, GPIO_DRIVEMODE ]
                    MOV             R2, 0                                 @ скорость макс. \ нагрузка макс.
                    BFI             R1, R2, GPIO_DRIVEMODE_PIN6_N, 2
                    STR             R1, [ R7, GPIO_DRIVEMODE ]

                    @ Режим подтяжки пинов
                    LDR             R1, [ R7, GPIO_PULLMODE ]
@ значение задано выше   MOV             R2, 0                            @ нет подтяжки
                    BFI             R1, R2, GPIO_PULLMODE_PIN6_N, 2
                    STR             R1, [ R7, GPIO_PULLMODE ]

                    @ Выбор выходного каскада пина
                    LDR             R1, [ R7, GPIO_OUTMODE ]
@ значение задано выше   MOV             R2, 0                            @ Двухтактный выход (push\pull)
                    BFI             R1, R2, GPIO_OUTMODE_PIN6_N, 2
                    STR             R1, [ R7, GPIO_OUTMODE ]

                    @ включаем режим управления пином при помощи GPIO_DATAOUT
                    LDR             R1, [ R7, GPIO_OUTENSET ]
                    ORR             R1, R1, GPIO_OUTENSET_PIN6            @ режим General (управление от регистра DATAOUT)
                    STR             R1, [ R7, GPIO_OUTENSET ]

@ значение задано выше   MOV             R1, 1 << 6    @ управление GPIO_PIN6

LOOP:
                    @ установим значение пина в "1"
                    STR             R1, [ R7, GPIO_DATAOUTSET ]  @ установим бит (пин)

                    @ пауза
                    MOV             R0, 250                      @ значение задержки
                    BL              SYSTICK_DELAY

                    @ сбросим значение пина в "0"
                    STR             R1, [ R7, GPIO_DATAOUTCLR ]  @ сбросим бит (пин)

                    MOV             R0, 250                      @ значение задержки
                    BL              SYSTICK_DELAY

                    B               LOOP
компилируется блок без сюрпризов

Код: Выделить всё

0000015c <Start>:
 15c:     f000 f847      bl     1ee <SYSTICK_START>
 160:     4f1b           ldr     r7, [pc, #108]     @ (1d0 <LOOP+0x16>)
 162:     f8d7 1100      ldr.w     r1, [r7, #256]     @ 0x100
 166:     f041 0101      orr.w     r1, r1, #1
 16a:     f8c7 1100      str.w     r1, [r7, #256]     @ 0x100
 16e:     f8d7 1104      ldr.w     r1, [r7, #260]     @ 0x104
 172:     f041 0101      orr.w     r1, r1, #1
 176:     f8c7 1104      str.w     r1, [r7, #260]     @ 0x104
 17a:     4f16           ldr     r7, [pc, #88]     @ (1d4 <LOOP+0x1a>)
 17c:     4916           ldr     r1, [pc, #88]     @ (1d8 <LOOP+0x1e>)
 17e:     f8c7 109c      str.w     r1, [r7, #156]     @ 0x9c
 182:     bf00           nop                                                 ; ноп на месте
 184:     f04f 0140      mov.w     r1, #64     @ 0x40
 188:     f8c7 10a4      str.w     r1, [r7, #164]     @ 0xa4
 18c:     63b9           str     r1, [r7, #56]     @ 0x38
ArmAsmEditor наше все ! :-)
Ответить

Вернуться в «32-разрядные микроконтроллеры»