stm32 cubeide два инкремента не совместимы.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: stm32 cubeide два инкремента не совместимы.
tonyk, шутник. Какие ФриРтос с критическими секциями ? Посмотрите на посты человека и оцените его уровень 
- Реклама
Re: stm32 cubeide два инкремента не совместимы.
[uquote="Аlex",url="/forum/viewtopic.php?p=4163571#p4163571"]tonyk, шутник. Какие ФриРтос с критическими секциями ? Посмотрите на посты человека и оцените его уровень
[/uquote]
FreeRTOS только для примера. Важен принцип. Его я и описал выше. Для синхронизации доступа ТС всё равно придётся делать критические секции, иначе будет долго ломать голову с проскакиванием через нуль и винить всех, кроме себя, неграмотного. Понимаю, что Дейкстру тут мало кто читал.
Добавлено after 3 minutes 3 seconds:
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4163558#p4163558"]FreeRTOS. я не пользуюсь этой системой.А что это такое. ?Регистры знаю немного.
Добавлено after 1 minute 47 seconds:
Я думал меню создать на switch.Или я не так всё понял.Ну я ж не русский.[/uquote]
Ты чё, внатуре, по-русски не_понимашь? Я ж тебе написал:
FreeRTOS только для примера. Важен принцип. Его я и описал выше. Для синхронизации доступа ТС всё равно придётся делать критические секции, иначе будет долго ломать голову с проскакиванием через нуль и винить всех, кроме себя, неграмотного. Понимаю, что Дейкстру тут мало кто читал.
Добавлено after 3 minutes 3 seconds:
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4163558#p4163558"]FreeRTOS. я не пользуюсь этой системой.А что это такое. ?Регистры знаю немного.
Добавлено after 1 minute 47 seconds:
Я думал меню создать на switch.Или я не так всё понял.Ну я ж не русский.[/uquote]
Ты чё, внатуре, по-русски не_понимашь? Я ж тебе написал:
Мораль сей басни такова: любое изменение переменной должно делаться только в одном потоке, а если нужно делать его из нескольких потоков или прерываний, то операция изменения должна обрамляться критической секцией. Иначе словишь двойной инкремент или декремент.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
Буду изучать ,А насчёт swtch как можно подавить дребезг контактов оператором.?Приведите пример.
Добавлено after 5 minutes 18 seconds:
FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
Добавлено after 5 minutes 18 seconds:
FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: stm32 cubeide два инкремента не совместимы.
Это шедеврivan dimir писал(а):А насчёт swtch как можно подавить дребезг контактов оператором.?
Опертором switch не давят дребезг. Это оператор ветвления. Вы бы почитали, что ли, немного про него. Масса информации в интернете.
Не загружайтесь этим. Пока Вам рановато.ivan dimir писал(а):FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
Re: stm32 cubeide два инкремента не совместимы.
ivan dimir, этот друг любит оператор switch, он имел ввиду заменить такого рода кодна что-то такоециферки в case не очень хорошо смотрятся, можно запутаться, можно заменить на что-то вроде такогоПод критической секцией он имеет ввиду Atomic block restorate.
А дребезг, предложили очень хороший кусочек кода, в этой теме, второе сообщение.
Спойлер
Код: Выделить всё
if(menu_en==1)
{
}
if(menu_en==2)
{
}
if(menu_en==3)
{
}Спойлер
Код: Выделить всё
switch (menu_en){
case 1 : m_1(); break;
case 2 : m_2(); break;
case 3 : m_3(); break;
default : break;
}
void m_1(void)
{
}
void m_2(void)
{
}
void m_3(void)
{
}Спойлер
Код: Выделить всё
typedef enum{
m_1,
m_2,
m_3,
} display;
display menu_en;
menu_en = m_1;
switch (menu_en){
case m_1 : m_1(); break;
case m_2 : m_2(); break;
case m_3 : m_3(); break;
default : break;
}
void m_1(void)
{
}
void m_2(void)
{
}
void m_3(void)
{
}А дребезг, предложили очень хороший кусочек кода, в этой теме, второе сообщение.
- Реклама
Re: stm32 cubeide два инкремента не совместимы.
ivan dimir писал(а):А насчёт swtch как можно подавить дребезг контактов оператором.?
3.14здец... Вот почему я нифига не понял про дребезг. Я в аXYе, Аlex... После этого я себя таким имбицилом осчусчаю с этими критическими секциями и Дейкстрой...Аlex писал(а):Это шедевр
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 cubeide два инкремента не совместимы.
ivan dimir, я ж писал уже, как избавиться от дребезга: достаточно не проверять состояние кнопки в течение 30..100мс после изменения состояния.
Я приводил ссылки на свой код: там все элементарно. SysTick отсчитывает условные миллисекунды, соответственно, конструкция вида
будет запускать функцию не чаще 1 раза в миллисекунду (Tms - глобальное "время").
Если сделать
конструкция будет выполняться один раз в X миллисекунд. Впихиваешь во все свои конечные автоматы, где нужны задержки, такую конструкцию, и твой код получается неблокирующим.
Я приводил ссылки на свой код: там все элементарно. SysTick отсчитывает условные миллисекунды, соответственно, конструкция вида
Код: Выделить всё
uint32_t T0 = 0;
...
if(T0 != Tms){ T0 = Tms; do_something();}Если сделать
Код: Выделить всё
if(T0 - Tms > X-1)Re: stm32 cubeide два инкремента не совместимы.
Eddy_Em, пардон меня, не заметил твой пост. Я описал этот же самый алгоритм.Eddy_Em писал(а):ivan dimir, я ж писал уже, как избавиться от дребезга...
Re: stm32 cubeide два инкремента не совместимы.
Eddy_Em, я за ТС вопрос задам, а это где взять?
Код: Выделить всё
do_something();- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: stm32 cubeide два инкремента не совместимы.
Код: Выделить всё
void do_something(){}-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163682#p4163682"]ivan dimir, я ж писал уже, как избавиться от дребезга: достаточно не проверять состояние кнопки в течение 30..100мс после изменения состояния.
Я приводил ссылки на свой код: там все элементарно. SysTick отсчитывает условные миллисекунды, соответственно, конструкция вида
будет запускать функцию не чаще 1 раза в миллисекунду (Tms - глобальное "время").
Если сделать
конструкция будет выполняться один раз в X миллисекунд. Впихиваешь во все свои конечные автоматы, где нужны задержки, такую конструкцию, и твой код получается неблокирующим.[/uquote]
У меня системный таймер занят.Есть 4 таймера.Можно их задействовать?.
А кстати инкремент на нажатие кнопки и декремент на нажатие кнопки.Действуют в серии stm32f103 совсем по другому если в stm32f407 программа работает единственное подвесало.То в этой серии инкремент работает правильно сам ставлю - - .Всё в разнос..Буду рыть дальше.
Добавлено after 1 minute 42 seconds:
А отдельно работают.
Я приводил ссылки на свой код: там все элементарно. SysTick отсчитывает условные миллисекунды, соответственно, конструкция вида
Код: Выделить всё
uint32_t T0 = 0;
...
if(T0 != Tms){ T0 = Tms; do_something();}Если сделать
Код: Выделить всё
if(T0 - Tms > X-1)У меня системный таймер занят.Есть 4 таймера.Можно их задействовать?.
А кстати инкремент на нажатие кнопки и декремент на нажатие кнопки.Действуют в серии stm32f103 совсем по другому если в stm32f407 программа работает единственное подвесало.То в этой серии инкремент работает правильно сам ставлю - - .Всё в разнос..Буду рыть дальше.
Добавлено after 1 minute 42 seconds:
А отдельно работают.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 cubeide два инкремента не совместимы.
Чем? Если ты на нем сделал дебильную функцию delay, то предлагаю более вменяемую реализацию:У меня системный таймер занят
Код: Выделить всё
void delay(uint8_t ms){
uint32_t T = Tms;
while(Tms - T < (uint32_t)ms){}
}-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163829#p4163829"]
А волатильную переменную Tms инкрементируй в прерывании SysTick каждую миллисекунду.[/uquote]
Это не мои функции.А вашу нужно проверить?
Добавлено after 9 hours 43 minutes 26 seconds:
Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?
Чем? Если ты на нем сделал дебильную функцию delay, то предлагаю более вменяемую реализацию:У меня системный таймер занят
Код: Выделить всё
void delay(uint8_t ms){
uint32_t T = Tms;
while(Tms - T < (uint32_t)ms){}
}Это не мои функции.А вашу нужно проверить?
Добавлено after 9 hours 43 minutes 26 seconds:
Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 cubeide два инкремента не совместимы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4163836#p4163836"]Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?[/uquote]
Наводки на пинах, нет стабильного состояния. Состояние пина хаотично меняется и возникают ложные срабатывания.
Добавьте резисторы-подтяжки к пинам на неактивный уровень (который должен быть, чтобы кнопка не считалась нажатой), либо включите подтяжки на уровне GPIO:
Здесь - слабая подтяжка пинов к нулевому уровню.
И всегда проверяйте, что переменная переходит через ноль.
*поправил смещения битов
Наводки на пинах, нет стабильного состояния. Состояние пина хаотично меняется и возникают ложные срабатывания.
Добавьте резисторы-подтяжки к пинам на неактивный уровень (который должен быть, чтобы кнопка не считалась нажатой), либо включите подтяжки на уровне GPIO:
Здесь - слабая подтяжка пинов к нулевому уровню.
Код: Выделить всё
GPIOC->PUPDR = (0x02 << 6) | (0x02 << 8) | (0x02 << 18);*поправил смещения битов
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[uquote="AlanDrakes",url="/forum/viewtopic.php?p=4163927#p4163927"][uquote="ivan dimir",url="/forum/viewtopic.php?p=4163836#p4163836"]Проблема в плате или в схеме потому что включаю PB4 и PB3 .Значения в минусах идут .А включил PB9 и PB4.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?[/uquote]
Наводки на пинах, нет стабильного состояния. Состояние пина хаотично меняется и возникают ложные срабатывания.
Добавьте резисторы-подтяжки к пинам на неактивный уровень (который должен быть, чтобы кнопка не считалась нажатой), либо включите подтяжки на уровне GPIO:
Здесь - слабая подтяжка пинов к нулевому уровню.
И всегда проверяйте, что переменная переходит через ноль.[/uquote]
На плате 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;
}
}
}
Вот всё и заработало в таком плане проблеиа решена.
Наводки на пинах, нет стабильного состояния. Состояние пина хаотично меняется и возникают ложные срабатывания.
Добавьте резисторы-подтяжки к пинам на неактивный уровень (который должен быть, чтобы кнопка не считалась нажатой), либо включите подтяжки на уровне 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;
}
}
}
Вот всё и заработало в таком плане проблеиа решена.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 cubeide два инкремента не совместимы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4163957#p4163957"]На плате stm32f103C8t висит SWO шина на которой я прошиваю я посмотрел по схеме а на stm32f407vt такого нет.[/uquote]
Открываете 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)
Открываете 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)
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[uquote="AlanDrakes",url="/forum/viewtopic.php?p=4163964#p4163964"][uquote="ivan dimir",url="/forum/viewtopic.php?p=4163957#p4163957"]На плате stm32f103C8t висит SWO шина на которой я прошиваю я посмотрел по схеме а на stm32f407vt такого нет.[/uquote]
Открываете 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)[/uquote]
А чем писать код? И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.При отжатии кнопки если флаг установлен 1и посчитало 10 единиц переключается меню. Да при отжатии кнопки флаг как и пауза(тик) устанавливаются в ноль.Этот вариант не проходит когда записуешь в EEPROM.На AVR не проходит.А в чём вопрос.?
Добавлено after 26 minutes 19 seconds:
Покажите хоть пример.Кусочек кода моего .Так как нужно писать .Пожайлуста профи.
Открываете 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)[/uquote]
А чем писать код? И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.При отжатии кнопки если флаг установлен 1и посчитало 10 единиц переключается меню. Да при отжатии кнопки флаг как и пауза(тик) устанавливаются в ноль.Этот вариант не проходит когда записуешь в EEPROM.На AVR не проходит.А в чём вопрос.?
Добавлено after 26 minutes 19 seconds:
Покажите хоть пример.Кусочек кода моего .Так как нужно писать .Пожайлуста профи.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 cubeide два инкремента не совместимы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4163836#p4163836"]Это не мои функции.[/uquote]
Зачем тогда их использовать, если непонятно, что они делают?
Зачем тогда их использовать, если непонятно, что они делают?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4164000#p4164000"][uquote="ivan dimir",url="/forum/viewtopic.php?p=4163836#p4163836"]Это не мои функции.[/uquote]
Зачем тогда их использовать, если непонятно, что они делают?[/uquote]
Библиотека дисплея не моя при ней идут функции задержек на системном таймере они использованы для LCD.А программа моя топорная правда.Переношу проект с avr на stm32
Зачем тогда их использовать, если непонятно, что они делают?[/uquote]
Библиотека дисплея не моя при ней идут функции задержек на системном таймере они использованы для LCD.А программа моя топорная правда.Переношу проект с avr на stm32
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 cubeide два инкремента не совместимы.
Рекомендую индусокод выбросить и начать с нуля писать.
Но для этого понадобится сначала научиться общей культуре программирования. Пока что у тебя выходит адов спагетти-код, в котором ты и сам через год не разберешься!
Но для этого понадобится сначала научиться общей культуре программирования. Пока что у тебя выходит адов спагетти-код, в котором ты и сам через год не разберешься!


