19 #include "stm32f7xx_hal.h" 27 #define SCANINTTIME 20 31 #define GPIO_KEY_USER1 (GPIOA) 32 #define RCC_AHBPeriph_GPIO_KEY_USER1 (RCC_AHB1ENR_GPIOAEN) 33 #define KEY_USER1 (GPIO_PIN_0) 35 static unsigned short key_stat;
37 static const unsigned char key_map[KEYLINEBITS] = {
41 static void KEY_Configuration(
void)
43 GPIO_InitTypeDef GPIO_InitStructure;
46 RCC->AHB1ENR |= (RCC_AHBPeriph_GPIO_KEY_USER1);
49 GPIO_InitStructure.Pin = KEY_USER1;
50 GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
51 GPIO_InitStructure.Pull = GPIO_NOPULL;
52 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
53 GPIO_InitStructure.Alternate = 0;
54 HAL_GPIO_Init(GPIO_KEY_USER1, &GPIO_InitStructure);
57 static void init_gpio(
void)
62 static unsigned short scan_gpio(
void)
70 rt = (HAL_GPIO_ReadPin(GPIO_KEY_USER1, KEY_USER1)<<0);
72 DKPRINTF(0x02,
"PORT=%04X\n", (
int)rt);
77 static void scan_key(
void *sp)
88 for(i=0; i<KEYLINEBITS; i++) {
91 if((key_stat & mask) == 0) {
94 event.arg = key_map[i];
95 DKPRINTF(0x01,
"EVT_KEYDOWN(%d)\n",
103 if(key_stat & mask) {
106 event.arg = key_map[i];
107 DKPRINTF(0x01,
"EVT_KEYUP(%d)\n",
123 #ifndef USE_GPIO_INTERRUPT 124 static void key_timer(
void *sp,
unsigned long long stime)
130 static void inthdr_exti2(
unsigned long intnum,
void *sp)
132 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR2);
133 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2));
138 static void inthdr_exti4(
unsigned long intnum,
void *sp)
140 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR4);
141 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4));
146 static void inthdr_exti9_5(
unsigned long intnum,
void *sp)
148 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR5);
149 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5));
154 static void inthdr_exti15_10(
unsigned long intnum,
void *sp)
156 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR12);
157 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
163 static int gpio_button_register(
struct st_device *dev,
char *param)
169 #ifdef USE_GPIO_INTERRUPT 170 register_interrupt(IRQ2VECT(EXTI2_IRQn), inthdr_exti2);
171 register_interrupt(IRQ2VECT(EXTI4_IRQn), inthdr_exti4);
172 register_interrupt(IRQ2VECT(EXTI9_5_IRQn), inthdr_exti9_5);
173 register_interrupt(IRQ2VECT(EXTI15_10_IRQn), inthdr_exti15_10);
181 const struct st_device gpio_button_device = {
182 .
name = DEF_DEV_NAME_INPUT,
183 .explan =
"STM32F769I-Disc GPIO Button",
184 .register_dev = gpio_button_register,
#define EVT_KEYDOWN
キーを押した
int register_timer_func(timer_func func, unsigned long interval)
周期処理を追加する
void set_event_interrupt(void *sp)
割り込みハンドラからシステムイベント待ちタスクを起床する
void push_event_interrupt(void *sp, struct st_sysevent *event)
割り込みハンドラからシステムイベントを登録する
char name[MAX_DEVNAMELRN]
デバイス名文字列