Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пт авг 10, 2018 14:42:14

arkhnchul, и как ты это представляешь касательно нубов?
Для того что бы править калокуб нужно знать железо, если знаешь железо -нахрена калокуб сдался?

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

Пт авг 10, 2018 14:44:27

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

Добавлено after 1 minute 54 seconds:
что вам мешает посмотреть, как устроена HAL_Delay()?

Уже смотрю....

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

Пт авг 10, 2018 14:45:03

А как сделать задержку на CMSIS?



Код:
#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);
  }
  }
 

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

Пт авг 10, 2018 15:31:05

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 KiB) Скачиваний: 215

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

Пт авг 10, 2018 15:42:32

!!!!!

Почему ошибка!! Где??
2 часа, да и я доволен. Потому, что я понял что я написал и понял еще несколько смежных моментов, но то так..
А в чем ошибка, все работает!

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

Добавлено after 1 minute 56 seconds:
[quote="khch"]
]Светодиод нужно подключить к PC13

Ну так это китайская плата и есть. диод на PC13. Режим -- open drain.

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

Пт авг 10, 2018 15:43:39

khch писал(а):Почему ошибка!! Где??
Я выше дал ссылку на сообщение досикуса. https://radiokot.ru/forum/viewtopic.php ... 1#p3435201
Там все написано.

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

Пт авг 10, 2018 16:06:15

Но он мигает.Насчет аналога, я понимаю, аналог был ODR. Просто туда пишется через BSRR.
А поскольку туда вводятся данные, то не |=, а просто =?


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

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



Изображение

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

Пт авг 10, 2018 20:39:42

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-ой бит..
Что я опять не так делаю?

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

Пт авг 10, 2018 20:44:23

Мне калькулятор выдает 0x3<<22 = C 0000 0000
Что я опять не так делаю?

Считаете 0x3 << 0x22.

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

Пт авг 10, 2018 20:47:15

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

Добавлено after 1 minute 9 seconds:
Да , блин... понял. спасибо.

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

Пт авг 10, 2018 20:59:03

В чем отличие десятичной и шестнадцатеричной тройки?

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

Пт авг 10, 2018 21:02:26

Я уже разобрался.

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

Пт авг 10, 2018 21:16:19

В чем отличие десятичной и шестнадцатеричной тройки?

Шестнадцатеричная тройка массивнее. Сравните 33 и 0x33 -- цифры одинаковые, а вес конструкции разный. :)

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

Пт авг 10, 2018 21:35:50

Я спросил про цифру 3, а не про 33. :) Но это относится ко всем цифрам от 0 до 9. :)

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

Пт авг 10, 2018 21:38:25

Я спросил про цифру 3, а не про 33. :)

Про цифру 33 спросить невозможно, т.к. такой цифры не бывает. :)

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

Пт авг 10, 2018 21:49:37

теперь начался срач про числа и цифры...

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

Пт авг 10, 2018 21:57:05

a5021 писал(а):Про цифру 33 спросить невозможно
Я написал про цифру 3. :) А не про то, что 33 это цифра. :)

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

Сб авг 11, 2018 11:12:06

Я никуда не ушел, не пропал, не сдался и не скис.
Я изучаю код, который вы мне любезно скинули.
Скоро нагрянут мои "опять не то"

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

Сб авг 11, 2018 11:51:43

Код:
 #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

Не так давно занимался похожим ногодрыжеством и придумалось небольшое "улучшательство". Если посмотреть на эти макросы, то все они повторяют друг друга, за исключением последних двух символов, которые и кодируют действие. В общем виде тело макроса для любого действия над любым светодиодом можно записать, как

Код:
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));
  }
}

Что полностью доказывает идентичность макросов в плане производимых ими действий.

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

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

Сб авг 11, 2018 12:15:25

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