2016-08-15 1 views
0

Я пытаюсь понять код someones, и они читают пространство памяти в области GPIO (0x4002 0000 - 0x4002 03FF), но это более высокий адрес, чем регистры GPIO (они идут только до 0x24).ARM M3: Использование дополнительного места в карте периферийной памяти GPIO? Ты можешь сделать это?

Можете ли вы использовать все дополнительное пространство выше 0x4002 0024 и ниже 0x4002 03FFF? Что произойдет, если это пространство будет прочитано?

EDIT: Я полностью забыл, что могу просто отправить код. Я жирным шрифтом строку, которая вызывает у меня головные боли:

R0 = 0x15 

PUSH {R3,LR} ; 
ADD.W R0, R0, R0,LSL#1 ; 
MOV  GPIO_Port_A_Address, #0x40020000 
LSLS R0, R0, #2  ; 
ADDS R2, GPIO_Port_A_Address, R0 ; 
LDRB R2, [R2,#4]  ; 
MOVS R1, #1   ; 
LSL.W R1, R1, R2  ; 

LDR R0, [GPIO_Port_A_Address, R0];

UXTH R1, R1   ; 
BL  sub_8001ED8  ; 
MOVS R0, #0   ; 
POP  {R3,PC} ; 
+1

Какой микроконтроллер? Является ли код, на который вы смотрите, даже для того же микро, о котором вы думаете? Единственным «общим» аспектом является то, что 0x40000000 - 0x5fffffff на карте памяти Cortex-M3 - это место, где идут периферийные устройства. Все, что выходит за рамки этого, зависит от конкретной детали. – Notlikethat

+0

Да, это STM32F205. Конечно, я читаю ту же таблицу данных для UC, для которой был написан код. Я специально спрашиваю о регионе GPIO, поэтому я сказал, что в моем первоначальном вопросе. – eibwen

+1

Правильно, если бы этот контекст был в вопросе для начала, тогда мне не пришлось бы спрашивать. Если продолжать работать только «Cortex-M3», «область GPIO» бессмысленна, потому что ядра процессора не имеют GPIO. Точно так же для всех, кого мы знаем, «чей-то код», который мы не можем видеть и рассуждать, вполне может оказаться, скажем, случайным ошибочным кодом STM32F1 из Интернета (где этот диапазон адресов будет DMA-контроллером) и, таким образом, визуализировать вопрос недействителен. Хороший вопрос содержит _все_ соответствующие детали. – Notlikethat

ответ

0

В начале, есть и другие порты GPIO, которые живут в каждом кратному 0x200 от 0x40020000 - 0x400223FF и за это, но до сих пор в вашем диапазоне, есть КПР периферийный, RCC и флэш-контроллер. Соответствующая карта памяти находится на стр. 50 RM0033 (Rev 3, старая версия, поэтому номер страницы, вероятно, неверен).

0x40023C00 - 0x40023FFF Flash interface register 
0x40023800 - 0x40023BFF RCC 
0x40023000 - 0x400233FF CRC 
0x40022000 - 0x400223FF GPIOI 
0x40021C00 - 0x40021FFF GPIOH 
0x40021800 - 0x40021BFF GPIOG 
0x40021400 - 0x400217FF GPIOF 
0x40021000 - 0x400213FF GPIOE 
0X40020C00 - 0x40020FFF GPIOD 
0x40020800 - 0x40020BFF GPIOC 
0x40020400 - 0x400207FF GPIOB 
0x40020000 - 0x400203FF GPIOA 

Код, который вы выложили, как лучше всего я мог рассчитывать, делает доступ к некоторым невыполненных адреса (0x40020100, 0x400200FC), так что я не уверен, что там происходит, или если у меня есть просчитались. При тестировании на STM32F207 я могу подтвердить, что вы можете читать и писать на него, не получая ошибку, но регистры не выполняются и всегда считаются нулями.

Было бы очень плохо использовать периферийные регистры в качестве памяти общего назначения. Не каждый бит будет R/W, не все адреса могут быть реализованы, и это даже не связано с тем, что вы будете настраивать аппаратное обеспечение на основе данных приложения и не корректировать значения регистра. Диапазон, который вы указали, включает в себя контроллер вспышки и RCC, оба из которых жизненно важны для работы микроконтроллера.

Если вы потеряли память, есть некоторые пространства памяти, которые вы можете использовать в качестве общего назначения, если они еще не используются для других целей. У STM32F2 есть резервная SRAM на 4 КБ, которая может быть использована, хотя для ее создания требуется некоторая настройка R/W. У периферийных устройств USB также имеется встроенная RAM для буферов конечных точек. Если вы не используете USB, вы можете злоупотреблять некоторыми из этой памяти, и вы можете настроить периферийное устройство USB, чтобы не было никаких плохих побочных эффектов.

+0

Если подразумеваемый контекст вопроса правильный, однако, к нему даже не относятся периферийные регистры, просто зарезервированное адресное пространство, которое происходит (предположительно), считанное как ноль, а не сбоя (если, возможно, не может быть какой-то недокументированный тест отладки/интеграции регистры там). В любом случае, это звучит намного больше, чем простой глючный код, чем любой подлый. – Notlikethat

+0

Итак, вы говорите, что чтение адреса, попадающего в диапазон адресов GPIO, чуть выше диапазона регистра, может привести к ошибке? – eibwen

+0

Я добавил код к исходному вопросу. – eibwen

Смежные вопросы