Буфер данных Stm32f103c8

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Буфер данных Stm32f103c8

Сообщение dosikus »

arkhnchul, и как ты это представляешь касательно нубов?
Для того что бы править калокуб нужно знать железо, если знаешь железо -нахрена калокуб сдался?
Реклама
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

Ну народ, ну хорош А????
Ну кому что нравится, зачем навязывать свои взгляды. Все тут взрослые люди.
Да и разные это задачи, производительность программиста и разработка дружелюбной среды для работы.
Конечно нужно и то и другое. каждому свое. Кто в чем преуспел. Кому-то автомат, кому -то РКПП, Ну зачем это все тут....

Добавлено after 1 minute 54 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3435224#p3435224"]что вам мешает посмотреть, как устроена HAL_Delay()?[/uquote]
Уже смотрю....
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Буфер данных Stm32f103c8

Сообщение dosikus »

[uquote="khch",url="/forum/viewtopic.php?p=3435222#p3435222"]А как сделать задержку на CMSIS?[/uquote]

Код: Выделить всё

#include "stm32f10x.h"
 #define GreenLED_OFF GPIOC->BSRR = GPIO_BSRR_BR9
 #define GreenLED_ON GPIOC->BSRR = GPIO_BSRR_BS9
 #define BlueLED_OFF GPIOC->BSRR = GPIO_BSRR_BR8
 #define BlueLED_ON GPIOC->BSRR = GPIO_BSRR_BS8

  static volatile uint32_t TimingDelay;

void SysTick_Handler(void) {
   if (TimingDelay) {
      TimingDelay--;
        }
        }

void Delay_mS(uint32_t nTime) {
      TimingDelay = nTime;
        while (TimingDelay);
        }




 int main (void)
 {
 SysTick_Config(SystemCoreClock /1000);

 RCC-> APB2ENR |= RCC_APB2ENR_IOPCEN;
 GPIOC-> CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_CNF8 | GPIO_CRH_MODE9 |
GPIO_CRH_MODE8 );
 GPIOC-> CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE8_0 ;


 while (1)
  {
        GreenLED_OFF;
        BlueLED_ON;
        Delay_mS(500);
        GreenLED_ON;
        BlueLED_OFF;
        Delay_mS(500);
  }
  }
 
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Буфер данных Stm32f103c8

Сообщение Мурик »

khch писал(а):Я после 2 часового геммороя осилил мигание на CMSIS!!!
....
HAL_Delay(1000);
GPIOC->BSRR |=1<<29;
HAL_Delay(1000);
GPIOC->BSRR |=1<<13;
2 часа потратили на запись GPIOC->BSRR и при этом допустили ошибку о которой вам писали выше? :shock:
khch писал(а):А как сделать задержку на CMSIS?
Светодиод нужно подключить к PC13 (или запускать код на китайском плате где светодиод по умолчанию на этом выводе). :)

Код: Выделить всё

#include "stm32f10x.h"

extern uint32_t SystemCoreClock;
static uint32_t Delay_ms;

void DWT_Delay_ms(uint32_t ms) // Функция миллисекундной паузы.
{
    uint32_t Count = DWT->CYCCNT;
    ms = ms * Delay_ms;
    while((DWT->CYCCNT - Count) < ms);
}

int main(void)
{
    SystemCoreClockUpdate(); // Текущая тактовая частота.
    Delay_ms = SystemCoreClock / 1000;

    RCC-> APB2ENR |= RCC_APB2ENR_IOPCEN;

    GPIOC->CRH &= ~GPIO_CRH_CNF13;
    GPIOC->CRH |= GPIO_CRH_MODE13;

    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // Включение DWT.
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

    while(1)
    {
       GPIOC->ODR ^= GPIO_ODR_ODR13;
       DWT_Delay_ms(500);
    }
}
Вложения
Blink_WDT.7z
(81.45 КБ) 235 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

[uquote="Мурик",url="/forum/viewtopic.php?p=3435257#p3435257"]!!!!![/uquote]
Почему ошибка!! Где??
2 часа, да и я доволен. Потому, что я понял что я написал и понял еще несколько смежных моментов, но то так..
А в чем ошибка, все работает!

Добавлено after 3 minutes 19 seconds:
Я действительно упустил этот пост...
Но он мигает.Насчет аналога, я понимаю, аналог был ODR. Просто туда пишется через BSRR.
А поскольку туда вводятся данные, то не |=, а просто =?

Добавлено after 1 minute 56 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3435257#p3435257"][quote="khch"]
]Светодиод нужно подключить к PC13[/uquote]
Ну так это китайская плата и есть. диод на PC13. Режим -- open drain.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Буфер данных Stm32f103c8

Сообщение Мурик »

khch писал(а):Почему ошибка!! Где??
Я выше дал ссылку на сообщение досикуса. https://radiokot.ru/forum/viewtopic.php ... 1#p3435201
Там все написано.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Буфер данных Stm32f103c8

Сообщение dosikus »

[uquote="khch",url="/forum/viewtopic.php?p=3435265#p3435265"]Но он мигает.Насчет аналога, я понимаю, аналог был ODR. Просто туда пишется через BSRR.
А поскольку туда вводятся данные, то не |=, а просто =?[/uquote]

Запись GPIO->BSRR |= xxx это сокращение от GPIO->BSRR =GPIO->BSRR | xxx

То есть сперва происходит чтение из BSRR, затем побитовое OR BSRR с xxx и затем запись полученного результата в BSRR.
Лишние бесполезные телодвижения потому что BSRR только на запись - смотрите описание регистра в RM.



Изображение
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

GPIOC->CRH &= ~GPIO_CRH_CNF13;
Согласно заголовочного файла
#define GPIO_CRH_CNF13_Pos (22U)
#define GPIO_CRH_CNF13_Msk (0x3U << GPIO_CRH_CNF13_Pos) /*!< 0x00C00000 */
#define GPIO_CRH_CNF13 GPIO_CRH_CNF13_Msk /*!< CNF13[1:0] bits (Port x configuration

Мне калькулятор выдает 0x3<<22 = C 0000 0000
в комменте другое число....
А фактически сдвиг уходит в 36-ой бит..
Что я опять не так делаю?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Буфер данных Stm32f103c8

Сообщение Reflector »

[uquote="khch",url="/forum/viewtopic.php?p=3435423#p3435423"]Мне калькулятор выдает 0x3<<22 = C 0000 0000
Что я опять не так делаю?[/uquote]
Считаете 0x3 << 0x22.
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

а с десятичной тройкой получается как раз 22 бит... Но ведь там шестнадцатеричная тройка!!!
0X3!!!

Добавлено after 1 minute 9 seconds:
Да , блин... понял. спасибо.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Буфер данных Stm32f103c8

Сообщение Мурик »

В чем отличие десятичной и шестнадцатеричной тройки?
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

Я уже разобрался.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Буфер данных Stm32f103c8

Сообщение a5021 »

[uquote="Мурик",url="/forum/viewtopic.php?p=3435430#p3435430"]В чем отличие десятичной и шестнадцатеричной тройки?[/uquote]
Шестнадцатеричная тройка массивнее. Сравните 33 и 0x33 -- цифры одинаковые, а вес конструкции разный. :)
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Буфер данных Stm32f103c8

Сообщение Мурик »

Я спросил про цифру 3, а не про 33. :) Но это относится ко всем цифрам от 0 до 9. :)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Буфер данных Stm32f103c8

Сообщение a5021 »

[uquote="Мурик",url="/forum/viewtopic.php?p=3435449#p3435449"]Я спросил про цифру 3, а не про 33. :)[/uquote]
Про цифру 33 спросить невозможно, т.к. такой цифры не бывает. :)
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

теперь начался срач про числа и цифры...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Буфер данных Stm32f103c8

Сообщение Мурик »

a5021 писал(а):Про цифру 33 спросить невозможно
Я написал про цифру 3. :) А не про то, что 33 это цифра. :)
khch
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср июл 18, 2018 11:51:59

Re: Буфер данных Stm32f103c8

Сообщение khch »

Я никуда не ушел, не пропал, не сдался и не скис.
Я изучаю код, который вы мне любезно скинули.
Скоро нагрянут мои "опять не то"
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Буфер данных Stm32f103c8

Сообщение a5021 »

[uquote="dosikus",url="/forum/viewtopic.php?p=3435232#p3435232"]

Код: Выделить всё

 #define GreenLED_OFF GPIOC->BSRR = GPIO_BSRR_BR9
 #define GreenLED_ON GPIOC->BSRR = GPIO_BSRR_BS9
 #define BlueLED_OFF GPIOC->BSRR = GPIO_BSRR_BR8
 #define BlueLED_ON GPIOC->BSRR = GPIO_BSRR_BS8
[/uquote]
Не так давно занимался похожим ногодрыжеством и придумалось небольшое "улучшательство". Если посмотреть на эти макросы, то все они повторяют друг друга, за исключением последних двух символов, которые и кодируют действие. В общем виде тело макроса для любого действия над любым светодиодом можно записать, как

Код: Выделить всё

GPIOC->BSRR = GPIO_BSRR_Bxy
где x -- действие(вкл/выкл), а y -- конкретный светодиод. Тут сразу на ум приходит, что неплохо бы "нарисовать" макрос, который по виду имитировал функцию и выглядел примерно так:

Код: Выделить всё

LED(COLOR, STATE)
где COLOR -- это цвет светодиода, а STATE -- состояние (вкл/выкл). Кодируем цвета и действия:

Код: Выделить всё

#define GREEN                     9
#define BLUE                      8
#define ON                        S
#define OFF                       R
Дальше получается непонятка, т.к. если записать макрос в виде

Код: Выделить всё

LED(COLOR, STATE) GPIOC->BSRR = GPIO_BSRR_BSTATECOLOR
то препроцессор такого авангардизма не поймет и справедливо пошлет нафиг. На помощь можно призвать директиву "склейки" -- ##:

Код: Выделить всё

LED(COLOR, STATE) GPIOC->BSRR = GPIO_BSRR_B##STATE##COLOR
Такой вариант уже ближе к работоспособному состоянию, но при использовании макроса возникает неприятный эффект, когда запись вида:

Код: Выделить всё

LED(GREEN, ON);
разворачивается в совершенно негодное для данных целей представление:

Код: Выделить всё

GPIO_BSRR_BONGREEN
компилятор в данном случае негодует, хотя препроцессор сделал все так, как его просили. Чтобы исправить и это, обычно прибегают к небольшому трюку, который называется "экранирование". Суть его в том, чтобы операцию склейки выполнять отдельным макросом, завернутым в экран. Выглядеть это может как-то так:

Код: Выделить всё

#define GLUE2(A, B)               A##B
#define GLUE(A, B)                GLUE2(A, B)
GLUE2 -- сама склейка, GLUE -- экранирующая обертка.

В конечном счете макрос должен приобрести нижеследующий вид:

Код: Выделить всё

#define LED(COLOR, STATE) GPIOC->BSRR = GLUE(GPIO_BSRR_B, GLUE(STATE, COLOR))
Теперь, чтобы иметь все вместе перед глазами, старая и новая формы одновременно, плюс проверочный код:

Код: Выделить всё

#include "stm32f1xx.h"

#define GreenLED_OFF GPIOC->BSRR = GPIO_BSRR_BR9
#define GreenLED_ON GPIOC->BSRR = GPIO_BSRR_BS9
#define BlueLED_OFF GPIOC->BSRR = GPIO_BSRR_BR8
#define BlueLED_ON GPIOC->BSRR = GPIO_BSRR_BS8

#define ON                        S
#define OFF                       R
#define GREEN                     9
#define BLUE                      8

#define GLUE2(A, B)               A##B
#define GLUE(A, B)                GLUE2(A, B)

#define LED(COLOR, STATE) GPIOC->BSRR = GLUE(GPIO_BSRR_B, GLUE(STATE, COLOR))

int main(void) {
  while (1)   {
    GreenLED_ON;
    LED(GREEN, ON);
    for(int i = 0; i< 0x000FFFFF; i++);
    GreenLED_OFF;
    LED(GREEN, OFF);
    BlueLED_ON;
    LED(BLUE, ON);
    for(int i = 0; i< 0x000FFFFF; i++);
    BlueLED_OFF;
    LED(BLUE, OFF);
  }
}
Для наглядности макросы в оригинальном и доработанном виде вызываются друг за другом. После обработки препроцессором вышеприведенный код приобретает уже такой вид:

Код: Выделить всё

int main(void) {
  while (1)   {
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (9U));
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (9U));
    for(int i = 0; i< 0x000FFFFF; i++);
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (25U));
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (25U));
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (8U));
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (8U));
    for(int i = 0; i< 0x000FFFFF; i++);
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (24U));
    ((GPIO_TypeDef *)((0x40000000U + 0x00010000U) + 0x00001000U))->BSRR = (0x1U << (24U));
  }
}
Что полностью доказывает идентичность макросов в плане производимых ими действий.

Вышеприведенный код не годится для заливки в МК, т.к. нет никакой инициализации железа и единственное, что от него требовалось -- это посмотреть, что будет на выходе препроцессора.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Буфер данных Stm32f103c8

Сообщение dosikus »

a5021, не учи новичков этому, они и без тебя запутаются. :)))
Ответить

Вернуться в «ARM»