Beispiel #1
0
/* 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;
}
Beispiel #2
0
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);
    }