Проблема в плате или в схеме потому что включаю 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;
}
}
}
Вот всё и заработало в таком плане проблеиа решена.