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

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 16:08:13

tonyk, шутник. Какие ФриРтос с критическими секциями ? Посмотрите на посты человека и оцените его уровень :)

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 16:31:38

tonyk, шутник. Какие ФриРтос с критическими секциями ? Посмотрите на посты человека и оцените его уровень :)

FreeRTOS только для примера. Важен принцип. Его я и описал выше. Для синхронизации доступа ТС всё равно придётся делать критические секции, иначе будет долго ломать голову с проскакиванием через нуль и винить всех, кроме себя, неграмотного. Понимаю, что Дейкстру тут мало кто читал.

Добавлено after 3 minutes 3 seconds:
FreeRTOS. я не пользуюсь этой системой.А что это такое. ?Регистры знаю немного.

Добавлено after 1 minute 47 seconds:
Я думал меню создать на switch.Или я не так всё понял.Ну я ж не русский.


Ты чё, внатуре, по-русски не_понимашь? Я ж тебе написал:
Мораль сей басни такова: любое изменение переменной должно делаться только в одном потоке, а если нужно делать его из нескольких потоков или прерываний, то операция изменения должна обрамляться критической секцией. Иначе словишь двойной инкремент или декремент.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 17:11:55

Буду изучать ,А насчёт swtch как можно подавить дребезг контактов оператором.?Приведите пример.

Добавлено after 5 minutes 18 seconds:
FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 17:24:09

ivan dimir писал(а):А насчёт swtch как можно подавить дребезг контактов оператором.?
Это шедевр :)))
Опертором switch не давят дребезг. Это оператор ветвления. Вы бы почитали, что ли, немного про него. Масса информации в интернете.

ivan dimir писал(а):FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
Не загружайтесь этим. Пока Вам рановато.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 17:58:39

ivan dimir, этот друг любит оператор switch, он имел ввиду заменить такого рода код
на что-то такое
циферки в case не очень хорошо смотрятся, можно запутаться, можно заменить на что-то вроде такого
Под критической секцией он имеет ввиду Atomic block restorate.

А дребезг, предложили очень хороший кусочек кода, в этой теме, второе сообщение.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 18:40:29

ivan dimir писал(а):А насчёт swtch как можно подавить дребезг контактов оператором.?

Аlex писал(а):Это шедевр

3.14здец... Вот почему я нифига не понял про дребезг. Я в аXYе, Аlex... После этого я себя таким имбицилом осчусчаю с этими критическими секциями и Дейкстрой...

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 19:14:11

ivan dimir, я ж писал уже, как избавиться от дребезга: достаточно не проверять состояние кнопки в течение 30..100мс после изменения состояния.
Я приводил ссылки на свой код: там все элементарно. SysTick отсчитывает условные миллисекунды, соответственно, конструкция вида
Код:
uint32_t T0 = 0;
...
if(T0 != Tms){ T0 = Tms; do_something();}

будет запускать функцию не чаще 1 раза в миллисекунду (Tms - глобальное "время").
Если сделать
Код:
if(T0 - Tms > X-1)

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

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 19:45:04

Eddy_Em писал(а):ivan dimir, я ж писал уже, как избавиться от дребезга...

Eddy_Em, пардон меня, не заметил твой пост. Я описал этот же самый алгоритм.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 19:47:25

Eddy_Em, я за ТС вопрос задам, а это
Код:
do_something();
где взять?

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 20:15:28

Код:
void do_something(){}
Не благодари.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 21:38:45

ivan dimir, я ж писал уже, как избавиться от дребезга: достаточно не проверять состояние кнопки в течение 30..100мс после изменения состояния.
Я приводил ссылки на свой код: там все элементарно. SysTick отсчитывает условные миллисекунды, соответственно, конструкция вида
Код:
uint32_t T0 = 0;
...
if(T0 != Tms){ T0 = Tms; do_something();}

будет запускать функцию не чаще 1 раза в миллисекунду (Tms - глобальное "время").
Если сделать
Код:
if(T0 - Tms > X-1)

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

У меня системный таймер занят.Есть 4 таймера.Можно их задействовать?.

А кстати инкремент на нажатие кнопки и декремент на нажатие кнопки.Действуют в серии stm32f103 совсем по другому если в stm32f407 программа работает единственное подвесало.То в этой серии инкремент работает правильно сам ставлю - - .Всё в разнос..Буду рыть дальше.

Добавлено after 1 minute 42 seconds:
А отдельно работают.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 21:53:32

У меня системный таймер занят

Чем? Если ты на нем сделал дебильную функцию delay, то предлагаю более вменяемую реализацию:
Код:
void delay(uint8_t ms){
  uint32_t T = Tms;
  while(Tms - T < (uint32_t)ms){}
}

А волатильную переменную Tms инкрементируй в прерывании SysTick каждую миллисекунду.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 07:47:17

У меня системный таймер занят

Чем? Если ты на нем сделал дебильную функцию delay, то предлагаю более вменяемую реализацию:
Код:
void delay(uint8_t ms){
  uint32_t T = Tms;
  while(Tms - T < (uint32_t)ms){}
}

А волатильную переменную Tms инкрементируй в прерывании SysTick каждую миллисекунду.

Это не мои функции.А вашу нужно проверить?

Добавлено after 9 hours 43 minutes 26 seconds:
Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 07:57:12

Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?


Наводки на пинах, нет стабильного состояния. Состояние пина хаотично меняется и возникают ложные срабатывания.
Добавьте резисторы-подтяжки к пинам на неактивный уровень (который должен быть, чтобы кнопка не считалась нажатой), либо включите подтяжки на уровне GPIO:
Здесь - слабая подтяжка пинов к нулевому уровню.
Код:
GPIOC->PUPDR = (0x02 << 6) | (0x02 << 8) | (0x02 << 18);

И всегда проверяйте, что переменная переходит через ноль.

*поправил смещения битов

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 09:30:45

Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?


Наводки на пинах, нет стабильного состояния. Состояние пина хаотично меняется и возникают ложные срабатывания.
Добавьте резисторы-подтяжки к пинам на неактивный уровень (который должен быть, чтобы кнопка не считалась нажатой), либо включите подтяжки на уровне GPIO:
Здесь - слабая подтяжка пинов к нулевому уровню.
Код:
GPIOC->PUPDR = (0x02 << 2) | (0x02 << 3) | (0x02 << 8);

И всегда проверяйте, что переменная переходит через ноль.

На плате stm32f103C8t висит SWO шина на которой я прошиваю я посмотрел по схеме а на stm32f407vt такого нет.

Добавлено after 14 minutes 58 seconds:
Код:

/*
* main.c
*
* Created on: 5 груд. 2021 р.
* Author: Admin
*/
#include "main.h"
#include <stdio.h>
#define SYSCLOCK 72000000U
__IO uint32_t tmpreg;
__IO uint32_t SysTick_CNT = 0;
unsigned char menu_lcd;
unsigned short int a;
struct
{
volatile unsigned char a1;
volatile unsigned char a2;
volatile unsigned char b1;
volatile unsigned char b2;
volatile unsigned char c1;
volatile unsigned char c2;
volatile unsigned char d1;
volatile unsigned char d2;
unsigned short int a;
volatile unsigned short int b;
volatile unsigned short int c;
volatile unsigned short int d;
unsigned short int result_a;
unsigned short int result_b;
unsigned short int result_c;
unsigned short int result_d;
}danie;
struct
{
unsigned char menu_btn;
unsigned char menu_lcd;
char buf[50];
char buf1[50];
char buf2[50];
char buf3[50];
char buf4[50];
char buf5[50];
char buf6[50];
char buf7[50];
char buf8[50];
volatile unsigned char flag;
volatile unsigned char flag2;
volatile unsigned short int pauza;
volatile unsigned short int pauza1;
}nastroyki;
void TIM1_UP_IRQHandler(void)
{
//pauza->t1=0;
if(TIM1->SR & TIM_SR_UIF)
{
TIM1->SR &= ~ TIM_SR_UIF;
nastroyki.pauza1++;
}

}
void TIM2_IRQHandler (void)
{
if(TIM2->SR & TIM_SR_UIF)
{
TIM2->SR &= ~ TIM_SR_UIF;
if(nastroyki.flag==1)
{
nastroyki.pauza++;
}



}
}

void SysTick_Handler(void)
{
if(SysTick_CNT > 0) SysTick_CNT--;
}
void init_systimer(void)
{
MODIFY_REG(SysTick->LOAD,SysTick_LOAD_RELOAD_Msk,SYSCLOCK / 1000 - 1);

CLEAR_BIT(SysTick->VAL, SysTick_VAL_CURRENT_Msk);
SET_BIT(SysTick->CTRL, SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

}

void delay(__IO uint32_t tck)
{
while(tck)
{
tck--;
}
}
//----------
void delay_ms(uint32_t ms)
{
MODIFY_REG(SysTick->VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
while(SysTick_CNT) {}
}
void NMI_Handler(void)
{
if((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail
{
RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag

}
}
void RCC_init(void);

int main(void)
{
nastroyki.pauza=0;
nastroyki.pauza1=0;
nastroyki.menu_btn=0;
nastroyki.menu_lcd=0;
RCC_init();
init_systimer();
//IWDT_init();
APB_init();
GPIO_init();
timer1_init();
timer2_init();
I2C1_Init();
LCD_ini();
LCD_Clear();
while(1)
{
if((GPIOB->IDR&GPIO_IDR_IDR5)==0)
{
nastroyki.flag=1;
}
if(nastroyki.flag==1&&GPIOB->IDR&GPIO_IDR_IDR5&&nastroyki.pauza>10)
{
nastroyki.flag=0;
nastroyki.pauza=0;
nastroyki.menu_btn++;nastroyki.menu_lcd++;
}
// LCD_SetPos(0,0);
// LCD_String("Bobr_stm32");
switch (nastroyki.menu_btn)
{
case 0:
break;
case 1:
if((GPIOB->IDR&GPIO_IDR_IDR4)==0)
{
if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if (danie.a==4095)
{
danie.a=0;
} // }
danie.a++;
}

}

if((GPIOB->IDR&GPIO_IDR_IDR8)==0)
{

if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if (danie.a==0)
{
danie.a=4095;
} // }
danie.a--;
}
}


break;
case 2:
if((GPIOB->IDR&GPIO_IDR_IDR4)==0)
{

if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if ( danie.b==4095)
{
danie.b=0;
}
danie.b++;
}
}
if((GPIOB->IDR&GPIO_IDR_IDR8)==0)
{

if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if (danie.b==0)
{
danie.b=4095;
} // }
danie.b--;
}

}
break;
case 3:
if((GPIOB->IDR&GPIO_IDR_IDR4)==0)
{
if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if (danie.c ==4095)
{
danie.c=0;
}
danie.c++;
}
}
if((GPIOB->IDR&GPIO_IDR_IDR8)==0)
{
if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if (danie.c==0)
{
danie.c=4095;
} // }
danie.c--;

}
}
break;
case 4:
if((GPIOB->IDR&GPIO_IDR_IDR4)==0)
{
if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if ( danie.d ==4095)
{
danie.d=0;
}
danie.d++;
}
}
if((GPIOB->IDR&GPIO_IDR_IDR8)==0)
{
if(nastroyki.pauza1>3)
{
nastroyki.pauza1=0;
if ( danie.d==0)
{
danie.d=1023;
} // }
danie.d--;
}

}
break;
case 5:
nastroyki.menu_btn=0;
break;
}



switch(nastroyki.menu_lcd)
{
case 0:
LCD_SetPos(0,0);
LCD_String("Bobr_stm32");
break;
case 1: sprintf(nastroyki.buf,"a=%2d ",danie.a);
LCD_SetPos(0,0);
LCD_String(nastroyki.buf);

break;
case 2:
sprintf( nastroyki.buf2,"b=%2d ",danie.b );
LCD_SetPos(0,0);
LCD_String(nastroyki.buf2);
break;
case 3:
sprintf(nastroyki.buf4,"c=%2d ",danie.c );
LCD_SetPos(0,0);
LCD_String(nastroyki.buf4);
break;
case 4:

sprintf(nastroyki.buf6,"d=%2d ",danie.d);
LCD_SetPos(0,0);
LCD_String(nastroyki.buf6);
break;
case 5:
nastroyki.menu_lcd=0;
break;
}
}
}

Вот всё и заработало в таком плане проблеиа решена.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 09:36:59

На плате stm32f103C8t висит SWO шина на которой я прошиваю я посмотрел по схеме а на stm32f407vt такого нет.


Открываете Datasheet на процессор, переходите в раздел 3 - Pinouts ans pin description, находите таблицу 7 - Table 7. STM32F40x pin and ball definitions, ищете по строке SWO. И данная функция находится на пине PB3.
Если не получается использовать вывод трассировки через данный пин, используйте любой USB-UART конвертор и терминал типа того же Putty, и выводите отладочные сообщения в UART. У данного кристалла их до 6 штук.

----------
Чтож. Не буду вас переубеждать, или снова рекомендовать писать код НЕ макарошками, или хотя бы обрабатывать кнопки в функции - это всё не моё дело. Хотя порекомендую хотя бы задуматься об этом, поскольку данный код масштабируется довольно сложно. Как минимум, если возникнет нужда добавить ещё несколько пунктов меню, или поменять их местами, то это может оказаться нетривиальной задачей.

Плюс, вагную предупреждение компилятора на этой строке:
if(nastroyki.flag==1 && GPIOB->IDR & GPIO_IDR_IDR5 && nastroyki.pauza>10)

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 11:21:03

На плате stm32f103C8t висит SWO шина на которой я прошиваю я посмотрел по схеме а на stm32f407vt такого нет.


Открываете Datasheet на процессор, переходите в раздел 3 - Pinouts ans pin description, находите таблицу 7 - Table 7. STM32F40x pin and ball definitions, ищете по строке SWO. И данная функция находится на пине PB3.
Если не получается использовать вывод трассировки через данный пин, используйте любой USB-UART конвертор и терминал типа того же Putty, и выводите отладочные сообщения в UART. У данного кристалла их до 6 штук.

----------
Чтож. Не буду вас переубеждать, или снова рекомендовать писать код НЕ макарошками, или хотя бы обрабатывать кнопки в функции - это всё не моё дело. Хотя порекомендую хотя бы задуматься об этом, поскольку данный код масштабируется довольно сложно. Как минимум, если возникнет нужда добавить ещё несколько пунктов меню, или поменять их местами, то это может оказаться нетривиальной задачей.

Плюс, вагную предупреждение компилятора на этой строке:
if(nastroyki.flag==1 && GPIOB->IDR & GPIO_IDR_IDR5 && nastroyki.pauza>10)

А чем писать код? И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.При отжатии кнопки если флаг установлен 1и посчитало 10 единиц переключается меню. Да при отжатии кнопки флаг как и пауза(тик) устанавливаются в ноль.Этот вариант не проходит когда записуешь в EEPROM.На AVR не проходит.А в чём вопрос.?

Добавлено after 26 minutes 19 seconds:
Покажите хоть пример.Кусочек кода моего .Так как нужно писать .Пожайлуста профи.

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 11:39:19

Это не мои функции.

Зачем тогда их использовать, если непонятно, что они делают?

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 11:45:52

Это не мои функции.

Зачем тогда их использовать, если непонятно, что они делают?

Библиотека дисплея не моя при ней идут функции задержек на системном таймере они использованы для LCD.А программа моя топорная правда.Переношу проект с avr на stm32

Re: stm32 cubeide два инкремента не совместимы.

Ср янв 19, 2022 12:07:28

Рекомендую индусокод выбросить и начать с нуля писать.
Но для этого понадобится сначала научиться общей культуре программирования. Пока что у тебя выходит адов спагетти-код, в котором ты и сам через год не разберешься!
Ответить