Показать сообщение отдельно
Непрочитано 31.05.2012, 00:27  
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию 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 (0x00010000RCC_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_SYSCLKConfigRCC_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_GPIOCENABLE);

    
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] = {
            
134222848402654208268438528,
            
33554636867115008201330688    };

    
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_GPIOCENABLE);

    
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_DMA1ENABLE);

    
DMA_DeInit(DMA1_Channel2);
    
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32GPIOC_BSRR_Address;
    
DMA_InitStructure.DMA_MemoryBaseAddr = (u32GPIO_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_Channel2ENABLE);

    
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2ENABLE);

    
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(TIM2TIM_DMA_UpdateENABLE);

    
TIM_Cmd(TIM2ENABLE);

После этого юзерские светодиоды не горят (с чего бы?) и на осцилле картинка 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_TIM4ENABLE);

    
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 каналов сигнал опять разъезжается, каждый раз одинаково для одного и того же уровня оптимизации, но по-разному для разных.
Миниатюры:
Нажмите на изображение для увеличения
Название: IMAG008.jpg
Просмотров: 103
Размер:	53.5 Кб
ID:	35401   Нажмите на изображение для увеличения
Название: IMAG007.jpg
Просмотров: 77
Размер:	54.4 Кб
ID:	35402  

Последний раз редактировалось dccharacter; 31.05.2012 в 00:40.
dccharacter вне форума