STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

afz писал(а):Повторюсь: как для STM32 программировать на асме?
Гугл знает, например:
http://www.stm32asm.ru/
http://we.easyelectronics.ru/STM32/asm- ... chalo.html
"файлы с определениями имён регистров периферии и битов в них" похоже придется самому побеспокоиться

з.ы. имхо вполне достаточно почитать об ассемблере какую нибудь книженцию типа "Ю Дж. Ядро Cortex-M3 компании ARM. Полное руководство. 2012"
Реклама
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: STM32 новичку в ARM что к чему

Сообщение baghear »

Для обработки энкодера используются два канала таймера, то есть в этом случае они работают как входы. Эти же каналы можно использовать как выходы, для генерации шим. Как МК определяет как настроить канал?
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 новичку в ARM что к чему

Сообщение Мурик »

baghear писал(а):Как МК определяет как настроить канал?
Как настроите таймер, так он и будет работать.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: STM32 новичку в ARM что к чему

Сообщение baghear »

Спасибо!!!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: STM32 новичку в ARM что к чему

Сообщение baghear »

Добрый день, подскажите пожалуйста как включить поддержку FSMC в 407. У 103 серии для этого можно было установить пару галочек, а для 407 предлагается генерировать код в Cube, можно ли как-то это сделать без Cube, но с помощью HAL?
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

baghear писал(а):Добрый день, подскажите пожалуйста как включить поддержку FSMC в 407. У 103 серии для этого можно было установить пару галочек, а для 407 предлагается генерировать код в Cube, можно ли как-то это сделать без Cube, но с помощью HAL?
Код для работы с LCD:
Спойлер

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

	FSMC_NORSRAM_InitTypeDef fsmc;
	FSMC_NORSRAM_TimingTypeDef fsmcTiming;

	fsmcTiming.AddressSetupTime = 4;
	fsmcTiming.AddressHoldTime = 0;
	fsmcTiming.DataSetupTime = 6;
	fsmcTiming.BusTurnAroundDuration = 0;
	fsmcTiming.CLKDivision = 0;
	fsmcTiming.DataLatency = 0;
	fsmcTiming.AccessMode = FSMC_ACCESS_MODE_A;

	fsmc.NSBank = FSMC_NORSRAM_BANK1;
	fsmc.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
	fsmc.MemoryType = FSMC_MEMORY_TYPE_SRAM;
	fsmc.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
	fsmc.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
	fsmc.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
	fsmc.WrapMode = FSMC_WRAP_MODE_DISABLE;
	fsmc.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
	fsmc.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
	fsmc.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
	fsmc.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
	fsmc.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
	fsmc.WriteBurst = FSMC_WRITE_BURST_DISABLE;
	fsmc.PageSize = 0;

	FSMC_NORSRAM_Init(FSMC_Bank1, &fsmc);
	FSMC_NORSRAM_Timing_Init(FSMC_Bank1, &fsmcTiming, FSMC_NORSRAM_BANK1);
	__FSMC_NORSRAM_ENABLE(FSMC_Bank1, FSMC_NORSRAM_BANK1);
Реклама
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: STM32 новичку в ARM что к чему

Сообщение baghear »

Код инициализации у меня есть, keil жалуется, что он не знает таких структур. Как их подключить БЕЗ генерации проекта в CUBE?
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: STM32 новичку в ARM что к чему

Сообщение aam »

Пытаюсь завести в железе UART1 в STM32F030. Написал такой код:
Спойлер

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

//----------------- Настройка портов ввода-вывода (SPL) ----------------------
 GPIO_InitTypeDef GPIO_Init_struct;  //Объявляем структуру для настройки порта
 GPIO_StructInit(&GPIO_Init_struct); //Заполняем структуру начальными значениями
    
 //Разрешаем тактирование шины порта A и B
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE); 
 
 //Режим работы портов - медленный, до 2МГц
 GPIO_Init_struct.GPIO_Speed = GPIO_Speed_2MHz; 
 
 //Настройка порта А
 GPIO_Init_struct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;  //Настройка выводов 6 и 7
 GPIO_Init_struct.GPIO_Mode = GPIO_Mode_OUT;
 GPIO_Init(GPIOA, &GPIO_Init_struct);                //Применяем настройки порта А
 
 
 //Для порта B
 //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //Разрешаем тактирование шины порта B
 GPIO_Init_struct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;  //Настройка выводов 0 и 1 
                                                     //(остальные настройки как для предыдущего порта)
 GPIO_Init(GPIOB, &GPIO_Init_struct);                //Применяем настройки порта B
 
 
 GPIO_SetBits(GPIOA, GPIO_Pin_6);
 

//------------------------- Настройка UART (SPL) ------------------------------
#define UART_GPIO   GPIOA       //порт UART
#define UART_TX_Pin GPIO_Pin_9  //выход передатчика (TX)
#define UART_RX_Pin GPIO_Pin_10 //вход приемника (RX)
 
 //Настройка выводов для работы с UART
 // UART_TX_Pin -> TX UART (выход)
 GPIO_Init_struct.GPIO_Pin = UART_TX_Pin;       //настройка вывода 9 порта
 GPIO_Init_struct.GPIO_Mode = GPIO_Mode_AF;    //режим альтернативной функции
 GPIO_Init_struct.GPIO_Speed = GPIO_Speed_2MHz;//скорость работы порта - до 2МГц
 GPIO_Init_struct.GPIO_OType = GPIO_OType_PP;  //тип выхода - двухтактный
 GPIO_Init_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;//без подтягивающего резистора
 GPIO_Init(UART_GPIO, &GPIO_Init_struct);          //Инициализируем
 
 // UART_RX_Pin -> RX UART (вход)
 GPIO_Init_struct.GPIO_Pin = UART_RX_Pin;      //настройка вывода 10 порта 
 GPIO_Init_struct.GPIO_Mode = GPIO_Mode_IN;  //вход
                                               //скорость работы порта - до 2МГц
                                               //тип выхода - [нет]
 GPIO_Init_struct.GPIO_PuPd = GPIO_PuPd_UP;    //подтягивающий резистор к VCC 
 GPIO_Init(UART_GPIO, &GPIO_Init_struct);          //Инициализируем
 

 /* Настройка UART:
    - Скорость обмена               - 9600 бод  
    - Длина посылки                 - 8 бит
    - Стоповый бит                  - 1
    - Контроль четности             - Выкл.
    - Аппаратное управление потоком - Выкл.
    - Прием и передача              - Вкл.
 */
 USART_InitTypeDef USART_InitStructure; //Объявляем структуру для параметров UART
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //Разрешаем тактирование UART1
 
 USART_InitStructure.USART_BaudRate = 9600;                     // скорость
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;    //8 бит данных
 USART_InitStructure.USART_StopBits = USART_StopBits_1;         //один стоп бит
 USART_InitStructure.USART_Parity = USART_Parity_No;            //четность - нет
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//прием и передача
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// управлени потоком - нет
        
//USART_OverSampling8Cmd(ENABLE); //можно уменьшить частоту семплирования  
//USART_OneBitMethodCmd(ENABLE); //можно уменьшить количество стробирований
//USART_HalfDuplexCmd (ENABLE); // можно выбрать полудуплексный режим.
        
 USART_Init(USART1, &USART_InitStructure); //инизиализируем
 
 //Разрешим генерировать прерывание по приему и передачи
 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
 
 USART_Cmd(USART1, ENABLE);//Разрешаем использовать UART
 
 USART_SendData(USART1,0xAA); <------------------------------------------------------------------------------тест
 
 NVIC_EnableIRQ(USART1_IRQn); //Разрешаем прерывания от UART1
 
 
 //--- конец настройки UART
Не работает! :dont_know:
Причем при включении прерывание хотя бы 1 раз генерится и уходит на ошибку "Framing error" (смотрел что в регистре ISR).
Вставил в код строчку (тест) чтобы посмотреть, работает ли вообще передатчик. В итоге на ноге PA9 код 0xAA не выдается (смотрел запоминающим осцилом по триггеру) . Более того, эта нога почему-то смотрится как вход - если не подключена - на ней напряжение коло 0, если подтягиваю к плюсу через резистор 10 кОм - на ней питание. :shock: В чем дело?
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: STM32 новичку в ARM что к чему

Сообщение BorisSPB »

А где выбор альтернативной функции?
Вот из примеров STM:

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

  /* Connect PXx to USARTx_Tx */
  GPIO_PinAFConfig(USARTx_TX_GPIO_PORT, USARTx_TX_SOURCE, USARTx_TX_AF);
  
  /* Connect PXx to USARTx_Rx */
  GPIO_PinAFConfig(USARTx_RX_GPIO_PORT, USARTx_RX_SOURCE, USARTx_RX_AF);
 
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

aam, оба пина надо настраивать как AF...

STM32F030F4 TSSOP20
Пины PA9 и PA10

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

#define APBCLK 48000000UL
#define BAUDRATE 115200UL

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

void Usart_init (void) 
    {
      RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
      RCC->APB2ENR|=RCC_APB2ENR_USART1EN;
   
      
      GPIOA->MODER &= ~( GPIO_MODER_MODER10 |GPIO_MODER_MODER9);
      GPIOA->MODER |=  GPIO_MODER_MODER10_1 |GPIO_MODER_MODER9_1; 
      
			
      GPIOA->AFR[1] |=(1<<(4*1)) |(1<<(4*2));

      USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //
      USART1->CR1 |= USART_CR1_TE |USART_CR1_RE|USART_CR1_RXNEIE; // 
      USART1->CR1 |= USART_CR1_UE; //  
			
      NVIC_SetPriority(USART1_IRQn, 0); 
      NVIC_EnableIRQ(USART1_IRQn); 
          
    }

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

void Usart_Transmit(uint8_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = Data;
}

void USART1_IRQHandler(void)
{
	uint16_t rx;
	if(USART1->ISR & USART_ISR_RXNE)
	{

 
    rx = (uint8_t)(USART1->RDR); // Receive data, clear flag 
 
   
		 if(rx==0x0D) 
		 {
			ReadStat= 1;
		 }
	}
}


void USART1_str (const char * data)
{

	
	while((*data )){ 
	  Usart_Transmit (*data);
		data++;
	  }
}

a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

dosikus писал(а):

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

#define APBCLK 48000000UL
#define BAUDRATE 115200UL
У F030 APBCLK называется PCLK и данный источник тактирования для USART1 не является единственно-возможным:

Clock configuration register 3 (RCC_CFGR3)
===========
Bits 1:0 USART1SW[1:0]: USART1 clock source selection

This bit is set and cleared by software to select the USART1 clock source.

00: PCLK selected as USART1 clock source (default)
01: System clock (SYSCLK) selected as USART1 clock
10: LSE clock selected as USART1 clock
11: HSI clock selected as USART1 clock

Часто может оказаться более удобным использовать для тактирования HSI, т.к. в этом случае настройки последовательного порта не зависят ни от каких изменений в схеме тактирования МК. В функции инициализации порта можно сразу вставить "рыбу":

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

        RCC->CFGR3 = ( // (RCC->CFGR3 & ~(RCC_CFGR3_USART1SW_0 | RCC_CFGR3_USART1SW_1)) |
          // RCC_CFGR3_USART1SW_PCLK                        
          // RCC_CFGR3_USART1SW_SYSCLK                      
          // RCC_CFGR3_USART1SW_LSE                         
          RCC_CFGR3_USART1SW_HSI        // 8 MHz HSI clock
        );
где в удобной форме выбирать нужный источник.

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

      USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //
Ни к чему эти выкрутасы. В референсе черным по белому написано:

To obtain 921.6 Kbaud with fCK = 48 MHz.
• In case of oversampling by 16:
USARTDIV = 48 000 000/921 600
BRR = USARTDIV = 52d = 34h


Т.е. BRR = частота_тактирования_порта/скорость_в_бодах

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

void Usart_Transmit(uint8_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = Data;
}
Нет никакого смысла при передаче ждать, пока весь байт вытолкнется в линию. Правильнее ориентироваться по опустошению регистра данных:

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

void Usart_Transmit(uint8_t Data) {
  while ((USART1->ISR & USART_ISR_TXE) != USART_ISR_TXE);
  USART1->TDR = Data;
}

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

       if(rx==0x0D)
       {
         ReadStat= 1;
       }
Не знаете матчасть, dosikus. На F0хх прием конкретного символа можно отслеживать аппаратно, хоть с вызовом прерывания по данному событию.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 новичку в ARM что к чему

Сообщение scorpi_0n »

a5021 писал(а): Ни к чему эти выкрутасы. В референсе черным по белому написано:

Не знаете матчасть, dosikus.
В отличие от dosikus, вы не знаете ни матчасть, ни математику. Ваша безграмотность просто безмерна. Хотя занятия в школе уже давно начались, вы продолжаете их упорно прогуливать. Про "выкрутасы" было особенно смешно.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

a5021 писал(а): Ни к чему эти выкрутасы. В референсе черным по белому написано:

To obtain 921.6 Kbaud with fCK = 48 MHz.
• In case of oversampling by 16:
USARTDIV = 48 000 000/921 600
BRR = USARTDIV = 52d = 34h


Т.е. BRR = частота_тактирования_порта/скорость_в_бодах
Там два примера, для 921.6K и 9600 бод.

48M / 921 600 = 52.083 = 52
2 * 8М / 9600 = 1666,66 = 1667
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

scorpi_0n писал(а):В отличие от dosikus, вы не знаете ни матчасть, ни математику. Ваша безграмотность просто безмерна. Хотя занятия в школе уже давно начались, вы продолжаете их упорно прогуливать. Про "выкрутасы" было особенно смешно.
Доставляет, как вы старательно избегаете любых подробностей и технических деталей. Только вопли. Страшит проколоться и загреметь вслед за досикусом? Согласен, вам есть чего опасаться.
Reflector писал(а): Там два примера, для 921.6K и 9600 бод.

48M / 921 600 = 52.083 = 52
2 * 8М / 9600 = 1666,66 = 1667
Второй пример для восьмибитного семплирования. Найдется не сильно много случаев, когда использование этого режима будет оправдано.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 новичку в ARM что к чему

Сообщение scorpi_0n »

a5021 писал(а): Второй пример для восьмибитного семплирования. Найдется не сильно много случаев, когда использование этого режима будет оправдано.
Учитывая вашу маниакальную привычку к ногодрыгу, вам 98% режимов периферии не нужны ни под каким соусом. Однако не стоит так настойчиво выдавать это за правило.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

a5021 писал(а): Второй пример для восьмибитного семплирования. Найдется не сильно много случаев, когда использование этого режима будет оправдано.
Да какая разница какое семплирование...
8M / 19200 = 416.(6)
48M / 115200 = 416.(6)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

scorpi_0n писал(а):Учитывая вашу маниакальную привычку к ногодрыгу
Вам бы с галлюцинациями своими как-нибудь разобраться, а не про мои привычки рассуждать.
Reflector писал(а): Да какая разница какое семплирование...
8M / 19200 = 416.(6)
48M / 115200 = 416.(6)
Вы показываете, что для разных пар делимое/делитель, частное может быть одним и тем же числом? Ну да, это арифметика. Или вы что таким образом хотели сказать?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

a5021 писал(а):Вы показываете, что для разных пар де6лимое/делитель, частное может быть одним и тем же числом? Ну да, это арифметика. Или вы что таким образом хотели сказать?
Я хотел сказать, что желательно округлять результат деления до ближайшего целого(даже если не используется 8-ми битное семплирование). Для этого обычно к делимому добавляют половинку baudRate, что код dosikusa и делает.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 новичку в ARM что к чему

Сообщение scorpi_0n »

a5021 писал(а): Вам бы с галлюцинациями своими как-нибудь разобраться
Не с моими, а с вашими. Тут хватит нескольких ваших последних постов. То у вас "индусы" не тот код пишут, то у вас разрабы СТМ ненужные режимы в МК впихнули, то dosikus матчасть не знает, то учителя в школе вас делению с округлением не научили. А вы точно свой диагноз "Дартаньян" у психиатра оспаривать не будете?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

a5021 писал(а): Не знаете матчасть, dosikus. На F0хх прием конкретного символа можно отслеживать аппаратно, хоть с вызовом прерывания по данному событию.
Научился читать документацию? Значит наши пинки даром не прошли. :)))
Тебе болезному сообщаю, эту фичу уже год как гоняю в modbus и RTU и ASCII вместе с CRC, а то что скопипастил сюда - наброски трехлетней давности.
Но ты продолжай, продолжай... :))) :)))
Ответить

Вернуться в «ARM»