Буфер данных Stm32f103c8
Re: Буфер данных Stm32f103c8
arkhnchul, и как ты это представляешь касательно нубов?
Для того что бы править калокуб нужно знать железо, если знаешь железо -нахрена калокуб сдался?
Для того что бы править калокуб нужно знать железо, если знаешь железо -нахрена калокуб сдался?
- Реклама
Re: Буфер данных Stm32f103c8
Ну народ, ну хорош А????
Ну кому что нравится, зачем навязывать свои взгляды. Все тут взрослые люди.
Да и разные это задачи, производительность программиста и разработка дружелюбной среды для работы.
Конечно нужно и то и другое. каждому свое. Кто в чем преуспел. Кому-то автомат, кому -то РКПП, Ну зачем это все тут....
Добавлено after 1 minute 54 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3435224#p3435224"]что вам мешает посмотреть, как устроена HAL_Delay()?[/uquote]
Уже смотрю....
Ну кому что нравится, зачем навязывать свои взгляды. Все тут взрослые люди.
Да и разные это задачи, производительность программиста и разработка дружелюбной среды для работы.
Конечно нужно и то и другое. каждому свое. Кто в чем преуспел. Кому-то автомат, кому -то РКПП, Ну зачем это все тут....
Добавлено after 1 minute 54 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3435224#p3435224"]что вам мешает посмотреть, как устроена HAL_Delay()?[/uquote]
Уже смотрю....
Re: Буфер данных Stm32f103c8
[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);
}
}
Re: Буфер данных Stm32f103c8
2 часа потратили на запись GPIOC->BSRR и при этом допустили ошибку о которой вам писали выше?khch писал(а):Я после 2 часового геммороя осилил мигание на CMSIS!!!
....
HAL_Delay(1000);
GPIOC->BSRR |=1<<29;
HAL_Delay(1000);
GPIOC->BSRR |=1<<13;
Светодиод нужно подключить к PC13 (или запускать код на китайском плате где светодиод по умолчанию на этом выводе).khch писал(а):А как сделать задержку на CMSIS?
Код: Выделить всё
#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 скачиваний
Re: Буфер данных Stm32f103c8
[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.
Почему ошибка!! Где??
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.
- Реклама
Re: Буфер данных Stm32f103c8
Я выше дал ссылку на сообщение досикуса. https://radiokot.ru/forum/viewtopic.php ... 1#p3435201khch писал(а):Почему ошибка!! Где??
Там все написано.
Re: Буфер данных Stm32f103c8
[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.

А поскольку туда вводятся данные, то не |=, а просто =?[/uquote]
Запись GPIO->BSRR |= xxx это сокращение от GPIO->BSRR =GPIO->BSRR | xxx
То есть сперва происходит чтение из BSRR, затем побитовое OR BSRR с xxx и затем запись полученного результата в BSRR.
Лишние бесполезные телодвижения потому что BSRR только на запись - смотрите описание регистра в RM.

Re: Буфер данных Stm32f103c8
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-ой бит..
Что я опять не так делаю?
Согласно заголовочного файла
#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
[uquote="khch",url="/forum/viewtopic.php?p=3435423#p3435423"]Мне калькулятор выдает 0x3<<22 = C 0000 0000
Что я опять не так делаю?[/uquote]
Считаете 0x3 << 0x22.
Что я опять не так делаю?[/uquote]
Считаете 0x3 << 0x22.
Re: Буфер данных Stm32f103c8
а с десятичной тройкой получается как раз 22 бит... Но ведь там шестнадцатеричная тройка!!!
0X3!!!
Добавлено after 1 minute 9 seconds:
Да , блин... понял. спасибо.
0X3!!!
Добавлено after 1 minute 9 seconds:
Да , блин... понял. спасибо.
Re: Буфер данных Stm32f103c8
В чем отличие десятичной и шестнадцатеричной тройки?
Re: Буфер данных Stm32f103c8
Я уже разобрался.
Re: Буфер данных Stm32f103c8
[uquote="Мурик",url="/forum/viewtopic.php?p=3435430#p3435430"]В чем отличие десятичной и шестнадцатеричной тройки?[/uquote]
Шестнадцатеричная тройка массивнее. Сравните 33 и 0x33 -- цифры одинаковые, а вес конструкции разный.
Шестнадцатеричная тройка массивнее. Сравните 33 и 0x33 -- цифры одинаковые, а вес конструкции разный.
Re: Буфер данных Stm32f103c8
Я спросил про цифру 3, а не про 33.
Но это относится ко всем цифрам от 0 до 9. 
Re: Буфер данных Stm32f103c8
[uquote="Мурик",url="/forum/viewtopic.php?p=3435449#p3435449"]Я спросил про цифру 3, а не про 33.
[/uquote]
Про цифру 33 спросить невозможно, т.к. такой цифры не бывает.
Про цифру 33 спросить невозможно, т.к. такой цифры не бывает.
Re: Буфер данных Stm32f103c8
теперь начался срач про числа и цифры...
Re: Буфер данных Stm32f103c8
Я написал про цифру 3.a5021 писал(а):Про цифру 33 спросить невозможно
Re: Буфер данных Stm32f103c8
Я никуда не ушел, не пропал, не сдался и не скис.
Я изучаю код, который вы мне любезно скинули.
Скоро нагрянут мои "опять не то"
Я изучаю код, который вы мне любезно скинули.
Скоро нагрянут мои "опять не то"
Re: Буфер данных Stm32f103c8
[uquote="dosikus",url="/forum/viewtopic.php?p=3435232#p3435232"][/uquote]
Не так давно занимался похожим ногодрыжеством и придумалось небольшое "улучшательство". Если посмотреть на эти макросы, то все они повторяют друг друга, за исключением последних двух символов, которые и кодируют действие. В общем виде тело макроса для любого действия над любым светодиодом можно записать, как
где x -- действие(вкл/выкл), а y -- конкретный светодиод. Тут сразу на ум приходит, что неплохо бы "нарисовать" макрос, который по виду имитировал функцию и выглядел примерно так:
где COLOR -- это цвет светодиода, а STATE -- состояние (вкл/выкл). Кодируем цвета и действия:
Дальше получается непонятка, т.к. если записать макрос в виде
то препроцессор такого авангардизма не поймет и справедливо пошлет нафиг. На помощь можно призвать директиву "склейки" -- ##:
Такой вариант уже ближе к работоспособному состоянию, но при использовании макроса возникает неприятный эффект, когда запись вида:
разворачивается в совершенно негодное для данных целей представление:
компилятор в данном случае негодует, хотя препроцессор сделал все так, как его просили. Чтобы исправить и это, обычно прибегают к небольшому трюку, который называется "экранирование". Суть его в том, чтобы операцию склейки выполнять отдельным макросом, завернутым в экран. Выглядеть это может как-то так:
GLUE2 -- сама склейка, GLUE -- экранирующая обертка.
В конечном счете макрос должен приобрести нижеследующий вид:
Теперь, чтобы иметь все вместе перед глазами, старая и новая формы одновременно, плюс проверочный код:
Для наглядности макросы в оригинальном и доработанном виде вызываются друг за другом. После обработки препроцессором вышеприведенный код приобретает уже такой вид:
Что полностью доказывает идентичность макросов в плане производимых ими действий.
Вышеприведенный код не годится для заливки в МК, т.к. нет никакой инициализации железа и единственное, что от него требовалось -- это посмотреть, что будет на выходе препроцессора.
Код: Выделить всё
#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Код: Выделить всё
LED(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)В конечном счете макрос должен приобрести нижеследующий вид:
Код: Выделить всё
#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
a5021, не учи новичков этому, они и без тебя запутаются. 


