|
|
  |
STM32 – вопросы – проблемы - решения. |
|
|
|
Feb 2 2012, 16:50
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Сергей Борщ @ Feb 2 2012, 20:26)  Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости". Документация - это ещё цветочки по сравнению с библиотекой  Вот что там: Код /* 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; Я даже табличку в экселе составил, пытаясь найти скрытый смысл этих манипуляций. Но так и не смог
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 3 2012, 09:57
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(AHTOXA @ Feb 2 2012, 19:50)  Я даже табличку в экселе составил, пытаясь найти скрытый смысл этих манипуляций. Но так и не смог  Если мне не изменяет память, то "не все уарты одинаковы", по смутным воспоминаниям некоторые уарты или мб лишь один из всех тактируютя не той частотой что и все остальные (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)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 3 2012, 10:14
|

Участник

Группа: Свой
Сообщений: 67
Регистрация: 11-07-07
Из: Екб
Пользователь №: 29 052

|
Цитата(adnega @ Feb 3 2012, 10:22)  Запускал на 103-их. Никаких камней под водой не обнаружено. До исходников могу добраться только вечером. Спасибо, разобрался  камней действительно никаких. Сам дурак  - на вход подавал синфазный сигнал, потому и результат не коррелировал с реальностью.
|
|
|
|
|
Feb 3 2012, 12:37
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 12-10-11
Из: Москва
Пользователь №: 67 699

|
Возникла проблема: Отладочная плата 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 - Feb 3 2012, 12:39
|
|
|
|
|
Feb 3 2012, 20:04
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

|
Цитата(ReRayne @ Feb 3 2012, 18:37)  Перерыла весь интернет, нигде ничего подобного не встречал, помогите =((( так все таки "он" или "она"?) к сожалению больше ничем в твоей проблеме помочь не могу( Очередная проблема. Имеем все тот же stm32f4 discovery, подключаем стандартную библиотеку SDIO, ну и тут сразу возникает несколько вопросов, как проверить инициализация прошла успешно или нет? И второй, я так думаю, что с первого раза ничего не получится как надо. Правильно ли я инициализировал SDIO? Повторюсь имеем stm32f4 discovery, среду разработки Atollic TRUEStudio, стандартную библиотеку stm32f4xx_sdio. Сейчас имеем примерно следующий код CODE #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 ну не запускается у меня ничего с первого раза
Сообщение отредактировал IgorKossak - Feb 3 2012, 20:30
Причина редактирования: [codebox]!!!
|
|
|
|
|
Feb 4 2012, 07:52
|

Группа: Участник
Сообщений: 13
Регистрация: 31-01-12
Из: Новоуральск
Пользователь №: 69 990

|
Цитата(kan35 @ Feb 4 2012, 13:09)  А настроен ли и разрешен ли периферийный PLL на 48МГц? Еще нюанс: вы разрешили bypass тактового сигнала, это значит что тактовый сигнал будет = частоте pll. Насколько я понимаю тактирование описано в файле (system_stm32f4xx.c) и SDIO там 48MHz CODE *============================================================================= * 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 - Feb 4 2012, 07:53
|
|
|
|
|
Feb 6 2012, 04:20
|

Частый гость
 
Группа: Свой
Сообщений: 107
Регистрация: 5-04-11
Из: г.Саратов
Пользователь №: 64 137

|
Цитата(ReRayne @ Feb 3 2012, 16:37)  4) временами все-таки вышвыривает меня в main и начинает дебажить А если снять галочку "Run to main()" и пошагать по инициализации, что будет при переходе в мейн? Цитата(ReRayne @ Feb 3 2012, 16:37)  0xFFFFFFFE Что-то сильно напоминает недопрожженную флешку, прочитать бы как-нибудь, что реально записалось после прошивки и сравнить с хексом, который кейл генерирует.
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|