31.05.2012, 00:27
|
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
А у меня какая-то жесть прям происходит.
Придется приводить весь код, чтобы поверили.
main():
PHP код:
|
int main(void) { RCC_Configuration(); //SysTick_Config(SystemCoreClock / 1); GPIO_Configuration(); TIM_Configuration (); HallInterface_Configuration ();
while(1) {
} }
|
RCC_Configuration():
PHP код:
|
void RCC_Configuration(void) { RCC_DeInit (); /* RCC system reset(for debug purpose)*/ RCC_HSEConfig (RCC_HSE_ON); /* Enable HSE */
/* Wait till HSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_HCLKConfig (RCC_SYSCLK_Div1); /* HCLK = SYSCLK */ RCC_PCLK2Config (RCC_HCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK1Config (RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */ RCC_ADCCLKConfig (RCC_PCLK2_Div4); /* ADCCLK = PCLK2/4 */
/* PLLCLK = 8MHz * 3 = 72 MHz */ RCC_PLLConfig (0x00010000, RCC_PLLMul_3);
RCC_PLLCmd (ENABLE); /* Enable PLL */
/* Wait till PLL is ready */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* Select PLL as system clock source */ RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */ while (RCC_GetSYSCLKSource() != 0x08); RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); }
|
PHP код:
|
void GPIO_Configuration(void) { /* Initialize Leds mounted on STM32 board */ GPIO_InitTypeDef GPIO_InitStructure; /* Initialize LED which connected to PC6,9, Enable the Clock*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_DeInit(GPIOC); /* Configure the GPIO_LED pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_9); }
|
TIM_Configuration ():
PHP код:
|
void TIM_Configuration (void) { /** * TIM2 mocks Hall sensors output by consequently generating DMA request * to fetch from memory next state of three output pins * HallU - PC10 * HallV - PC11 * HallW - PC12 */ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; DMA_InitTypeDef DMA_InitStructure;
const uint32_t GPIO_PinsState[6] = { 134222848, 402654208, 268438528, 335546368, 67115008, 201330688 };
uint16_t FullCycleFreq = 1240; //Hz, 6 steps, full electrical rotation uint16_t TimerFreq = FullCycleFreq * 6; uint16_t TimerPeriod = (uint16_t)(SystemCoreClock/(TimerFreq + 1));
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC-›BSRR = (1‹‹25)+(1‹‹24)+(1‹‹11);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel2); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) GPIOC_BSRR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32) GPIO_PinsState; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure); //TIM2_UP = Channel2
DMA_Cmd(DMA1_Channel2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = TimerPeriod; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE); }
|
После этого юзерские светодиоды не горят (с чего бы?) и на осцилле картинка IMAG008.jpg (как мне и надо, пока все ОК).
Дальше, InterfaceTimerSetup ():
PHP код:
|
void InterfaceTimerSetup (void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure1.TIM_Prescaler = 12;//126; TIM_TimeBaseStructure1.TIM_CounterMode = TIM_CounterMode_Down;//TIM_CounterMode_Up; TIM_TimeBaseStructure1.TIM_Period = 1;//65535; TIM_TimeBaseStructure1.TIM_ClockDivision = 1;//0; TIM_TimeBaseStructure1.TIM_RepetitionCounter = 1;//0; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure1);
}
|
После заполнения структуры зажигается светодиод на PC9 (уровень постоянно высокий) и картинка на осцилле меняется на IMAG007.jpg. Я даже не запустил таймер!
Менял таймер на TIM3, то же самое. Что за фигня происходит?
P.S. Желтый сигнал с PC11
P.S.S. Происходит это прям при входе в функцию. Только что заметил, что с настройками "без оптимизации" и "optimize size" проблема есть, при включении оптимизации 1-3 проблема исчезает. Реально какая-то жуткая невиданная хрень. Мы все умрем ИМХО.
P.S.S.S. Проблема исчезает временно, при дальнейшей инициализации Capture/Compare каналов сигнал опять разъезжается, каждый раз одинаково для одного и того же уровня оптимизации, но по-разному для разных.
Последний раз редактировалось dccharacter; 31.05.2012 в 00:40.
|
|
|
|
31.05.2012, 10:47
|
|
Прописка
Регистрация: 10.08.2010
Сообщений: 113
Сказал спасибо: 30
Сказали Спасибо 43 раз(а) в 26 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
st__1, а в чем собственно разница:
у меня
Код:
|
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_TXE));
SPI1-›DR = data & 0xFF;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_RXNE));
recive=(recive‹‹8) | SPI1-›DR; |
предлагаете вы
Код:
|
while (!(SPIx-›SR & 2));
SPIx-›DR=byte;
while (!(SPIx-›SR & 1)); |
Код:
|
#define SPI_SR_RXNE ((uint8_t)0x01) /*!‹ Receive buffer Not Empty */
#define SPI_SR_TXE ((uint8_t)0x02) |
пробовал с проверкой BSY и без - одинаково.
У меня же оно все работает в режиме отладки!!!
|
|
|
|
31.05.2012, 11:14
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от avs2009
|
предлагаете вы
|
ХДЕ???
Предложил Easyrider83... меня лишь улыбнула форма его записи...
Сообщение от avs2009
|
У меня же оно все работает в режиме отладки!!!
|
Подозреваю, что у вас где-то не выдерживаются тайминги... При отладке ИАР, ИМХО, лихо подтормаживает и у вас поэтому всё работает...
|
|
|
|
31.05.2012, 11:22
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от dccharacter
|
Только что заметил, что с настройками "без оптимизации" и "optimize size" проблема есть, при включении оптимизации 1-3 проблема исчезает. Реально какая-то жуткая невиданная хрень.
|
"Этот вой у них песней зовётся" (С)
Не хочу вас пугать... но алгоритм проги, ИМХО, придётся пересматривать...
|
|
|
|
31.05.2012, 11:39
|
|
Прописка
Регистрация: 10.08.2010
Сообщений: 113
Сказал спасибо: 30
Сказали Спасибо 43 раз(а) в 26 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
st__1, тайминги? Я же проверяю состояние битов перед записью и чтением.
Попробую тормоз приделать после проверки.... но что -то сомневаюсь в результате.
Может что-то еще с JTAG надо сделать?
Я отключаю так:
Код:
|
AFIO-›MAPR|=AFIO_MAPR_SWJ_CFG_1; |
Пока писал откуда-то пришла мысль ![Идея!](images/smilies/icon_idea.gif) может надо
альтернативные функции тактировать до конфигурации AFIO?
P.S. ![Очень счастлив](images/smilies/icon_grin.gif) Мысль была верная. Код заработал в любых режимах.
Последний раз редактировалось avs2009; 31.05.2012 в 18:08.
Причина: решено.
|
|
|
|
31.05.2012, 12:23
|
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от st__1
|
"Этот вой у них песней зовётся" (С)
Не хочу вас пугать... но алгоритм проги, ИМХО, придётся пересматривать...
|
Да я не из пугливых. Только там алгоритма нет. Главный цикл - пустой.
|
|
|
|
31.05.2012, 12:52
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А причём здесь главный цикл???
Я вам пытаюсь объяснить, что то, с чем вы столкнулись, вполне нормально...
Компилятор "играет так, как может", конвейер АРМа - "играет, как умеет"...
Если вам нужны жёсткие тайминги, то "нужно постараться"...
|
|
|
|
31.05.2012, 12:56
|
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от st__1
|
А причём здесь главный цикл???
Я вам пытаюсь объяснить, что то, с чем вы столкнулись, вполне нормально...
Компилятор "играет так, как может", конвейер АРМа - "играет, как умеет"...
Если вам нужны жёсткие тайминги, то "нужно постараться"...
|
Ну он как-то странно умеет. Там частота всего около 8 кГц. Приоритет ДМА вроде максимальный. Ну хрен с ним с ДМА - отчего зажигается светодиод? Такое чувство что кот-то залезает не в свою память, т.е. наверняка где-то моя стандартная ошибка - вместо указателя передать указатель на указатель. Но все глаза просмотрел - ничего найти не могу.
|
|
|
|
31.05.2012, 13:11
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от dccharacter
|
отчего зажигается светодиод?
|
Смотрите АСМ-листинг...
Либо "поворот не туда", либо компилятор что-то выбросил...
|
|
|
|
31.05.2012, 22:28
|
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от st__1
|
Смотрите АСМ-листинг...
Либо "поворот не туда", либо компилятор что-то выбросил...
|
TIM_TimeBaseInit:
0x08000180: push {r7}
0x08000182: sub sp, #20
0x08000184: add r7, sp, #0
0x08000186: str r0, [r7, #4]
0x08000188: str r1, [r7, #0]
228 uint16_t tmpcr1 = 0;
0x0800018a: mov.w r3, #0
Мда. Это я на данной ступени эволюции не потяну...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:17.
|
|