22 #include "stm32f4xx_hal.h" 30 #define SCANINTTIME 20 33 static unsigned short key_stat;
35 static const unsigned char key_map[KEYLINEBITS] = {
42 static void MX_GPIO_Init(
void)
45 GPIO_InitTypeDef GPIO_InitStruct;
52 GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
53 #ifdef USE_GPIO_INTERRUPT 54 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
56 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
58 GPIO_InitStruct.Pull = GPIO_PULLUP;
59 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
60 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
63 GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_12;
64 #ifdef USE_GPIO_INTERRUPT 65 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
67 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
69 GPIO_InitStruct.Pull = GPIO_PULLUP;
70 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
71 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
74 #ifdef USE_GPIO_INTERRUPT 75 HAL_NVIC_EnableIRQ(EXTI2_IRQn);
76 HAL_NVIC_EnableIRQ(EXTI4_IRQn);
77 HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
78 HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
82 static void init_gpio(
void)
87 static unsigned short scan_gpio(
void)
95 rt = ~((HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2 )<<3) |
96 (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)<<2) |
97 (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4 )<<1) |
98 (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5 )<<0));
100 DKPRINTF(0x02,
"PORT=%04X\n", (
int)rt);
105 static void scan_key(
void *sp)
116 for(i=0; i<KEYLINEBITS; i++) {
119 if((key_stat & mask) == 0) {
122 event.arg = key_map[i];
123 DKPRINTF(0x01,
"EVT_KEYDOWN(%d)\n",
131 if(key_stat & mask) {
134 event.arg = key_map[i];
135 DKPRINTF(0x01,
"EVT_KEYUP(%d)\n",
151 #ifndef USE_GPIO_INTERRUPT 152 static void key_timer(
void *sp,
unsigned long long stime)
158 static void inthdr_exti2(
unsigned long intnum,
void *sp)
160 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR2);
161 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2));
166 static void inthdr_exti4(
unsigned long intnum,
void *sp)
168 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR4);
169 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4));
174 static void inthdr_exti9_5(
unsigned long intnum,
void *sp)
176 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR5);
177 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5));
182 static void inthdr_exti15_10(
unsigned long intnum,
void *sp)
184 __HAL_GPIO_EXTI_CLEAR_IT(EXTI_IMR_MR12);
185 DKPRINTF(0x02,
"INT %d(%d)\n", (
int)intnum, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
191 static int gpio_button_register(
struct st_device *dev,
char *param)
197 #ifdef USE_GPIO_INTERRUPT 198 register_interrupt(IRQ2VECT(EXTI2_IRQn), inthdr_exti2);
199 register_interrupt(IRQ2VECT(EXTI4_IRQn), inthdr_exti4);
200 register_interrupt(IRQ2VECT(EXTI9_5_IRQn), inthdr_exti9_5);
201 register_interrupt(IRQ2VECT(EXTI15_10_IRQn), inthdr_exti15_10);
209 const struct st_device gpio_button_device = {
210 .
name = DEF_DEV_NAME_INPUT,
211 .explan =
"STM32F4 GPIO Button",
212 .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]
デバイス名文字列