54939

Установка вывода микроконтроллера в "1" с помощью UART-загрузчика


Можно ли установить вывод микроконтроллера в определённое состояние с помощью команд UART-загрузчика до загрузки основной программы?

Рассмотрим реализацию данной задачи на примере установки вывода PA6 микроконтроллера К1986ВЕ1FI в состояние логической единицы "1".
Для этого необходимо выполнить запись в регистры периферийных блоков RST_CLK и PORTA. Однако, UART-загрузчик поддерживает только команду загрузки массива байт "CMD_LOAD", которая не подходит для записи регистров, так как выполняет запись байтами.

В частном случае данную команду можно использовать для записи регистров, но при этом необходимо учитывать, что при записи в регистр байта его значение будет продублировано в биты [31:8]. Например, при записи байта 0x12 в регистр будет записано 0x12121212.

При установке в "1" PA6 из-за дублирования данных в старшие разряды регистра возникают побочные эффекты, в частности, установка в "1" вывода PA14, а также включение тактирования некоторых периферийных.

В качестве терминальной программы использовалась программа Terminal v1.9b. Команды записи приведены ниже:

1. MDR_RST_CLK->PER_CLOCK = 0x70, при этом выполняется запись 0x70707070 (*(uint8_t *)0x4002001C = 0x70)
Terminal: L$1C$00$02$40$01$00$00$00$70
Устанавливаются биты:
- PER_CLOCK.RST_CLK = 1
- PER_CLOCK.DMA = 1
- PER_CLOCK.UART1 = 1
- PER_CLOCK.WWDT = 1
- PER_CLOCK.IWDT = 1
- PER_CLOCK.TIMER1 = 1
- PER_CLOCK.SPI2 = 1
- PER_CLOCK.PORTA = 1
- PER_CLOCK.PORTB = 1
- PER_CLOCK.ARINC429T = 1
- PER_CLOCK.PORTF = 1
- PER_CLOCK.EXT_BUS = 1

2. MDR_PORTA->ANALOG= 0x40, при этом выполняется запись 0x40404040 (*(uint8_t *)0x400A800C = 0x40)
Terminal: L$0C$80$0A$40$01$00$00$00$40
Устанавливаются биты:
- ANALOG.PIN_6 = 1
- ANALOG.PIN_14 = 1

3. MDR_PORTA->PWR = 0x10, при этом выполняется запись 0x10101010 (*(uint8_t *)0x400A8018 = 0x10)
Terminal: L$18$80$0A$40$01$00$00$00$10
Устанавливаются биты:
- PWR.PIN_2 = 1
- PWR.PIN_6 = 1
- PWR.PIN_10 = 1
- PWR.PIN_14 = 1

4. MDR_PORTA->SETTX = 0x40, при этом выполняется запись 0x40404040 (*(uint8_t *)0x400A8020 = 0x40)
Terminal: L$20$80$0A$40$01$00$00$00$40
Устанавливаются биты:
- SETTX.PIN_6 = 1
- SETTX.PIN_14 = 1

5. MDR_PORTA->OE= 0x40, при этом выполняется запись 0x40404040 (*(uint8_t *)0x400A8004 = 0x40)
Terminal: L$04$80$0A$40$01$00$00$00$40
Устанавливаются биты:
- OE.PIN_6 = 1
- OE.PIN_14 = 1

Для установки вывода PA6 в "1" с помощью UART-загрузчика без побочных эффектов рекомендуется загрузить в ОЗУ отдельную программу, которая будет устанавливать вывод PA6, после чего перейти обратно в UART-загрузчик, установив SP в значение, хранящееся по адресу 0x0000_0000, а PC в значение, хранящееся по адресу 0x0000_0004.

Документация

Теги

Был ли ответ полезным?