Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2017, 15:05   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Работа с периферией ARM F100RBT6B без библиотеки CMSIS

После чтения этой статьи загорелся желанием написать программу для микроконтроллера ARM F100RBT6B (на плате STM32VL Discovery) с минимальным количеством вспомогательных библиотек, даже без CMSIS. То есть хочу писать напрямую в порты и чтобы при этом программа работала.

В распоряжении имеется файл stm32f100xb.h с определениями констант:

Код:
#define FLASH_BASE            0x08000000U /*!< FLASH base address in the alias region */
#define FLASH_BANK1_END       0x0801FFFFU /*!< FLASH END address of bank1 */
#define SRAM_BASE             0x20000000U /*!< SRAM base address in the alias region */
#define PERIPH_BASE           0x40000000U /*!< Peripheral base address in the alias region */

#define SRAM_BB_BASE          0x22000000U /*!< SRAM base address in the bit-band region */
#define PERIPH_BB_BASE        0x42000000U /*!< Peripheral base address in the bit-band region */

/*!< Peripheral memory map */
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000U)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x00020000U)

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x00000800U)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x00000C00U)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x00001000U)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x00001400U)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x00001800U)

#define GPIOA               ((GPIO_TypeDef *)GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *)GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *)GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *)GPIOD_BASE)
#define GPIOE               ((GPIO_TypeDef *)GPIOE_BASE)
Пример хелловорлда в статье такой:

Код:
#if defined(__ARM_ARCH_6M__)

/* Cortex-M0 это ARMv6-M, код для LPC1114 */

#define GPIO_DIR_REG  0x50018000  /* GPIO1DIR  задает направление для блока GPIO 1 */
#define GPIO_REG_VAL  0x50013FFC  /* GPIO1DATA задает значение для блока GPIO 1 */
#define GPIO_PIN_NO   (1<<8)      /* 8-й бит отвечает за 8-й пин */

#elif defined(__ARM_ARCH_7M__)

/* Иначе просто считаем что это LPC1768 */

#define GPIO_DIR_REG  0x2009C020  /* FIO1DIR задает направление для блока GPIO 1 */
#define GPIO_REG_VAL  0x2009C034  /* FIO1PIN задает значение для блока GPIO 1 */
#define GPIO_PIN_NO   (1<<18)     /* 18-й бит отвечает за 18-й пин */

#else

#error Unknown architecture

#endif

void wait()
{
  volatile int i=0x20000;
  while(i>0) {
    --i;
  }
}

void main()
{
  *((volatile unsigned int *)GPIO_DIR_REG) = GPIO_PIN_NO;

  while(1) {
    *((volatile unsigned int *)GPIO_REG_VAL) = GPIO_PIN_NO;
    wait();
    *((volatile unsigned int *)GPIO_REG_VAL) = 0;
    wait();
  }

  /* main() *никогда* не должен вернуться! */
}
Имея информацию об адресах портов, можно ли написать аналогичную программу под мой МК или перед тем, как писать в порты периферии нельзя обойтись без запуска тактирования этой периферии?

Хочу обойтись без библиотеки CMSIS для познания дзена.
Aoizora вне форума Ответить с цитированием
Старый 13.07.2017, 12:16   #2
pbt
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Имея информацию об адресах портов, можно ли написать аналогичную программу под мой МК
Можно. Открывайте даташит и смотрите по каким адресам находится нужная периферия, как ее правильно конфигурировать и т. д.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
нельзя обойтись без запуска тактирования этой периферии?
Нельзя.

Приведенного кода мало. Нужно еще описать все векторы прерываний, точку входа в программу (вектор Reset_Handler) и добавить код начальной инициализации и настройки тактирования.
pbt вне форума Ответить с цитированием
Старый 13.07.2017, 12:45   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Имея информацию об адресах портов, можно ли написать аналогичную программу под мой МК или перед тем,
Да.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
или перед тем, как писать в порты периферии нельзя обойтись без запуска тактирования этой периферии?
Да. 99% периферии являются синхронными схемами.
А что ваша периферия не получает тактирования после падания напряжения?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 13.07.2017, 13:57   #4
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от pbt Посмотреть сообщение
Приведенного кода мало. Нужно еще описать все векторы прерываний, точку входа в программу (вектор Reset_Handler) и добавить код начальной инициализации и настройки тактирования.
Первые два вектора прерывания я описал в boot.s. Автор статьи говорит, что этого хватит и достаточно даже просто указать main.
Aoizora вне форума Ответить с цитированием
Старый 18.07.2017, 22:47   #5
pbt
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Да. 99% периферии являются синхронными схемами.
Вы точно знакомы с STM32?
Перед работой с периферией ее тактирование нужно включать. После начала работы МК тактирование большинства периферии выключено.
pbt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
asm и arm(stm32) evilboy Помощь студентам 0 03.06.2012 20:42
компиляция под arm tiger() Qt и кроссплатформенное программирование С/С++ 3 07.04.2012 14:32
Работа с txt файлами, библиотеки, заголовочные файлы (C++) Alendorff Помощь студентам 1 29.02.2012 20:05
Задание по символам!Если можно то без библиотеки string.h PainkilleRRR Общие вопросы C/C++ 10 28.02.2011 09:15
Assembler для ARM Natali2003 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 29.01.2009 14:25