Poenostavljen prikaz problema:
Imam STM32 mikrokontroler in recimo 20 tipk vezanih vsaka na svoj GPIO.
Imam tudi 20 ledic vezanih vsako na svoj GPIO.
Rad bi naredil, da vsaka tipka prižiga svojo ledico in ob tem pritisku poženem še nekaj druge kode.
Imam:
Trenutno kar z HAL driverji, ker je zadeva ne rabi biti hitra, ampak nimam nič proti registrom. S HAL driverji je bolj pregledno za prikaz problema.
- Koda: Izberi vse
#define TIPKA1 GPIO_PIN_0
#define TIPKA1_PORT GPIOA
#define TIPKA2 GPIO_PIN_1
#define TIPKA2_PORT GPIOE
#define TIPKA3 GPIO_PIN_2
#define TIPKA3_PORT GPIOF
#define LED1 GPIO_PIN_8
#define LED1_PORT GPIOA
#define LED2 GPIO_PIN_9
#define LED2_PORT GPIOA
.
.
.
#define LED1_OFF HAL_GPIO_WritePin(LED1_PORT, LED1, 0);
#define LED1_ON HAL_GPIO_WritePin(LED1_PORT, LED1, 1);
#define LED2_OFF HAL_GPIO_WritePin(LED2_PORT, LED2, 0);
#define LED2_ON HAL_GPIO_WritePin(LED2_PORT, LED2, 1);
.
.
.
Kar hočem poudariti je, da je teh tipk in ledic veliko. Rad bi se izognil pisanju 20 takih if stavkov:
- Koda: Izberi vse
if(0 == HAL_GPIO_ReadPin(TIPKA1_PORT,TIPKA1))
{
LED1_ON
funkcija1();
}else
{
LED1_OFF
}
if(0 == HAL_GPIO_ReadPin(TIPKA2_PORT,TIPKA2))
{
LED2_ON
funkcija2();
}else
{
LED2_OFF
}
Nekako bi rad zmapiral te porte in fukcije, da bi to lahko nekako obdelal v FOR zankah.
Sem dokaj prepričan, da se da to narediti s strukturami "struct" in kazalci, vendar mi trenutno ne nese.
Ker če bi bilo teh tipk in ledic še več (recimo 50) bi bila zadeva zelo nepregleden špageti code. Rad bi nekako naredil zadevo fleksibilno, da je enostavno dodajati ali zmanjševati število uporabljenih stikal.
Za branje tipk DMA ne pride v poštev, ker so inputi in outputi pomešani po portih. Sploh pa ni nobene potrebe po hitrosti.
Ima kdo kakšno idejo?