GadgetSeed  0.9.6
stm32f769i-disc_led.c
[詳解]
1 /** @file
2  @brief STM32F769I-Discovery LED ドライバ
3 
4  @date 2017.01.07
5  @authoer Takashi SHUDO
6 */
7 
8 #include "device.h"
9 
10 #include "stm32f7xx_hal.h"
11 #include "stm32f7xx_hal_gpio.h"
12 
13 /* Legacy GPIO Type Definition */
14 typedef struct {
15  __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
16  __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
17  __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
18  __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
19  __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
20  __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
21  __IO uint16_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */
22  __IO uint16_t BRR; /*!< GPIO port bit set/reset register, Address offset: 0x1A */
23  __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
24  __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
25 } GPIO_LegacyTypeDef;
26 
27 /* LED1 */
28 #define GPIO_LED1 (GPIOJ)
29 #define GPIO_LED (GPIOJ)
30 #define RCC_AHBPeriph_GPIO_LED1 (RCC_AHB1ENR_GPIOJEN)
31 #define RCC_AHBPeriph_GPIO_LED (RCC_AHB1ENR_GPIOJEN)
32 #define LED_D1 (GPIO_PIN_13)
33 #define LED1_IO_HI(x) (((GPIO_LegacyTypeDef *)GPIO_LED1)->BSRR = x)
34 #define LED1_IO_LO(x) (((GPIO_LegacyTypeDef *)GPIO_LED1)->BRR = x)
35 #define LED_D1_OFF() LED1_IO_LO(LED_D1) /* Active High */
36 #define LED_D1_ON() LED1_IO_HI(LED_D1) /* Active High */
37 #define LED_OFF(x) LED1_IO_LO(LED_D1) /* Active High */
38 #define LED_ON(x) LED1_IO_HI(LED_D1) /* Active High */
39 /* LED2 */
40 #define GPIO_LED2 (GPIOJ)
41 #define RCC_AHBPeriph_GPIO_LED2 (RCC_AHB1ENR_GPIOJEN)
42 #define LED_D2 (GPIO_PIN_5)
43 #define LED2_IO_HI(x) (((GPIO_LegacyTypeDef *)GPIO_LED2)->BSRR = x)
44 #define LED2_IO_LO(x) (((GPIO_LegacyTypeDef *)GPIO_LED2)->BRR = x)
45 #define LED_D2_OFF() LED2_IO_LO(LED_D2) /* Active High */
46 #define LED_D2_ON() LED2_IO_HI(LED_D2) /* Active High */
47 /* LED3 (ArduinoUNO Style SCK/LED Pin) */
48 #define GPIO_LED3 (GPIOA)
49 #define RCC_AHBPeriph_GPIO_LED3 (RCC_AHB1ENR_GPIOAEN)
50 #define LED_D3 (GPIO_PIN_12)
51 #define LED3_IO_HI(x) (((GPIO_LegacyTypeDef *)GPIO_LED3)->BSRR = x)
52 #define LED3_IO_LO(x) (((GPIO_LegacyTypeDef *)GPIO_LED3)->BRR = x)
53 #define LED_D3_OFF() LED3_IO_LO(LED_D3) /* Active High */
54 #define LED_D3_ON() LED3_IO_HI(LED_D3) /* Active High */
55 
56 static unsigned char led_stat;
57 
58 static void LED_Configuration(void)
59 {
60  GPIO_InitTypeDef GPIO_InitStructure;
61 
62  /* Enable GPIO_LED clock */
63  RCC->AHB1ENR |= (RCC_AHBPeriph_GPIO_LED | RCC_AHBPeriph_GPIO_LED3);
64 
65  /* Configure GPIO for LEDs as Output push-pull */
66  GPIO_InitStructure.Pin = LED_D1 | LED_D2;
67  GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
68  GPIO_InitStructure.Pull = GPIO_NOPULL;
69  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
70  GPIO_InitStructure.Alternate = 0;
71  HAL_GPIO_Init(GPIO_LED, &GPIO_InitStructure);
72 
73  GPIO_InitStructure.Pin = LED_D3;
74  HAL_GPIO_Init(GPIO_LED3, &GPIO_InitStructure);
75 
76  LED_D1_OFF();
77  LED_D2_OFF();
78  LED_D3_OFF();
79 }
80 
81 /**
82  @brief LEDドライバの登録
83 
84  @param[in] param 未使用
85 
86  @return !=0:エラー
87 */
88 static int led_register(struct st_device *dev, char *param)
89 {
90  LED_Configuration();
91 
92  led_stat = 0;
93 
94  return 0;
95 }
96 
97 /**
98  @brief LEDの状態を取得する
99 
100  @param[out] rd LEDデータポインタ
101 
102  @return !=0:データあり 0:データ無し
103 */
104 static int led_getc(struct st_device *dev, unsigned char *rd)
105 {
106  *rd = led_stat;
107 
108  return 1;
109 }
110 
111 /**
112  @brief LEDの状態を設定する
113 
114  @param[out] ch LEDデータポインタ
115 
116  @return 1:正常終了,!=0:エラー
117 */
118 static int led_putc(struct st_device *dev, unsigned char ch)
119 {
120  if(ch & 0x01) {
121  LED_D1_ON();
122  } else {
123  LED_D1_OFF();
124  }
125 
126  if(ch & 0x02) {
127  LED_D2_ON();
128  } else {
129  LED_D2_OFF();
130  }
131 
132  if(ch & 0x04) {
133  LED_D3_ON();
134  } else {
135  LED_D3_OFF();
136  }
137 
138  led_stat = (ch & 0x07);
139 
140  return 1;
141 }
142 
143 static int led_suspend(struct st_device *dev)
144 {
145  return 0;
146 }
147 
148 static int led_resume(struct st_device *dev)
149 {
150  return 0;
151 }
152 
153 const struct st_device led_device = {
154  .name = DEF_DEV_NAME_LED,
155  .explan = "STM32F769I-Discovery LED",
156  .register_dev = led_register,
157  .getc = led_getc,
158  .putc = led_putc,
159  .suspend = led_suspend,
160  .resume = led_resume,
161 }; //!< LEDドライバ
static int led_putc(struct st_device *dev, unsigned char ch)
LEDの状態を設定する
static int led_getc(struct st_device *dev, unsigned char *rd)
LEDの状態を取得する
static int led_register(struct st_device *dev, char *param)
LEDドライバの登録
デバイスドライバAPI
デバイスドライバ構造体
Definition: device.h:25
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26