Перейти к содержанию
    

STM32 – вопросы – проблемы - решения.

Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".

Документация - это ещё цветочки по сравнению с библиотекой:)

Вот что там:

  /* Determine the integer part */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    /* Integer part computing in case Oversampling mode is 8 Samples */
    integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));    
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    /* Integer part computing in case Oversampling mode is 16 Samples */
    integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));    
  }
  tmpreg = (integerdivider / 100) << 4;

  /* Determine the fractional part */
  fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

  /* Implement the fractional part in the register */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  }
  
  /* Write to USART BRR */
  USARTx->BRR = (uint16_t)tmpreg;

Я даже табличку в экселе составил, пытаясь найти скрытый смысл этих манипуляций. Но так и не смог:)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Документация - это ещё цветочки по сравнению с библиотекой:)

Вот что там:

Просто супер! Я снова порадовался, что не использую эту "библиотеку".

В принципе логику проследить можно. Просто всё это уместилось бы строчки в 3 кода, если бы автор кода ненадолго отвлёкся от нажимания кнопок и включил моск :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день всем.

 

 

Есть STM32F407. Пытаюсь запустить таймер TIM1 в режиме счетчика квадратурного сигнала от енкодера. Но как-то успехов особых пока нет.

На реальный квадратурный сигнал никакой реакции не происходит. Если настраивать таймер просто как счетный, то все работает.

 

Кто-нибудь уже запускал таймер в данном режиме? поделитесь опытом какие тут подводные камни.

 

А вообще задача стоит чтобы по входному квадратурному сигналу определять направление, кол-во импульсов, и период следования импульсов.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь уже запускал таймер в данном режиме? поделитесь опытом какие тут подводные камни.

 

Запускал на 103-их. Никаких камней под водой не обнаружено.

До исходников могу добраться только вечером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос: Можно ли использовать ST-LINK при отладке других АРМ-контроллеров (не ST)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я даже табличку в экселе составил, пытаясь найти скрытый смысл этих манипуляций. Но так и не смог:)
Если мне не изменяет память, то "не все уарты одинаковы", по смутным воспоминаниям некоторые уарты или мб лишь один из всех тактируютя не той частотой что и все остальные (PCLK1 либо PCLK2).

И это библиотекой корректно учитывается.

Точно, глянул TRM раздел 27.3.4 Fractional baud rate generation:

fCK - Input clock to the peripheral (PCLK1 for USART2, 3, 4, 5 or PCLK2 for USART1)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запускал на 103-их. Никаких камней под водой не обнаружено.

До исходников могу добраться только вечером.

 

Спасибо, разобрался :) камней действительно никаких. Сам дурак :laughing: - на вход подавал синфазный сигнал, потому и результат не коррелировал с реальностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос: как STM32F103 без внешнего супервизора живут?

Дык у них специально power-up/power-down reset сделан так, чтобы внешний супервизор не требовался. Я его никогда не ставил, и проблем не было. Но в условиях помех не тестировал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возникла проблема:

Отладочная плата STARTERKIT SK-STM32F217.

Программатор JetLink8/Ultra, драйвер 4.40d.

Среда разработки: Keil 4.23.

На плате крутился FreeRTOS 7.1, и очень долгое время все было прекрасно.

Плата стартует бутлоадером по адресу 0x8000000, и перекидывает нас на адрес 0x8040000, откуда начинает выполнялся основная прошивка.

Но в какой-то момент при открытии сначала слетели все настройки программатора.

Ну а потом вообще начался цирк с конями:

1) прошивка с программатором стартует через раз;

2) начало появляться странное окошко, которого раньше не было (J-Link reprogramming flash), которое постоянно перезаписывает чистит сектора флеша на чипе;

3) в файле стартапа успешно инициализирует железо, но при этом в main не переходит, а выкидывается на адрес 0xFFFFFFFE;

4) временами все-таки вышвыривает меня в main и начинает дебажить, но в произвольный момент времени при пошаговой трассировке может просто намертво повиснуть в Trace:Running(перед этим обязательно появляется J-Link reprogramming flash).

5) во время все той же пошаговой трассироки может внезапно возникнуть инструкция в дизасемблере MOVS 0xFFFFFFFE и мы улетаем черт знает куда;

6) при попытке остановить улетевший в никуда процессор вываливает "Can't stop Cortex-M3";

 

Перерыла весь интернет, нигде ничего подобного не встречал, помогите =(((

Изменено пользователем ReRayne

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перерыла весь интернет, нигде ничего подобного не встречал, помогите =(((

так все таки "он" или "она"?) к сожалению больше ничем в твоей проблеме помочь не могу(

 

Очередная проблема. Имеем все тот же stm32f4 discovery, подключаем стандартную библиотеку SDIO, ну и тут сразу возникает несколько вопросов, как проверить инициализация прошла успешно или нет? И второй, я так думаю, что с первого раза ничего не получится как надо. Правильно ли я инициализировал SDIO? Повторюсь имеем stm32f4 discovery, среду разработки Atollic TRUEStudio, стандартную библиотеку stm32f4xx_sdio.

 

Сейчас имеем примерно следующий код

#include "stm32f4xx.h"
#include "stm32f4xx_sdio.h"

uint32_t PowerState;
uint32_t DataCounter;

void vSDIO_Init ( void ) {
  GPIO_InitTypeDef  GPIO_InitStructure;
  SDIO_InitTypeDef SDIO_InitStructure;

  /* GPIOC and GPIOD Periph clock enable */
  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE );
  /* Enable the SDIO APB2 Clock */
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE );



  /* Configure PC.12 pin: CLK pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIOC->BSRRL = GPIO_Pin_12;
  GPIOC->BSRRH = GPIO_Pin_12;
  GPIOC->BSRRL = GPIO_Pin_12;
  GPIOC->BSRRH = GPIO_Pin_12;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_Init(GPIOC, &GPIO_InitStructure);


  /* Configure PD.02 CMD line */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_Init(GPIOC, &GPIO_InitStructure);


  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);


  RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE);
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE);

  SDIO_InitStructure.SDIO_ClockDiv = 0x00;
  SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Enable;
  SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
  SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  SDIO_Init(&SDIO_InitStructure);

  /*!< Set Power State to ON */
  SDIO_SetPowerState(SDIO_PowerState_ON);

  /*!< Enable SDIO Clock */
  SDIO_ClockCmd(ENABLE);
}

int main(void)
{
vSDIO_Init();


	while (1) {
		PowerState = SDIO_GetPowerState();
		DataCounter = SDIO_GetDataCounter();
	}
}

естественно в переменных "DataCounter", "PowerState " всегда 0x00 ну не запускается у меня ничего с первого раза :laughing:

Изменено пользователем IgorKossak
[codebox]!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А настроен ли и разрешен ли периферийный PLL на 48МГц?

Еще нюанс: вы разрешили bypass тактового сигнала, это значит что тактовый сигнал будет = частоте pll.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А настроен ли и разрешен ли периферийный PLL на 48МГц?

Еще нюанс: вы разрешили bypass тактового сигнала, это значит что тактовый сигнал будет = частоте pll.

Насколько я понимаю тактирование описано в файле (system_stm32f4xx.c) и SDIO там 48MHz

 *=============================================================================
 *        Supported STM32F4xx device revision    | Rev A
 *-----------------------------------------------------------------------------
 *        System Clock source                    | PLL (HSE)
 *-----------------------------------------------------------------------------
 *        SYSCLK(Hz)                             | 168000000
 *-----------------------------------------------------------------------------
 *        HCLK(Hz)                               | 168000000
 *-----------------------------------------------------------------------------
 *        AHB Prescaler                          | 1
 *-----------------------------------------------------------------------------
 *        APB1 Prescaler                         | 4
 *-----------------------------------------------------------------------------
 *        APB2 Prescaler                         | 2
 *-----------------------------------------------------------------------------
 *        HSE Frequency(Hz)                      | 8000000
 *-----------------------------------------------------------------------------
 *        PLL_M                                  | 8
 *-----------------------------------------------------------------------------
 *        PLL_N                                  | 336
 *-----------------------------------------------------------------------------
 *        PLL_P                                  | 2
 *-----------------------------------------------------------------------------
 *        PLL_Q                                  | 7
 *-----------------------------------------------------------------------------
 *        PLLI2S_N                               | 258
 *-----------------------------------------------------------------------------
 *        PLLI2S_R                               | 3
 *-----------------------------------------------------------------------------
 *        I2S input clock(Hz)                    | 86000000
 *                                               |
 *        To achieve the following I2S config:   |
 *         - Master clock output (MCKO): ON      |
 *         - Frame wide                : 16bit   |
 *         - Audio sampling freq (KHz) : 48      |
 *         - Error %                   : 0.0186  |
 *         - Prescaler Odd factor (ODD): 0       |
 *         - Linear prescaler (DIV)    : 2       |
 *-----------------------------------------------------------------------------
 *        VDD(V)                                 | 3.3
 *-----------------------------------------------------------------------------
 *        Main regulator output voltage          | Scale1 mode
 *-----------------------------------------------------------------------------
 *        Flash Latency(WS)                      | 5
 *-----------------------------------------------------------------------------
 *        Prefetch Buffer                        | OFF
 *-----------------------------------------------------------------------------
 *        Instruction cache                      | ON
 *-----------------------------------------------------------------------------
 *        Data cache                             | ON
 *-----------------------------------------------------------------------------
 *        Require 48MHz for USB OTG FS,          | Enabled
 *        SDIO and RNG clock                     |
 *-----------------------------------------------------------------------------
 *=============================================================================

Изменено пользователем mrcrook

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4) временами все-таки вышвыривает меня в main и начинает дебажить

А если снять галочку "Run to main()" и пошагать по инициализации, что будет при переходе в мейн?

0xFFFFFFFE

Что-то сильно напоминает недопрожженную флешку, прочитать бы как-нибудь, что реально записалось после прошивки и сравнить с хексом, который кейл генерирует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На той неделе "морозили" изделие на основе STM32F1xx.

При температуре ниже минус 65 работало без проблем (ниже не получалось).

Если нужны подробности, можно их развить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...