/* to get internal reference voltage and temperature */ static int getadc(int ch) { int v; if (!(RCC_APB2ENR & (1 << 9))) { SET_CLOCK_APB2(ENABLE, 9); /* ADC1 clock enable */ ADC1_CR2 = 1 | 0x800000; /* ADC1 and TSVREFE power on */ udelay(1000); /* delay */ ADC1_CR2 |= 4; /* calibration */ while (ADC1_CR2 & 4); /* wait until calibration done */ printf("ADC calibration offset\t\t %d\n", ADC1_DR); ADC1_SMPR1 = 0x1c0000; /* 239.5 sample cycles */ } ADC1_SQR3 = ch; /* channel selection */ //INIT_TIMEOUT(adc, 1000); /* a second timeout */ ADC1_CR2 |= 1; /* start conversion */ while (!(ADC1_SR & 2)); /* EOC, until end of conversion */ //if (IS_TIMEOUT(adc)) return -1; v = ADC1_DR; /* get the result */ //ADC1_CR2 &= ~1; /* ADC1 power down */ //SET_CLOCK_APB2(DISABLE, 9); /* ADC1 clock disable */ return v; }
int gpio_init(unsigned int index, unsigned int flags) { unsigned int port, pin, mode; int vector; unsigned int irqflag; vector = -1; mode = 0; port = calc_port(index); pin = calc_pin(index); spin_lock_irqsave(gpio_init_lock, irqflag); #if (SOC == stm32f1) SET_CLOCK_APB2(ENABLE, port + 2); #elif (SOC == stm32f4) SET_CLOCK_AHB1(ENABLE, port); #endif port = calc_port_addr(port); /* default */ #if (SOC == stm32f4) /* no pull-up, pull-down */ *(volatile unsigned int *)(port + 0xc) &= ~(3 << (pin * 2)); /* very high speed I/O output speed */ *(volatile unsigned int *)(port + 8) |= 3 << (pin * 2); /* push-pull output */ *(volatile unsigned int *)(port + 4) &= ~(1 << pin); #endif if (flags & GPIO_MODE_OUTPUT) { mode = PIN_OUTPUT; } else if (flags & GPIO_MODE_ALT) { mode = PIN_ALT; } else if (flags & GPIO_MODE_ANALOG) { mode = PIN_ANALOG; } else { /* GPIO_MODE_INPUT */ mode = PIN_INPUT; #if (SOC == stm32f1) mode |= PIN_FLOATING; #endif } if (flags & GPIO_CONF_OPENDRAIN) { #if (SOC == stm32f4) *(volatile unsigned int *)(port + 4) |= 1 << pin; #elif (SOC == stm32f1) mode &= ~(PIN_FLOATING); if (flags & GPIO_MODE_ALT) mode |= PIN_ALT_OPENDRAIN; else mode |= PIN_OPENDRAIN; #endif } else if (flags & GPIO_CONF_PULL_UP) { #if (SOC == stm32f4) *(volatile unsigned int *)(port + 0xc) |= 1 << (pin * 2); #elif (SOC == stm32f1) mode &= ~(PIN_FLOATING); mode |= PIN_PULL; #endif PUT_PORT_PIN(port, pin, 1); } else if (flags & GPIO_CONF_PULL_DOWN) { #if (SOC == stm32f4) *(volatile unsigned int *)(port + 0xc) |= 2 << (pin * 2); #elif (SOC == stm32f1) mode &= ~(PIN_FLOATING); mode |= PIN_PULL; #endif PUT_PORT_PIN(port, pin, 0); } SET_PORT_PIN(port, pin, mode); if (flags & (GPIO_INT_FALLING | GPIO_INT_RISING)) { #if (SOC == stm32f1) /* AFIO deals with Pin Remapping and EXTI */ SET_CLOCK_APB2(ENABLE, 0); #elif (SOC == stm32f4) /* exti <- syscfg <- apb2 */ SET_CLOCK_APB2(ENABLE, 14); #endif EXTI_IMR |= 1 << pin; if (flags & GPIO_INT_FALLING) EXTI_FTSR |= 1 << pin; if (flags & GPIO_INT_RISING) EXTI_RTSR |= 1 << pin; switch (pin) { case 0 ... 4: nvic_set(pin + 6, ON); vector = pin + 22; break; case 5 ... 9: nvic_set(23, ON); vector = 39; break; case 10 ... 15: nvic_set(40, ON); vector = 56; break; default: break; } link_exti_to_nvic(port, pin); }