GadgetSeed  0.9.6
stm32l1xx_nucleo_led.c
[詳解]
1 /** @file
2  @brief STM32L152RE-Nucleo LEDドライバ
3 
4  @date 2018.08.13
5  @author Takashi SHUDO
6 */
7 
8 #include "device.h"
9 
10 #define RCC_AHB1ENR (*(volatile unsigned long *)0x40023830)
11 #define RCC_AHB1LPENR (*(volatile unsigned long *)0x40023850)
12 #define RCC_AHB1_BIT_GPIOD (1<<3)
13 
14 /*
15  GPIOレジスタ
16 */
17 typedef struct st_reg_gpio {
18  unsigned long MODER;
19  unsigned long OTYPE;
20  unsigned long OSPEEDR;
21  unsigned long PUPDR;
22  unsigned long IDR;
23  unsigned long ODR;
24  unsigned long BSRR;
25  unsigned long LCKR;
26  unsigned long AFRL;
27  unsigned long AFRH;
28 } st_reg_gpio;
29 
30 #define GPIOA_BASE (0x40020000 + 0x000)
31 
32 #define GPIOA ((st_reg_gpio *)GPIOA_BASE)
33 
34 #define GPIO_MODE_BIT_IN 0x00 // Input Mode
35 #define GPIO_MODE_BIT_OUT 0x01 // Output Mode
36 #define GPIO_MODE_BIT_AF 0x02 // Alternate functions Mode
37 #define GPIO_MODE_BIT_AN 0x03 // Analog Mode
38 #define GPIO_MODE_BIT_ALL 0x03
39 
40 #define GPIO_OTYPE_BIT_PP 0x00 // push-pull
41 #define GPIO_OTYPE_BIT_OD 0x01 // open-drain
42 
43 #define GPIO_OSPEED_BIT_ALL 0x03
44 #define GPIO_OSPEED_BIT_50MHz 0x02
45 #define GPIO_OSPEED_BIT_100MHz 0x03
46 
47 #define GPIO_PUPDR_BIT_NOPULL 0x00 // No pull-up, pull-down
48 #define GPIO_PUPDR_BIT_PUP 0x01 // pull-up
49 #define GPIO_PUPDR_BIT_PDOWN 0x02 // pull-down
50 #define GPIO_PUPDR_BIT_ALL 0x03
51 
52 #define GPIO_AFR_BIT_I2C123 0x04
53 #define GPIO_AFR_BIT_USART123 0x07
54 #define GPIO_AFR_BIT_ALL 0x0F
55 
56 static void init_pin(st_reg_gpio *gpio, int pin)
57 {
58  volatile st_reg_gpio *gpiox = gpio;
59 
60  gpiox->MODER &= ~(((unsigned long)GPIO_MODE_BIT_ALL) << (2*pin));
61  gpiox->MODER |= (((unsigned long)GPIO_MODE_BIT_OUT) << (2*pin));
62  gpiox->OSPEEDR &= ~(((unsigned long)GPIO_OSPEED_BIT_ALL) << (2*pin));
63  gpiox->OSPEEDR |= (((unsigned long)GPIO_OSPEED_BIT_50MHz) << (2*pin));
64  gpiox->OTYPE &= ~(((unsigned long)1) << pin);
65  gpiox->OTYPE |= (((unsigned long)GPIO_OTYPE_BIT_PP) << pin);
66  gpiox->PUPDR &= ~(((unsigned long)GPIO_PUPDR_BIT_ALL) << (2*pin));
67  gpiox->PUPDR |= (((unsigned long)GPIO_PUPDR_BIT_NOPULL) << (2*pin));
68 // gpiox->PUPDR |= (((unsigned long)GPIO_PUPDR_BIT_PUP) << (2*pin));
69 
70  if(pin < 8) {
71  gpiox->AFRL &= ~(((unsigned long)GPIO_AFR_BIT_ALL) << (4*pin));
72  gpiox->AFRL |= (((unsigned long)GPIO_AFR_BIT_I2C123) << (4*pin));
73  } else {
74  gpiox->AFRH &= ~(((unsigned long)GPIO_AFR_BIT_ALL) << (4*(pin-8)));
75  gpiox->AFRH |= (((unsigned long)GPIO_AFR_BIT_I2C123) << (4*(pin-8)));
76  }
77 }
78 
79 #define POS_LD2 5 // Green
80 #define BIT_LD2 (1 << POS_LD2)
81 
82 static unsigned long flg_led_on;
83 
84 static int led_register(struct st_device *dev, char *param)
85 {
86  flg_led_on = 0;
87 
88  RCC_AHB1ENR |= RCC_AHB1_BIT_GPIOD;
89 
90  init_pin(GPIOA, POS_LD2);
91 
92  return 0;
93 }
94 
95 static int led_getc(struct st_device *dev, unsigned char *rd)
96 {
97  *rd = ((GPIOA->ODR & BIT_LD2) >> POS_LD2);
98 
99  return 1;
100 }
101 
102 static int led_putc(struct st_device *dev, unsigned char ch)
103 {
104  flg_led_on = ((ch << POS_LD2) & BIT_LD2);
105  GPIOA->ODR = flg_led_on;
106 
107  return 1;
108 }
109 
110 static int led_suspend(struct st_device *dev)
111 {
112  GPIOA->ODR &= ~(BIT_LD2);
113 
114  return 0;
115 }
116 
117 static int led_resume(struct st_device *dev)
118 {
119  GPIOA->ODR = flg_led_on;
120 
121  return 0;
122 }
123 
124 const struct st_device led_device = {
125  .name = DEF_DEV_NAME_LED,
126  .explan = "STM32L152RE-Nucleo LED",
127  .register_dev = led_register,
128  .getc = led_getc,
129  .putc = led_putc,
130  .suspend = led_suspend,
131  .resume = led_resume,
132 }; //!< LEDドライバ
デバイスドライバAPI
デバイスドライバ構造体
Definition: device.h:25
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26