stm32 cubeide два инкремента не совместимы.
tonyk, шутник. Какие ФриРтос с критическими секциями ? Посмотрите на посты человека и оцените его уровень 
- Реклама
- Сообщения: 1339
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
[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]
Ты чё, внатуре, по-русски не_понимашь? Я ж тебе написал:
Мораль сей басни такова: любое изменение переменной должно делаться только в одном потоке, а если нужно делать его из нескольких потоков или прерываний, то операция изменения должна обрамляться критической секцией. Иначе словишь двойной инкремент или декремент.
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Буду изучать ,А насчёт swtch как можно подавить дребезг контактов оператором.?Приведите пример.
Добавлено after 5 minutes 18 seconds:
FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
Добавлено after 5 minutes 18 seconds:
FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
Это шедеврivan dimir писал(а):А насчёт swtch как можно подавить дребезг контактов оператором.?
Опертором switch не давят дребезг. Это оператор ветвления. Вы бы почитали, что ли, немного про него. Масса информации в интернете.
Не загружайтесь этим. Пока Вам рановато.ivan dimir писал(а):FreeRTOS как можно подключить к CubeIDE ? И как с ней работать что там за команды.Или операторы.как и с чем её кушать.?
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
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)
{
}А дребезг, предложили очень хороший кусочек кода, в этой теме, второе сообщение.
- Реклама
- Сообщения: 1339
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
ivan dimir писал(а):А насчёт swtch как можно подавить дребезг контактов оператором.?
3.14здец... Вот почему я нифига не понял про дребезг. Я в аXYе, Аlex... После этого я себя таким имбицилом осчусчаю с этими критическими секциями и Дейкстрой...Аlex писал(а):Это шедевр
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
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)Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 1339
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Eddy_Em, пардон меня, не заметил твой пост. Я описал этот же самый алгоритм.Eddy_Em писал(а):ivan dimir, я ж писал уже, как избавиться от дребезга...
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Eddy_Em, я за ТС вопрос задам, а это где взять?
Код: Выделить всё
do_something();- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
[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:
А отдельно работают.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
Чем? Если ты на нем сделал дебильную функцию delay, то предлагаю более вменяемую реализацию:У меня системный таймер занят
Код: Выделить всё
void delay(uint8_t ms){
uint32_t T = Tms;
while(Tms - T < (uint32_t)ms){}
}Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
[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.Всё в норме кто может объяснить .Почему некоторые пины не можно так использовать контролер идёт в разнос.?
[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);*поправил смещения битов
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
[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;
}
}
}
Вот всё и заработало в таком плане проблеиа решена.
[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)
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
[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:
Покажите хоть пример.Кусочек кода моего .Так как нужно писать .Пожайлуста профи.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4163836#p4163836"]Это не мои функции.[/uquote]
Зачем тогда их использовать, если непонятно, что они делают?
Зачем тогда их использовать, если непонятно, что они делают?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
[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
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
Рекомендую индусокод выбросить и начать с нуля писать.
Но для этого понадобится сначала научиться общей культуре программирования. Пока что у тебя выходит адов спагетти-код, в котором ты и сам через год не разберешься!
Но для этого понадобится сначала научиться общей культуре программирования. Пока что у тебя выходит адов спагетти-код, в котором ты и сам через год не разберешься!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ


