Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
1

Как еще можно пользоваться регистрами микроконтроллеров?

24.11.2014, 15:27. Показов 3518. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Обычно обращение к регистрам МК проходит так:

C++
1
2
#define REG_1 *((uword volatile far *)(0xBEEFFF))
REG_1 = 0x12345678;
У меня 4 физически разных канала одного и того же ИФ (скажем, UART), у всех четырех каналов набор регистров одинаковый, но адреса разные.
Нужно составить обращение к регистрам разных модулей в компактной форме, то есть в функции по номеру канала уметь найти адрес нужного регистра и запрограммировать его.

Вопрос: возможно ли это сделать с помощью такой схемы: зная глобальное смещение адресов регистров каждого модуля в отдельности прямо в выражении рассчитывать адрес конкретного регистра?
C++
1
2
3
4
5
#define CHANNEL_0_offset 0xBEEF00
#define CHANNEL_1_offset 0xFACE00
#define REG_1            0x0000AB
*((uword volatile far *)(CHANNEL_0_offset+REG_1)) = 0x12345678;
*((uword volatile far *)(CHANNEL_1_offset+REG_1)) = 0x87654321;
?????
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2014, 15:27
Ответы с готовыми решениями:

Без понятия как регистрами пользоваться
Всем здравствуйте. Без понятия как пользоваться регистрами. Вот задание: "Составить линейную...

Как можно пользоваться Mathcad 15 на Windows 10
Как можно пользоваться Mathcad 15 на Windows 10, потому что так запуская и программа сразу...

как можно пользоваться методами одного класса в другом?
Программированием занимаюсь недавно.Подскажите пожалуйста,как можно пользоваться методами одного...

как пользоваться программатором для Whirlpool, раздобыл программатор, а как им пользоваться я не знаю
подскажите плиз

Как объявить массив чтобы им можно было пользоваться в любом методе?
string lines = File.ReadAllLines("C:/input.txt"); int A = new int.Split('...

51
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
24.11.2014, 16:36 2
Цитата Сообщение от tiger() Посмотреть сообщение
Вопрос: возможно ли это сделать с помощью такой схемы: зная глобальное смещение адресов регистров каждого модуля в отдельности прямо в выражении рассчитывать адрес конкретного регистра?
можно
А зачем???
создаешь структуру
и приводишь адреса к ней

например
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct  MyUSORT
{
 int Reg1;
 int Reg2;
 int Reg3;
}
 
MyUSORT * usart1=(MyUSORT*)=0xBEEF00;
MyUSORT * usart2=(MyUSORT*)=0xFACE00;
 
usart1->Reg1=0;
usart2->Reg3=6;
я здесь адреса взял от балды
и работа со структурой в плюсовом стиле, в Си несколько по другому (нужно typedef использовать)
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
24.11.2014, 16:37 3
1. Использовать указатель volatile u32 *p_Reg;
2. Передать в указатель адрес p_Reg = & (имя регистра) или p_Reg = адрес
3. Работа с регистром через указатель (*p_Reg) = данные
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
24.11.2014, 16:44  [ТС] 4
Цитата Сообщение от ValeryS Посмотреть сообщение
можно
А зачем???
создаешь структуру
и приводишь адреса к ней

например
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct  MyUSORT
{
 int Reg1;
 int Reg2;
 int Reg3;
}
 
MyUSORT * usart1=(MyUSORT*)=0xBEEF00;
MyUSORT * usart2=(MyUSORT*)=0xFACE00;
 
usart1->Reg1=0;
usart2->Reg3=6;
В смысле, выравнивать структуру так, чтобы ее элементы лежали точно там, где должны быть регистры? Это ацкий труд. У меня есть готовый список адресов каждого регистра, из него легко сделать список смещений. А вот располагать их в порядке следования в памяти, а еще чтобы не было "зазоров", имхо, нереально. Или я че-то не так понял?

Добавлено через 2 минуты
Цитата Сообщение от Витальич Посмотреть сообщение
1. Использовать указатель volatile u32 *p_Reg;
2. Передать в указатель адрес p_Reg = & (имя регистра) или p_Reg = адрес
3. Работа с регистром через указатель (*p_Reg) = данные
Я не понял, это три разных варианта или три шага одного варианта?
Указатель volatile u32 *p_Reg использовать я могу, но тогда мне придется делать 4 разные функции под каждую настройку: настойка baudrate для 1, 2, 3, 4 канала отдельно, т.к. адреса регов разные.

Пункт 2 и 3 вообще не понял
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.11.2014, 17:15 5
Цитата Сообщение от tiger() Посмотреть сообщение
В смысле, выравнивать структуру так, чтобы ее элементы лежали точно там, где должны быть регистры? Это ацкий труд. У меня есть готовый список адресов каждого регистра, из него легко сделать список смещений. А вот располагать их в порядке следования в памяти, а еще чтобы не было "зазоров", имхо, нереально. Или я че-то не так понял?
Вы не поверите, но так это сделано во всех без исключения SDK абсолютного большинства контроллеров. Скажем, для кортексов тот же УАРТ объявлен набором 32битных регистров в структуре, а каждый из конкретно взятых уартов просто имеет свое смещение в общей области. Таким образом, обращаясь USORT1->DR и USORT2->DR мы имеем дело с регистром данных разных портов, с одинаковым набором регов. Этот путь общепринятый.

Добавлено через 1 минуту
...зазоры могут присутствовать в виде пустых (reserved) байт или вообще - массивов. Ничего страшного в этом нет.
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
24.11.2014, 17:16  [ТС] 6
Цитата Сообщение от Voland_ Посмотреть сообщение
Вы не поверите, но так это сделано во всех без исключения SDK абсолютного большинства контроллеров. Скажем, для кортексов тот же УАРТ объявлен набором 32битных регистров в структуре, а каждый из конкретно взятых уартов просто имеет свое смещение в общей области. Таким образом, обращаясь USORT1->DR и USORT2->DR мы имеем дело с регистром данных разных портов, с одинаковым набором регов. Этот путь общепринятый.
Есть отличие в работе с такой структурой, когда она уже готова и тем, чтобы самостоятельно такую структуру бадяжить.
0
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
24.11.2014, 17:17 7
Цитата Сообщение от tiger() Посмотреть сообщение
В смысле, выравнивать структуру так, чтобы ее элементы лежали точно там, где должны быть регистры? Это ацкий труд.
не такой уж адский
зато потом будет гораздо проще
при переходе с одного камня на другой, не надо будет править везде адреса
да и чаще всего эту работу сделали за тебя производители компилятора или(и) процессора
вот пример
из Кеила
штатный "stm32f10x_usart.h"(просто он у меня открыт )
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
typedef struct
{
  uint32_t USORT_BaudRate;            /*!< This member configures the USORT communication baud rate.
                                           The baud rate is computed using the following formula:
                                            - IntegerDivider = ((PCLKx) / (16 * (USORT_InitStruct->USORT_BaudRate)))
                                            - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */
 
  uint16_t USORT_WordLength;          /*!< Specifies the number of data bits transmitted or received in a frame.
                                           This parameter can be a value of @ref USORT_Word_Length */
 
  uint16_t USORT_StopBits;            /*!< Specifies the number of stop bits transmitted.
                                           This parameter can be a value of @ref USORT_Stop_Bits */
 
  uint16_t USORT_Parity;              /*!< Specifies the parity mode.
                                           This parameter can be a value of @ref USORT_Parity
                                           @note When parity is enabled, the computed parity is inserted
                                                 at the MSB position of the transmitted data (9th bit when
                                                 the word length is set to 9 data bits; 8th bit when the
                                                 word length is set to 8 data bits). */
 
  uint16_t USORT_Mode;                /*!< Specifies wether the Receive or Transmit mode is enabled or disabled.
                                           This parameter can be a value of @ref USORT_Mode */
 
  uint16_t USORT_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled
                                           or disabled.
                                           This parameter can be a value of @ref USORT_Hardware_Flow_Control */
} USORT_InitTypeDef;
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.11.2014, 17:18 8
ValeryS, это ж не то
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
24.11.2014, 17:19  [ТС] 9
Цитата Сообщение от ValeryS Посмотреть сообщение
не такой уж адский
зато потом будет гораздо проще
при переходе с одного камня на другой, не надо будет править везде адреса
да и чаще всего эту работу сделали за тебя производители компилятора или(и) процессора
вот пример
из Кеила
штатный "stm32f10x_usart.h"(просто он у меня открыт )
Ну вот у тебя здесь шесть регистров. У меня в Infineon/Keil такой клевой структуры нет и регистров 110 штук.
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.11.2014, 17:20 10
вот USORT:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/** 
  * @brief Universal Synchronous Asynchronous Receiver Transmitter
  */
 
typedef struct
{
  __IO uint16_t SR;
  uint16_t  RESERVED0;
  __IO uint16_t DR;
  uint16_t  RESERVED1;
  __IO uint16_t BRR;
  uint16_t  RESERVED2;
  __IO uint16_t CR1;
  uint16_t  RESERVED3;
  __IO uint16_t CR2;
  uint16_t  RESERVED4;
  __IO uint16_t CR3;
  uint16_t  RESERVED5;
  __IO uint16_t GTPR;
  uint16_t  RESERVED6;
} USORT_TypeDef;
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
24.11.2014, 17:20  [ТС] 11
Цитата Сообщение от Voland_ Посмотреть сообщение
ValeryS, это ж не то
Кстати да)
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.11.2014, 17:22 12
Цитата Сообщение от tiger() Посмотреть сообщение
Ну вот у тебя здесь шесть регистров. У меня в Infineon/Keil такой клевой структуры нет и регистров 110 штук.
какая разница? Вам советуют рациональное, а не быстро-легкое решение. Как сделать проще, я, например, пока не знаю... Ждем гуру
0
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
24.11.2014, 17:23 13
вот от туда же файл stm32f10x.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct
{
  __IO uint16_t SR;
  uint16_t  RESERVED0;
  __IO uint16_t DR;
  uint16_t  RESERVED1;
  __IO uint16_t BRR;
  uint16_t  RESERVED2;
  __IO uint16_t CR1;
  uint16_t  RESERVED3;
  __IO uint16_t CR2;
  uint16_t  RESERVED4;
  __IO uint16_t CR3;
  uint16_t  RESERVED5;
  __IO uint16_t GTPR;
  uint16_t  RESERVED6;
} USORT_TypeDef;
а вот как они объявляются
C
1
2
3
4
5
#define USORT2              ((USORT_TypeDef *) USORT2_BASE)
#define USORT3              ((USORT_TypeDef *) USORT3_BASE)
...............................................................................
#define USORT2_BASE           (APB1PERIPH_BASE + 0x4400)
#define USORT3_BASE           (APB1PERIPH_BASE + 0x4800)
1
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
24.11.2014, 17:24  [ТС] 14
Цитата Сообщение от Voland_ Посмотреть сообщение
какая разница? Вам советуют рациональное, а не быстро-легкое решение. Как сделать проще, я, например, пока не знаю... Ждем гуру
А чем мой вариант не рациональный? Мой вопрос был в том легитимно ли вообще таким образом обращаться к регистру.
0
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
24.11.2014, 17:25 15
Цитата Сообщение от tiger() Посмотреть сообщение
У меня в Infineon/Keil такой клевой структуры нет и регистров 110 штук.
и что прямо все относятся к UARTу?
камень то какой?

Добавлено через 40 секунд
Цитата Сообщение от tiger() Посмотреть сообщение
А чем мой вариант не рациональный?
в поддержке кода
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.11.2014, 17:26 16
Цитата Сообщение от tiger() Посмотреть сообщение
А чем мой вариант не рациональный?
Тем, что запись, суммирующая адреса нечитабельна. Структуры привычнее и удобнее.
Цитата Сообщение от tiger() Посмотреть сообщение
легитимно ли вообще
легитимно .
1
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
24.11.2014, 17:26  [ТС] 17
Цитата Сообщение от ValeryS Посмотреть сообщение
и что прямо все относятся к UARTу?
камень то какой?
Там вперемешку регистры настройки параметром и/ф, буфера все, настройки прерываний.
XC2000 серия (C166 ядро)
0
Voland_
24.11.2014, 17:27
  #18

Не по теме:

PS: похоже на изобретение велосипеда... Счас выяснится, что эта чудесная структура регистров это USB или Ethernet :)

0
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
24.11.2014, 17:27 19
Цитата Сообщение от Voland_ Посмотреть сообщение
ValeryS, это ж не то
Да сам заметил
просто не тот файл открыл
Зато ниже скинул то
1
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.11.2014, 17:28 20
tiger(), так разбейте на части - мухи и котлеты отдельно, а затем соберите в доп.структуры укрупненными блоками.
0
24.11.2014, 17:28
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2014, 17:28
Помогаю со студенческими работами здесь

Какими ещё способами можно ещё сделать?
Задание: Известно, что: 1 в третей степени будет=1 2 в третей степени будет=3+5 3 в третей...

Можно ли при работающем макросе как то пользоваться другими excel? Открывать, изменять, закрывать?
Собственно вопрос в заголовке И возможно ли использовать application.screenupdating и...

Как еще можно достучаться до БД?
Можно ли использовать другие модели доступа к БД, кроме как через ADO, ADO.NET. Только меня...

Можно ли пользоваться блоком питания ноутбука, после того как сработал автомат в электро щитке?
Подключил блок питания ноутбука к сети и выбило автомат, в воздухе немного запахло гарью. Подумал,...

как создать передаточную функцию звена, чтобы ей можно дальше пользоваться?(заменить элемент p, умножить. и т д)?
(5*p + 2)/(p^2+9*p+1)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
Что такое паттерны программировани­я и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
Что такое javascript:void­­(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru