Программирование МК STM32

 

 

 

Просмотр 6 сообщений - с 136 по 141 (из 141 всего)
  • Автор
    Сообщения
  • #21728
    dionos
    Участник

    Доброго время суток. Помогите найти ошибку. Пытаюсь настроить ultrasonic us100 на stm32f103c8t6 на TIM4 CH1 на OnePulse Mode с последующем переключением на Input Capture Mode.

    RCC APB1 APB2 настроины на 48 Mhz

    Сброс настроек таймера и установка его на One pulse Mode:
    5 us пульс для запуска ultrasonic
    void TIM4_OnePulsModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 as Alt func
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
    GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)
    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    TIM4->CR1 |= /*TIM_CR1_URS | */ TIM_CR1_OPM | TIM_CR1_ARPE; // Enable Update request source, One-pulse mode, Auto-reload preload enable
    TIM4->CCER |= TIM_CCER_CC1E; // Channel 1, CC1 channel configured as output
    TIM4->EGR |= TIM_EGR_UG; // Enable Update generation

    TIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_2); //Enable Output compare 1 mode
    TIM4->CCMR1 |= (TIM_CCMR1_OC1PE); //Output compare 1 preload enable
    TIM4->CCR1 = 5000;
    TIM4->CR1 |= TIM_CR1_CEN;
    }

    Сбос настроек таймена и установка его на Input Capture Mode
    void Tim4_InputCaptureModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 Input floating
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_CNF6_0;
    //GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)

    TIM4->CR1 |= TIM_CR1_URS;

    TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; //CC1 channel is configured as input, IC1 is mapped on TI1
    TIM4->CCER |= TIM_CCER_CC1P; //1: inverted: capture is done on a falling edge of IC1
    TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;
    TIM4->CCER |= TIM_CCER_CC1E; //Enable capture from the counter into the capture register by setting the CC1E

    TIM4->CR1 |= TIM_CR1_CEN;
    }

    void main()
    {

    while(1)
    {
    TIM4_OnePulsModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    Tim4_InputCaptureModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    TIM4->SR &= ~TIM_SR_CC1IF;
    TIM4->SR &= ~TIM_SR_CC1OF;
    pulse = TIM4->CCR1;

    len = (uint32_t)((pulse * 331 / 2) / 1000);

    }
    }

    но pulse(TIM4->CCR1) переменная постоянно имеет значение 5000, которое было установлено в TIM4_OnePulsModeInit.

    #21807
    A-Soft
    Участник

    Уважаемый Админ, у меня 2 вопроса:
    1. Как удалить дубликат Вашей статьи, в котором я указан автором?

    STM Урок 206. LL. STM32F4. Светодиоды и кнопка


    2. Будут ли еще уроки по STM32 Assembler или больше не ждать?

    #21808
    Narod Stream
    Хранитель

    A-Soft, Здравствуйте!
    1. Удалил.
    2. Думаю, что будут, по крайней мере, у меня нереализованных проектов по данной теме много, в том числе и работа на аппаратном уровне с плавающей точкой, понятное дело, что уже в линейке M4.

    • Ответ изменён 2 недели, 1 день назад пользователем Narod Stream.
    #21812
    A-Soft
    Участник

    Здравствуйте, Narod Stream!
    Ну что ж, ждём продолжения.
    Хочу ВСЁ писать на ассемблере, а не только вставки в С/С++ код. Но пока много чего не понимаю.
    Недавно я стал работать с M4 – вообще “в ёлочку” будет.
    С Уважением, A-Soft.

    #21818
    OttoDietrich
    Участник

    Здравствуйте. У вас есть презентация вашей STM32H745I https://www.youtube.com/watch?v=pNPlW9wyo98

    Будут ли уроки связанные с ней ?

    #21887
    admira1
    Участник

    Здравствуйте, уже второй месяц пошел а я так и не продвинулся в написании программы, ethernet to uart. По порядку
    Приобрел для проекта отладочную плату nucleo h743zi2 на плате присутствует физика lan 8742.
    И начал писать программу, до этого с ethernet на stm32 не сталкивался.
    Проблема заключается в следующем. В H7 микроконтроллерах, нужно включить кэш данных и кэш инструкций, настроить MPU. Далее включил ethernet с протоколом общения физики и камня RMII, далее включаю lwip. Отключаю динамическую адресацию, вписываю настройки сетки. Ну и настраиваю все rcc и увиличиваю стэк и кучу и тд. Далее генерирую код, и настраиваю кейл, в кейле во вкладке опции для цели – цели снимаю галку на Iram1 оставляю галку Iram2(ЭТО КАК Я ПОНЯЛ НУЖНО ЧТОБЫ ETHERNET И DMA МОГЛИ ДРУЖИТЬ). Далее в main прописываю структуру gnetif и в бесконечном цикле делаю MX_process(), компилирую все это дело, пингую и ничего(заданый узел недоступен)(пробовал как в ваших видео тоже не работает). Далее проверяю есть ли подключение, (netif_is_up), вывел светодиодики(на плате user led) когда вытаскиваю кабель ehernet (все меняться светодиодик тухнет другой загорается), т.е. физику микроконтроллер видит. Не понимаю в чем может быть проблема, все делаю по инструкции написанной самим STM а оно не работает.

    2) закупил такой же комплект как у вас в уроках stm disko f407 и waveshare lan8720 все сделал по вашему уроку (помоему 89), и опять проверяем работу физики и мк, пробуем пингануть плату получаем (заданый узел недоступен).
    Кароче очень сильно устал перерыл весь интернет, помогите пожалуйста разобраться…

  • Автор
    Сообщения
  • #21728

    dionos
    Участник
    • Оффлайн

    Доброго время суток. Помогите найти ошибку. Пытаюсь настроить ultrasonic us100 на stm32f103c8t6 на TIM4 CH1 на OnePulse Mode с последующем переключением на Input Capture Mode.

    RCC APB1 APB2 настроины на 48 Mhz

    Сброс настроек таймера и установка его на One pulse Mode:
    5 us пульс для запуска ultrasonic
    void TIM4_OnePulsModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 as Alt func
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
    GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)
    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    TIM4->CR1 |= /*TIM_CR1_URS | */ TIM_CR1_OPM | TIM_CR1_ARPE; // Enable Update request source, One-pulse mode, Auto-reload preload enable
    TIM4->CCER |= TIM_CCER_CC1E; // Channel 1, CC1 channel configured as output
    TIM4->EGR |= TIM_EGR_UG; // Enable Update generation

    TIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_2); //Enable Output compare 1 mode
    TIM4->CCMR1 |= (TIM_CCMR1_OC1PE); //Output compare 1 preload enable
    TIM4->CCR1 = 5000;
    TIM4->CR1 |= TIM_CR1_CEN;
    }

    Сбос настроек таймена и установка его на Input Capture Mode
    void Tim4_InputCaptureModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 Input floating
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_CNF6_0;
    //GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)

    TIM4->CR1 |= TIM_CR1_URS;

    TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; //CC1 channel is configured as input, IC1 is mapped on TI1
    TIM4->CCER |= TIM_CCER_CC1P; //1: inverted: capture is done on a falling edge of IC1
    TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;
    TIM4->CCER |= TIM_CCER_CC1E; //Enable capture from the counter into the capture register by setting the CC1E

    TIM4->CR1 |= TIM_CR1_CEN;
    }

    void main()
    {

    while(1)
    {
    TIM4_OnePulsModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    Tim4_InputCaptureModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    TIM4->SR &= ~TIM_SR_CC1IF;
    TIM4->SR &= ~TIM_SR_CC1OF;
    pulse = TIM4->CCR1;

    len = (uint32_t)((pulse * 331 / 2) / 1000);

    }
    }

    но pulse(TIM4->CCR1) переменная постоянно имеет значение 5000, которое было установлено в TIM4_OnePulsModeInit.

    #21807

    A-Soft
    Участник
    • Оффлайн

    Уважаемый Админ, у меня 2 вопроса:
    1. Как удалить дубликат Вашей статьи, в котором я указан автором?

    STM Урок 206. LL. STM32F4. Светодиоды и кнопка


    2. Будут ли еще уроки по STM32 Assembler или больше не ждать?

    #21808

    Narod Stream
    Хранитель
    • Оффлайн

    A-Soft, Здравствуйте!
    1. Удалил.
    2. Думаю, что будут, по крайней мере, у меня нереализованных проектов по данной теме много, в том числе и работа на аппаратном уровне с плавающей точкой, понятное дело, что уже в линейке M4.

    • Ответ изменён 2 недели, 1 день назад пользователем Narod Stream.
    #21812

    A-Soft
    Участник
    • Оффлайн

    Здравствуйте, Narod Stream!
    Ну что ж, ждём продолжения.
    Хочу ВСЁ писать на ассемблере, а не только вставки в С/С++ код. Но пока много чего не понимаю.
    Недавно я стал работать с M4 – вообще “в ёлочку” будет.
    С Уважением, A-Soft.

    #21818

    OttoDietrich
    Участник
    • Оффлайн

    Здравствуйте. У вас есть презентация вашей STM32H745I https://www.youtube.com/watch?v=pNPlW9wyo98

    Будут ли уроки связанные с ней ?

    #21887

    admira1
    Участник
    • Оффлайн

    Здравствуйте, уже второй месяц пошел а я так и не продвинулся в написании программы, ethernet to uart. По порядку
    Приобрел для проекта отладочную плату nucleo h743zi2 на плате присутствует физика lan 8742.
    И начал писать программу, до этого с ethernet на stm32 не сталкивался.
    Проблема заключается в следующем. В H7 микроконтроллерах, нужно включить кэш данных и кэш инструкций, настроить MPU. Далее включил ethernet с протоколом общения физики и камня RMII, далее включаю lwip. Отключаю динамическую адресацию, вписываю настройки сетки. Ну и настраиваю все rcc и увиличиваю стэк и кучу и тд. Далее генерирую код, и настраиваю кейл, в кейле во вкладке опции для цели – цели снимаю галку на Iram1 оставляю галку Iram2(ЭТО КАК Я ПОНЯЛ НУЖНО ЧТОБЫ ETHERNET И DMA МОГЛИ ДРУЖИТЬ). Далее в main прописываю структуру gnetif и в бесконечном цикле делаю MX_process(), компилирую все это дело, пингую и ничего(заданый узел недоступен)(пробовал как в ваших видео тоже не работает). Далее проверяю есть ли подключение, (netif_is_up), вывел светодиодики(на плате user led) когда вытаскиваю кабель ehernet (все меняться светодиодик тухнет другой загорается), т.е. физику микроконтроллер видит. Не понимаю в чем может быть проблема, все делаю по инструкции написанной самим STM а оно не работает.

    2) закупил такой же комплект как у вас в уроках stm disko f407 и waveshare lan8720 все сделал по вашему уроку (помоему 89), и опять проверяем работу физики и мк, пробуем пингануть плату получаем (заданый узел недоступен).
    Кароче очень сильно устал перерыл весь интернет, помогите пожалуйста разобраться…

Просмотр 6 сообщений - с 136 по 141 (из 141 всего)
  • Для ответа в этой теме необходимо авторизоваться.