void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine the UART to use (UART_1, UART_2, ...) UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object UARTName instance = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT(instance != (UARTName)NC); // Enable USART clock switch (instance) { case UART_1: __USART1_CLK_ENABLE(); obj->serial.module = 0; break; case UART_2: __USART2_CLK_ENABLE(); obj->serial.module = 1; break; #if defined(USART3_BASE) case UART_3: __USART3_CLK_ENABLE(); obj->serial.module = 2; break; #endif #if defined(UART4_BASE) case UART_4: __UART4_CLK_ENABLE(); obj->serial.module = 3; break; #endif #if defined(UART5_BASE) case UART_5: __UART5_CLK_ENABLE(); obj->serial.module = 4; break; #endif case UART_6: __USART6_CLK_ENABLE(); obj->serial.module = 5; break; #if defined(UART7_BASE) case UART_7: __UART7_CLK_ENABLE(); obj->serial.module = 6; break; #endif #if defined(UART8_BASE) case UART_8: __UART8_CLK_ENABLE(); obj->serial.module = 7; break; #endif } // Configure the UART pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) pin_mode(tx, PullUp); if (rx != NC) pin_mode(rx, PullUp); obj->serial.pin_tx = tx; obj->serial.pin_rx = rx; // initialize the handle for this master! UART_HandleTypeDef *handle = &UartHandle[obj->serial.module]; handle->Instance = (USART_TypeDef *)instance; handle->Init.BaudRate = 9600; handle->Init.WordLength = UART_WORDLENGTH_8B; handle->Init.StopBits = UART_STOPBITS_1; handle->Init.Parity = UART_PARITY_NONE; if (rx == NC) { handle->Init.Mode = UART_MODE_TX; } else if (tx == NC) { handle->Init.Mode = UART_MODE_RX; } else { handle->Init.Mode = UART_MODE_TX_RX; } handle->Init.HwFlowCtl = UART_HWCONTROL_NONE; handle->Init.OverSampling = UART_OVERSAMPLING_16; handle->TxXferCount = 0; handle->RxXferCount = 0; if (tx == STDIO_UART_TX && rx == STDIO_UART_RX) { handle->Init.BaudRate = YOTTA_CFG_MBED_OS_STDIO_DEFAULT_BAUD; } HAL_UART_Init(handle); // DEBUG_PRINTF("UART%u: Init\n", obj->serial.module+1); }
/** Initialize the analogin peripheral * * Configures the pin used by analogin. * @param obj The analogin object to initialize * @param pin The analogin pin name */ void analogin_init(analogin_t *obj, PinName pin) { uint32_t periph; MBED_ASSERT(obj); obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC); MBED_ASSERT(obj->adc != (ADCName)NC); uint32_t function = pinmap_function(pin, PinMap_ADC); MBED_ASSERT(function != (uint32_t)NC); obj->channel = GD_PIN_CHANNEL_GET(function); MBED_ASSERT(obj->channel <= ADC_CHANNEL_17); obj->pin = pin; if ((ADC_CHANNEL_17 == obj->channel) || (ADC_CHANNEL_16 == obj->channel)) { /* no need to config port */ } else { pinmap_pinout(pin, PinMap_ADC); } periph = obj->adc; /* when pin >= ADC_TEMP, it indicates that the channel has no external pins */ if (pin < ADC_TEMP) { pinmap_pinout(pin, PinMap_ADC); } /* ADC clock enable */ switch (periph) { case ADC0: rcu_periph_clock_enable(RCU_ADC0); break; case ADC1: rcu_periph_clock_enable(RCU_ADC1); break; #ifndef GD32F30X_CL case ADC2: rcu_periph_clock_enable(RCU_ADC2); break; #endif /* GD32F30X_CL */ } /* ADC clock cannot be greater than 42M */ rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6); /* ADC configuration */ adc_data_alignment_config(obj->adc, ADC_DATAALIGN_RIGHT); adc_channel_length_config(obj->adc, ADC_REGULAR_CHANNEL, 1); adc_special_function_config(obj->adc, ADC_SCAN_MODE, DISABLE); adc_special_function_config(obj->adc, ADC_CONTINUOUS_MODE, DISABLE); adc_external_trigger_config(obj->adc, ADC_REGULAR_CHANNEL, ENABLE); adc_external_trigger_source_config(obj->adc, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); /* ADC enable */ adc_enable(obj->adc); adc_calibration_enable(obj->adc); }
void analogin_init(analogin_t *obj, PinName pin) { ADC_TypeDef *adc; ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; // Get the peripheral name from the pin and assign it to the object obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC); if (obj->adc == (ADCName)NC) { error("ADC pin mapping failed"); } // Configure GPIO pinmap_pinout(pin, PinMap_ADC); // Save pin number for the read function obj->pin = pin; // The ADC initialization is done once if (adc_inited == 0) { adc_inited = 1; // Get ADC registers structure address adc = (ADC_TypeDef *)(obj->adc); // Enable ADC clock RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE); // Calibration ADC_VoltageRegulatorCmd(adc, ENABLE); wait_us(10); ADC_SelectCalibrationMode(adc, ADC_CalibrationMode_Single); ADC_StartCalibration(adc); while (ADC_GetCalibrationStatus(adc) != RESET) {} // Configure ADC ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot; ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0; ADC_CommonInit(adc, &ADC_CommonInitStructure); ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable; ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0; ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable; ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; ADC_InitStructure.ADC_NbrOfRegChannel = 1; ADC_Init(adc, &ADC_InitStructure); // Enable ADC ADC_Cmd(adc, ENABLE); while (!ADC_GetFlagStatus(adc, ADC_FLAG_RDY)) {} } }
void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); }
//****************************************************************************** void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine which uart is associated with each pin UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); // Make sure that both pins are pointing to the same uart MBED_ASSERT(uart != (UARTName)NC); // Ensure that the UART clock is enabled switch (uart) { case UART_0: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART0_CLK_GATER; break; case UART_1: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART1_CLK_GATER; break; case UART_2: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART2_CLK_GATER; break; case UART_3: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART3_CLK_GATER; break; default: break; } // Ensure that the UART clock is enabled // But don't override the scaler // // To support the most common baud rates, 9600 and 115200, we need to // scale down the uart input clock. if (!(MXC_CLKMAN->sys_clk_ctrl_8_uart & MXC_F_CLKMAN_SYS_CLK_CTRL_8_UART_UART_CLK_SCALE)) { switch (SystemCoreClock) { case RO_FREQ: MXC_CLKMAN->sys_clk_ctrl_8_uart = MXC_S_CLKMAN_CLK_SCALE_DIV_4; break; case (RO_FREQ / 2): MXC_CLKMAN->sys_clk_ctrl_8_uart = MXC_S_CLKMAN_CLK_SCALE_DIV_2; break; default: MXC_CLKMAN->sys_clk_ctrl_8_uart = MXC_S_CLKMAN_CLK_SCALE_DIV_4; break; } } // Set the obj pointer to the proper uart obj->uart = (mxc_uart_regs_t*)uart; // Set the uart index obj->index = MXC_UART_GET_IDX(obj->uart); obj->fifo = (mxc_uart_fifo_regs_t*)MXC_UART_GET_BASE_FIFO(obj->index); // Configure the pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // Flush the RX and TX FIFOs, clear the settings obj->uart->ctrl &= ~(MXC_F_UART_CTRL_RX_FIFO_EN | MXC_F_UART_CTRL_TX_FIFO_EN); obj->uart->ctrl |= (MXC_F_UART_CTRL_RX_FIFO_EN | MXC_F_UART_CTRL_TX_FIFO_EN); // Disable interrupts obj->uart->inten = 0; obj->uart->intfl = obj->uart->intfl; // Configure to default settings serial_baud(obj, DEFAULT_BAUD); serial_format(obj, 8, ParityNone, 1); // Manage stdio UART if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } // Enable UART obj->uart->ctrl |= MXC_F_UART_CTRL_UART_EN; }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { // Determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); obj->spi = (SPIName)pinmap_merge(spi_data, spi_cntl); MBED_ASSERT(obj->spi != (SPIName)NC); // Enable SPI clock #if defined(SPI1_BASE) if (obj->spi == SPI_1) { __SPI1_CLK_ENABLE(); } #endif #if defined(SPI2_BASE) if (obj->spi == SPI_2) { __SPI2_CLK_ENABLE(); } #endif #if defined(SPI3_BASE) if (obj->spi == SPI_3) { __SPI3_CLK_ENABLE(); } #endif // Configure the SPI pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); // Save new values obj->bits = SPI_DATASIZE_8BIT; obj->cpol = SPI_POLARITY_LOW; obj->cpha = SPI_PHASE_1EDGE; #if defined(TARGET_STM32F334C8) obj->br_presc = SPI_BAUDRATEPRESCALER_256; #else obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1 MHz (HSI) or 1.13 MHz (HSE) #endif obj->pin_miso = miso; obj->pin_mosi = mosi; obj->pin_sclk = sclk; obj->pin_ssel = ssel; if (ssel == NC) { // SW NSS Master mode obj->mode = SPI_MODE_MASTER; obj->nss = SPI_NSS_SOFT; } else { // Slave pinmap_pinout(ssel, PinMap_SPI_SSEL); obj->mode = SPI_MODE_SLAVE; obj->nss = SPI_NSS_HARD_INPUT; } init_spi(obj); }
void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); // Determine the UART to use (UART_1, UART_2, ...) UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object obj_s->uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT(obj_s->uart != (UARTName)NC); // Enable USART clock + switch to SystemClock if (obj_s->uart == UART_1) { __USART1_FORCE_RESET(); __USART1_RELEASE_RESET(); __USART1_CLK_ENABLE(); #if defined(RCC_USART1CLKSOURCE_SYSCLK) __HAL_RCC_USART1_CONFIG(RCC_USART1CLKSOURCE_SYSCLK); #endif obj_s->index = 0; } #if defined(USART2_BASE) if (obj_s->uart == UART_2) { __USART2_FORCE_RESET(); __USART2_RELEASE_RESET(); __USART2_CLK_ENABLE(); #if defined(RCC_USART2CLKSOURCE_SYSCLK) __HAL_RCC_USART2_CONFIG(RCC_USART2CLKSOURCE_SYSCLK); #endif obj_s->index = 1; } #endif #if defined(USART3_BASE) if (obj_s->uart == UART_3) { __USART3_FORCE_RESET(); __USART3_RELEASE_RESET(); __USART3_CLK_ENABLE(); #if defined(RCC_USART3CLKSOURCE_SYSCLK) __HAL_RCC_USART3_CONFIG(RCC_USART3CLKSOURCE_SYSCLK); #endif obj_s->index = 2; } #endif #if defined(UART4_BASE) if (obj_s->uart == UART_4) { __UART4_FORCE_RESET(); __UART4_RELEASE_RESET(); __UART4_CLK_ENABLE(); #if defined(RCC_UART4CLKSOURCE_SYSCLK) __HAL_RCC_UART4_CONFIG(RCC_UART4CLKSOURCE_SYSCLK); #endif obj_s->index = 3; } #endif #if defined(UART5_BASE) if (obj_s->uart == UART_5) { __HAL_RCC_UART5_FORCE_RESET(); __HAL_RCC_UART5_RELEASE_RESET(); __UART5_CLK_ENABLE(); #if defined(RCC_UART5CLKSOURCE_SYSCLK) __HAL_RCC_UART5_CONFIG(RCC_UART5CLKSOURCE_SYSCLK); #endif obj_s->index = 4; } #endif // Configure the UART pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } // Configure UART obj_s->baudrate = 9600; obj_s->databits = UART_WORDLENGTH_8B; obj_s->stopbits = UART_STOPBITS_1; obj_s->parity = UART_PARITY_NONE; #if DEVICE_SERIAL_FC obj_s->hw_flow_ctl = UART_HWCONTROL_NONE; #endif obj_s->pin_tx = tx; obj_s->pin_rx = rx; init_uart(obj); // For stdio management if (obj_s->uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void analogin_init(analogin_t *obj, PinName pin) { uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) // are described in PinNames.h and PeripheralPins.c // Pin value must be between 0xF0 and 0xFF if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC); MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); // Save pin number for the read function obj->pin = pin; // Configure ADC object structures obj->handle.State = HAL_ADC_STATE_RESET; obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; obj->handle.Init.Resolution = ADC_RESOLUTION_12B; obj->handle.Init.ScanConvMode = DISABLE; obj->handle.Init.ContinuousConvMode = DISABLE; obj->handle.Init.DiscontinuousConvMode = DISABLE; obj->handle.Init.NbrOfDiscConversion = 0; obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; obj->handle.Init.NbrOfConversion = 1; obj->handle.Init.DMAContinuousRequests = DISABLE; obj->handle.Init.EOCSelection = DISABLE; #if defined(ADC1) if ((ADCName)obj->handle.Instance == ADC_1) { __HAL_RCC_ADC1_CLK_ENABLE(); } #endif #if defined(ADC2) if ((ADCName)obj->handle.Instance == ADC_2) { __HAL_RCC_ADC2_CLK_ENABLE(); } #endif #if defined(ADC3) if ((ADCName)obj->handle.Instance == ADC_3) { __HAL_RCC_ADC3_CLK_ENABLE(); } #endif if (HAL_ADC_Init(&obj->handle) != HAL_OK) { error("Cannot initialize ADC"); } }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { // Determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); obj->spi = (SPIName)pinmap_merge(spi_data, spi_cntl); MBED_ASSERT(obj->spi != (SPIName)NC); // Enable SPI clock if (obj->spi == SPI_1) { __HAL_RCC_SPI1_CLK_ENABLE(); } if (obj->spi == SPI_2) { __HAL_RCC_SPI2_CLK_ENABLE(); } if (obj->spi == SPI_3) { __HAL_RCC_SPI3_CLK_ENABLE(); } #if defined SPI4_BASE if (obj->spi == SPI_4) { __HAL_RCC_SPI4_CLK_ENABLE(); } #endif #if defined SPI5_BASE if (obj->spi == SPI_5) { __HAL_RCC_SPI5_CLK_ENABLE(); } #endif // Configure the SPI pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); // Save new values obj->bits = SPI_DATASIZE_8BIT; obj->cpol = SPI_POLARITY_LOW; obj->cpha = SPI_PHASE_1EDGE; obj->br_presc = SPI_BAUDRATEPRESCALER_256; obj->pin_miso = miso; obj->pin_mosi = mosi; obj->pin_sclk = sclk; obj->pin_ssel = ssel; if (ssel != NC) { pinmap_pinout(ssel, PinMap_SPI_SSEL); } else { obj->nss = SPI_NSS_SOFT; } init_spi(obj); }
/** Initialize the SPI peripheral * * Configures the pins used by SPI, sets a default format and frequency, and enables the peripheral * @param[out] obj The SPI object to initialize * @param[in] mosi The pin to use for MOSI * @param[in] miso The pin to use for MISO * @param[in] sclk The pin to use for SCLK * @param[in] ssel The pin to use for SSEL */ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { struct spi_s *spiobj = SPI_S(obj); SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); /* return SPIName according to PinName */ SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); spiobj->spi = (SPIName)pinmap_merge(spi_data, spi_cntl); MBED_ASSERT(spiobj->spi != (SPIName)NC); /* set iqr type */ if (spiobj->spi == SPI0) { rcu_periph_clock_enable(RCU_SPI0); spiobj->spi_irq = SPI0_IRQn; } if (spiobj->spi == SPI1) { rcu_periph_clock_enable(RCU_SPI1); spiobj->spi_irq = SPI1_IRQn; } if (spiobj->spi == SPI2) { rcu_periph_clock_enable(RCU_SPI2); spiobj->spi_irq = SPI2_IRQn; } if (spiobj->spi == SPI3) { rcu_periph_clock_enable(RCU_SPI3); spiobj->spi_irq = SPI3_IRQn; } if (spiobj->spi == SPI4) { rcu_periph_clock_enable(RCU_SPI4); spiobj->spi_irq = SPI4_IRQn; } if (spiobj->spi == SPI5) { rcu_periph_clock_enable(RCU_SPI5); spiobj->spi_irq = SPI5_IRQn; } /* configure GPIO mode of SPI pins */ pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); spiobj->pin_miso = miso; spiobj->pin_mosi = mosi; spiobj->pin_sclk = sclk; spiobj->pin_ssel = ssel; if (ssel != NC) { pinmap_pinout(ssel, PinMap_SPI_SSEL); spiobj->spi_struct.nss = SPI_NSS_HARD; spi_nss_output_enable(spiobj->spi); } else { spiobj->spi_struct.nss = SPI_NSS_SOFT; } /* initilize spiobj with default values */ spiobj->spi_struct.device_mode = SPI_MASTER; spiobj->spi_struct.prescale = SPI_PSC_256; spiobj->spi_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spiobj->spi_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; spiobj->spi_struct.frame_size = SPI_FRAMESIZE_8BIT; spiobj->spi_struct.endian = SPI_ENDIAN_MSB; dev_spi_struct_init(obj); }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk) { // Determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName instance = (SPIName)pinmap_merge(spi_data, spi_sclk); MBED_ASSERT(instance != (SPIName)NC); // Enable SPI clock and set the right module number switch(instance) { case SPI_1: __SPI1_CLK_ENABLE(); obj->spi.module = 0; break; case SPI_2: __SPI2_CLK_ENABLE(); obj->spi.module = 1; break; case SPI_3: __SPI3_CLK_ENABLE(); obj->spi.module = 2; break; #if MODULES_SIZE_SPI > 3 case SPI_4: __SPI4_CLK_ENABLE(); obj->spi.module = 3; break; #endif #if MODULES_SIZE_SPI > 4 case SPI_5: __SPI5_CLK_ENABLE(); obj->spi.module = 4; break; #endif #if MODULES_SIZE_SPI > 5 case SPI_6: __SPI6_CLK_ENABLE(); obj->spi.module = 5; break; #endif default: break; } // Configure the SPI pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); obj->spi.pin_miso = miso; obj->spi.pin_mosi = mosi; obj->spi.pin_sclk = sclk; // initialize the handle for this master! SPI_HandleTypeDef *handle = &SpiHandle[obj->spi.module]; handle->Instance = (SPI_TypeDef *)(instance); handle->Init.Mode = SPI_MODE_MASTER; handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; handle->Init.Direction = SPI_DIRECTION_2LINES; handle->Init.CLKPhase = SPI_PHASE_1EDGE; handle->Init.CLKPolarity = SPI_POLARITY_LOW; handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; handle->Init.CRCPolynomial = 7; handle->Init.DataSize = SPI_DATASIZE_8BIT; handle->Init.FirstBit = SPI_FIRSTBIT_MSB; handle->Init.NSS = SPI_NSS_SOFT; handle->Init.TIMode = SPI_TIMODE_DISABLED; DEBUG_PRINTF("SPI%u: Init\n", obj->spi.module+1); init_spi(obj); }
void pwmout_init(pwmout_t* obj, PinName pin) { // determine the SPI to use PWMName pwm_mapped = (PWMName)pinmap_peripheral(pin, PinMap_PWM); if (pwm_mapped == (PWMName)NC) { error("PwmOut pin mapping failed"); } int sct_n = get_available_sct(); if (sct_n == -1) { error("No available SCT"); } sct_used |= (1 << sct_n); obj->pwm = SCTs[sct_n]; obj->pwm_ch = sct_n; // Enable the SCT clock LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 31); // Clear peripheral reset the SCT: LPC_SYSCON->PRESETCTRL |= (1 << (obj->pwm_ch + 9)); pinmap_pinout(pin, PinMap_PWM); LPC_SCT0_Type* pwm = obj->pwm; // Two 16-bit counters, autolimit pwm->CONFIG &= ~(0x1); pwm->CONFIG |= (1 << 17); // halt and clear the counter pwm->CTRL |= (1 << 2) | (1 << 3); // System Clock -> us_ticker (1)MHz pwm->CTRL &= ~(0x7F << 5); pwm->CTRL |= (((SystemCoreClock/1000000 - 1) & 0x7F) << 5); switch(pwm_mapped) { case SCT0_0: case SCT1_0: pwm->OUT0_SET = (1 << 0); // event 0 pwm->OUT0_CLR = (1 << 1); // event 1 break; case SCT0_1: case SCT1_1: pwm->OUT1_SET = (1 << 0); // event 0 pwm->OUT1_CLR = (1 << 1); // event 1 break; case SCT0_2: case SCT1_2: pwm->OUT2_SET = (1 << 0); // event 0 pwm->OUT2_CLR = (1 << 1); // event 1 break; case SCT0_3: case SCT1_3: pwm->OUT3_SET = (1 << 0); // event 0 pwm->OUT3_CLR = (1 << 1); // event 1 break; default: break; } // Event 0 : MATCH and MATCHSEL=0 pwm->EV0_CTRL = (1 << 12); pwm->EV0_STATE = 0xFFFFFFFF; // Event 1 : MATCH and MATCHSEL=1 pwm->EV1_CTRL = (1 << 12) | (1 << 0); pwm->EV1_STATE = 0xFFFFFFFF; // Match reload register pwm->MATCHREL0 = 20000; // 20ms pwm->MATCHREL1 = (pwm->MATCHREL0 / 4); // 50% duty // unhalt the counter: // - clearing bit 2 of the CTRL register pwm->CTRL &= ~(1 << 2); // default to 20ms: standard for servos, and fine for e.g. brightness control pwmout_period_ms(obj, 20); pwmout_write (obj, 0); }
void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_SERCOM_PAD); }
void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // Determine the I2C to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl); MBED_ASSERT(obj->i2c != (I2CName)NC); // Enable I2C1 clock and pinout if not done if ((obj->i2c == I2C_1) && !i2c1_inited) { i2c1_inited = 1; __I2C1_CLK_ENABLE(); // Configure I2C pins pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); pin_mode(sda, OpenDrain); pin_mode(scl, OpenDrain); } // Enable I2C2 clock and pinout if not done if ((obj->i2c == I2C_2) && !i2c2_inited) { i2c2_inited = 1; __I2C2_CLK_ENABLE(); // Configure I2C pins pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); pin_mode(sda, OpenDrain); pin_mode(scl, OpenDrain); } #if defined I2C3_BASE // Enable I2C3 clock and pinout if not done if ((obj->i2c == I2C_3) && !i2c3_inited) { i2c3_inited = 1; __I2C3_CLK_ENABLE(); // Configure I2C pins pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); pin_mode(sda, OpenDrain); pin_mode(scl, OpenDrain); } #endif #if defined FMPI2C1_BASE // Enable I2C3 clock and pinout if not done if ((obj->i2c == FMPI2C_1) && !fmpi2c1_inited) { fmpi2c1_inited = 1; __HAL_RCC_FMPI2C1_CLK_ENABLE(); // Configure I2C pins pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); pin_mode(sda, OpenDrain); pin_mode(scl, OpenDrain); } #endif // Reset to clear pending flags if any i2c_reset(obj); // I2C configuration i2c_frequency(obj, 100000); // 100 kHz per default // I2C master by default obj->slave = 0; }
/** Initialize the analogin peripheral * * Configures the pin used by analogin. * @param obj The analogin object to initialize * @param pin The analogin pin name */ void analogin_init(analogin_t *obj, PinName pin) { uint32_t periph; MBED_ASSERT(obj); obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC); MBED_ASSERT(obj->adc != (ADCName)NC); uint32_t function = pinmap_function(pin, PinMap_ADC); MBED_ASSERT(function != (uint32_t)NC); obj->channel = GD_PIN_CHANNEL_GET(function); MBED_ASSERT(obj->channel <= ADC_CHANNEL_17); periph = obj->adc; /* save the pin for future use */ obj->pin = pin; /* ADC clock enable and pin number reset */ switch (periph) { case ADC0: rcu_periph_clock_enable(RCU_ADC0); break; case ADC1: rcu_periph_clock_enable(RCU_ADC1); /* reset pin number */ pin = (PinName)(pin & AND_NUMBER); break; } /* ADC clock cannot be greater than 40M */ rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); if ((ADC_CHANNEL_16 == obj->channel)) { /* ADC Vrefint enable */ adc_tempsensor_vrefint_enable(); /* set temperature sample flag */ temperature_sample_flag = SET; } if ((ADC_CHANNEL_17 == obj->channel)) { /* ADC Vrefint enable */ adc_tempsensor_vrefint_enable(); } /* when pin >= ADC_TEMP, it indicates that the channel has no external pins */ if (pin < ADC_TEMP) { pinmap_pinout(pin, PinMap_ADC); } /* ADC configuration */ adc_special_function_config(obj->adc, ADC_SCAN_MODE, DISABLE); adc_special_function_config(obj->adc, ADC_CONTINUOUS_MODE, DISABLE); /* ADC trigger config */ adc_external_trigger_source_config(obj->adc, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); /* ADC mode config */ adc_mode_config(ADC_MODE_FREE); /* ADC data alignment config */ adc_data_alignment_config(obj->adc, ADC_DATAALIGN_RIGHT); /* ADC channel length config */ adc_channel_length_config(obj->adc, ADC_REGULAR_CHANNEL, 1); if (temperature_sample_flag == SET) { /* sample temperature needs more time */ adc_regular_channel_config(obj->adc, 0, obj->channel, ADC_SAMPLETIME_239POINT5); /* clear temperature sample flag */ temperature_sample_flag = RESET; } else { adc_regular_channel_config(obj->adc, 0, obj->channel, ADC_SAMPLETIME_28POINT5); } adc_external_trigger_config(obj->adc, ADC_REGULAR_CHANNEL, ENABLE); /* ADC enable */ adc_enable(obj->adc); /* wait for ADC to stabilize */ _delay(500); adc_calibration_enable(obj->adc); }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { int altfunction[4]; // determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); obj->spi = (MPS2_SSP_TypeDef*)pinmap_merge(spi_data, spi_cntl); if ((int)obj->spi == NC) { error("SPI pinout mapping failed"); } // enable power and clocking switch ((int)obj->spi) { case (int)SPI_0: obj->spi->CR1 = 0; obj->spi->CR0 = SSP_CR0_SCR_DFLT | SSP_CR0_FRF_MOT | SSP_CR0_DSS_8; obj->spi->CPSR = SSP_CPSR_DFLT; obj->spi->IMSC = 0x8; obj->spi->DMACR = 0; obj->spi->CR1 = SSP_CR1_SSE_Msk; obj->spi->ICR = 0x3; break; case (int)SPI_1: /* Configure SSP used for LCD */ obj->spi->CR1 = 0; /* Synchronous serial port disable */ obj->spi->DMACR = 0; /* Disable FIFO DMA */ obj->spi->IMSC = 0; /* Mask all FIFO/IRQ interrupts */ obj->spi->ICR = ((1ul << 0) | /* Clear SSPRORINTR interrupt */ (1ul << 1) ); /* Clear SSPRTINTR interrupt */ obj->spi->CR0 = ((7ul << 0) | /* 8 bit data size */ (0ul << 4) | /* Motorola frame format */ (0ul << 6) | /* CPOL = 0 */ (0ul << 7) | /* CPHA = 0 */ (1ul << 8) ); /* Set serial clock rate */ obj->spi->CPSR = (2ul << 0); /* set SSP clk to 6MHz (6.6MHz max) */ obj->spi->CR1 = ((1ul << 1) | /* Synchronous serial port enable */ (0ul << 2) ); /* Device configured as master */ break; case (int)SPI_2: obj->spi->CR1 = 0; obj->spi->CR0 = SSP_CR0_SCR_DFLT | SSP_CR0_FRF_MOT | SSP_CR0_DSS_8; obj->spi->CPSR = SSP_CPSR_DFLT; obj->spi->IMSC = 0x8; obj->spi->DMACR = 0; obj->spi->CR1 = SSP_CR1_SSE_Msk; obj->spi->ICR = 0x3; break; case (int)SPI_3: obj->spi->CR1 = 0; obj->spi->CR0 = SSP_CR0_SCR_DFLT | SSP_CR0_FRF_MOT | SSP_CR0_DSS_8; obj->spi->CPSR = SSP_CPSR_DFLT; obj->spi->IMSC = 0x8; obj->spi->DMACR = 0; obj->spi->CR1 = SSP_CR1_SSE_Msk; obj->spi->ICR = 0x3; break; case (int)SPI_4: obj->spi->CR1 = 0; obj->spi->CR0 = SSP_CR0_SCR_DFLT | SSP_CR0_FRF_MOT | SSP_CR0_DSS_8; obj->spi->CPSR = SSP_CPSR_DFLT; obj->spi->IMSC = 0x8; obj->spi->DMACR = 0; obj->spi->CR1 = SSP_CR1_SSE_Msk; obj->spi->ICR = 0x3; break; } if(mosi != NC){ altfunction[0] = 1;}else{ altfunction[0] = 0;} if(miso != NC){ altfunction[1] = 1;}else{ altfunction[1] = 0;} if(sclk != NC){ altfunction[2] = 1;}else{ altfunction[2] = 0;} if(ssel != NC){ altfunction[3] = 1;}else{ altfunction[3] = 0;} // enable alt function switch ((int)obj->spi) { case (int)SPI_2: CMSDK_GPIO1->ALTFUNCSET |= (altfunction[2]<<5 | altfunction[0]<<4 | altfunction[1]<<3 | altfunction[3]<<2); break; case (int)SPI_3: CMSDK_GPIO0->ALTFUNCSET |= (altfunction[2]<<13 | altfunction[1]<<12 | altfunction[0]<<11 | altfunction[3]<<10); break; case (int)SPI_4: CMSDK_GPIO4->ALTFUNCSET |= (altfunction[2]<<3 | altfunction[1]<<2 | altfunction[0]<<1 | altfunction[3]); break; } // set default format and frequency if (ssel == NC) { spi_format(obj, 8, 0, 0); // 8 bits, mode 0, master } else { spi_format(obj, 8, 0, 1); // 8 bits, mode 0, slave } spi_frequency(obj, 1000000); // enable the ssp channel ssp_enable(obj); // pin out the spi pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); if (ssel != NC) { pinmap_pinout(ssel, PinMap_SPI_SSEL); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine the UART to use (UART_1, UART_2, ...) UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object UARTName instance = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT(instance != (UARTName)NC); // Enable USART clock switch (instance) { case UART_1: __HAL_RCC_USART1_FORCE_RESET(); __HAL_RCC_USART1_RELEASE_RESET(); __HAL_RCC_USART1_CLK_ENABLE(); SERIAL_OBJ(index) = 0; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA2_CLK_ENABLE(); #endif break; case UART_2: __HAL_RCC_USART2_FORCE_RESET(); __HAL_RCC_USART2_RELEASE_RESET(); __HAL_RCC_USART2_CLK_ENABLE(); SERIAL_OBJ(index) = 1; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA1_CLK_ENABLE(); #endif break; #if defined(USART3_BASE) case UART_3: __HAL_RCC_USART3_FORCE_RESET(); __HAL_RCC_USART3_RELEASE_RESET(); __HAL_RCC_USART3_CLK_ENABLE(); SERIAL_OBJ(index) = 2; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA1_CLK_ENABLE(); #endif break; #endif #if defined(UART4_BASE) case UART_4: __HAL_RCC_UART4_FORCE_RESET(); __HAL_RCC_UART4_RELEASE_RESET(); __HAL_RCC_UART4_CLK_ENABLE(); SERIAL_OBJ(index) = 3; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA1_CLK_ENABLE(); #endif break; #endif #if defined(UART5_BASE) case UART_5: __HAL_RCC_UART5_FORCE_RESET(); __HAL_RCC_UART5_RELEASE_RESET(); __HAL_RCC_UART5_CLK_ENABLE(); SERIAL_OBJ(index) = 4; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA1_CLK_ENABLE(); #endif break; #endif #if defined(USART6_BASE) case UART_6: __HAL_RCC_USART6_FORCE_RESET(); __HAL_RCC_USART6_RELEASE_RESET(); __HAL_RCC_USART6_CLK_ENABLE(); SERIAL_OBJ(index) = 5; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA2_CLK_ENABLE(); #endif break; #endif #if defined(UART7_BASE) case UART_7: __HAL_RCC_UART7_FORCE_RESET(); __HAL_RCC_UART7_RELEASE_RESET(); __HAL_RCC_UART7_CLK_ENABLE(); SERIAL_OBJ(index) = 6; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA1_CLK_ENABLE(); #endif break; #endif #if defined(UART8_BASE) case UART_8: __HAL_RCC_UART8_FORCE_RESET(); __HAL_RCC_UART8_RELEASE_RESET(); __HAL_RCC_UART8_CLK_ENABLE(); SERIAL_OBJ(index) = 7; #if DEVICE_SERIAL_ASYNCH_DMA __HAL_RCC_DMA1_CLK_ENABLE(); #endif break; #endif } // Configure the UART pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } // Configure UART SERIAL_OBJ(baudrate) = 9600; SERIAL_OBJ(databits) = UART_WORDLENGTH_8B; SERIAL_OBJ(stopbits) = UART_STOPBITS_1; SERIAL_OBJ(parity) = UART_PARITY_NONE; SERIAL_OBJ(pin_tx) = tx; SERIAL_OBJ(pin_rx) = rx; init_uart(obj, instance); #ifndef YOTTA_CFG_MBED_OS // For stdio management if ((int)(UartHandle[SERIAL_OBJ(index)].Instance) == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } #endif DEBUG_PRINTF("UART%u: Init\n", obj->serial.module+1); }
void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine the UART to use (UART_1, UART_2, ...) UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT(obj->uart != (UARTName)NC); obj->baudrate = 9600; // Default excepted for LPUART_1 (see below) // Enable UART clock if (obj->uart == UART_1) { __HAL_RCC_USART1_CLK_ENABLE(); obj->index = 0; } if (obj->uart == UART_2) { __HAL_RCC_USART2_CLK_ENABLE(); obj->index = 1; } if (obj->uart == UART_3) { __HAL_RCC_USART3_CLK_ENABLE(); obj->index = 2; } if (obj->uart == UART_4) { __HAL_RCC_UART4_CLK_ENABLE(); obj->index = 3; } if (obj->uart == UART_5) { __HAL_RCC_UART5_CLK_ENABLE(); obj->index = 4; } if (obj->uart == LPUART_1) { __HAL_RCC_LPUART1_CLK_ENABLE(); obj->baudrate = 38400; // Maximum peripheral clock is 4096 x BR -> This is the minimum BR with 80 MHz peripheral clock. obj->index = 5; } // Configure the UART pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } // Configure UART obj->databits = UART_WORDLENGTH_8B; obj->stopbits = UART_STOPBITS_1; obj->parity = UART_PARITY_NONE; obj->pin_tx = tx; obj->pin_rx = rx; init_uart(obj); // For stdio management if (obj->uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { volatile uint8_t dummy ; int is_stdio_uart = 0; // determine the UART to use uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); uint32_t uart = pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)uart != NC); obj->uart = (struct st_scif *)SCIF[uart]; // enable power switch (uart) { case UART0: CPG.STBCR4 &= ~(1 << 7); break; case UART1: CPG.STBCR4 &= ~(1 << 6); break; case UART2: CPG.STBCR4 &= ~(1 << 5); break; case UART3: CPG.STBCR4 &= ~(1 << 4); break; case UART4: CPG.STBCR4 &= ~(1 << 3); break; case UART5: CPG.STBCR4 &= ~(1 << 2); break; case UART6: CPG.STBCR4 &= ~(1 << 1); break; case UART7: CPG.STBCR4 &= ~(1 << 0); break; } dummy = CPG.STBCR4; /* if this uart has been previously configured to tx, wait tx completion befor loading new configuration */ if(obj->uart->SCSCR & 0xA0) while(!(obj->uart->SCFSR & 0x0040)); /* ==== SCIF initial setting ==== */ /* ---- Serial control register (SCSCR) setting ---- */ /* B'00 : Internal CLK */ obj->uart->SCSCR = 0x0000u; /* SCIF transmitting and receiving operations stop */ /* ---- FIFO control register (SCFCR) setting ---- */ /* Transmit FIFO reset & Receive FIFO data register reset */ obj->uart->SCFCR = 0x0006; /* ---- Serial status register (SCFSR) setting ---- */ dummy = obj->uart->SCFSR; obj->uart->SCFSR = (dummy & 0xFF6Cu); /* ER,BRK,DR bit clear */ /* ---- Line status register (SCLSR) setting ---- */ /* ORER bit clear */ obj->uart->SCLSR = 0; /* ---- Serial extension mode register (SCEMR) setting ---- b7 BGDM - Baud rate generator double-speed mode : Normal mode b0 ABCS - Base clock select in asynchronous mode : Base clock is 16 times the bit rate */ obj->uart->SCEMR = 0x0000u; /* ---- Bit rate register (SCBRR) setting ---- */ serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); /* ---- FIFO control register (SCFCR) setting ---- */ obj->uart->SCFCR = 0x0030u; /* ---- Serial port register (SCSPTR) setting ---- b1 SPB2IO - Serial port break output : disabled b0 SPB2DT - Serial port break data : High-level */ obj->uart->SCSPTR = 0x0003u; // SPB2IO = 1, SPB2DT = 1 /* ---- Line status register (SCLSR) setting ---- b0 ORER - Overrun error detect : clear */ if (obj->uart->SCLSR & 0x0001) { obj->uart->SCLSR = 0u; // ORER clear } // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); switch (uart) { case UART0: obj->index = 0; break; case UART1: obj->index = 1; break; case UART2: obj->index = 2; break; case UART3: obj->index = 3; break; case UART4: obj->index = 4; break; case UART5: obj->index = 5; break; case UART6: obj->index = 6; break; case UART7: obj->index = 7; break; } uart_data[obj->index].sw_rts.pin = NC; uart_data[obj->index].sw_cts.pin = NC; /* ---- Serial control register (SCSCR) setting ---- */ /* Setting the TE and RE bits enables the TxD and RxD pins to be used. */ obj->uart->SCSCR = (((uart_tx != (uint32_t)NC)? 0xA0 : 0) | ((uart_rx != (uint32_t)NC)? 0x50 : 0 )); //0x00F0; is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void can_init_freq (can_t *obj, PinName rd, PinName td, int hz) { CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD); CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD); CANName can = (CANName)pinmap_merge(can_rd, can_td); MBED_ASSERT((int)can != NC); if (can == CAN_1) { __HAL_RCC_CAN1_CLK_ENABLE(); obj->index = 0; } #if defined(CAN2_BASE) && (CAN_NUM > 1) else if (can == CAN_2) { __HAL_RCC_CAN1_CLK_ENABLE(); // needed to set filters __HAL_RCC_CAN2_CLK_ENABLE(); obj->index = 1; } #endif #if defined(CAN3_BASE) && (CAN_NUM > 2) else if (can == CAN_3) { __HAL_RCC_CAN3_CLK_ENABLE(); obj->index = 2; } #endif else { return; } // Configure the CAN pins pinmap_pinout(rd, PinMap_CAN_RD); pinmap_pinout(td, PinMap_CAN_TD); if (rd != NC) { pin_mode(rd, PullUp); } if (td != NC) { pin_mode(td, PullUp); } /* Use default values for rist init */ obj->CanHandle.Instance = (CAN_TypeDef *)can; obj->CanHandle.Init.TTCM = DISABLE; obj->CanHandle.Init.ABOM = DISABLE; obj->CanHandle.Init.AWUM = DISABLE; obj->CanHandle.Init.NART = DISABLE; obj->CanHandle.Init.RFLM = DISABLE; obj->CanHandle.Init.TXFP = DISABLE; obj->CanHandle.Init.Mode = CAN_MODE_NORMAL; obj->CanHandle.Init.SJW = CAN_SJW_1TQ; obj->CanHandle.Init.BS1 = CAN_BS1_6TQ; obj->CanHandle.Init.BS2 = CAN_BS2_8TQ; obj->CanHandle.Init.Prescaler = 2; /* Store frequency to be restored in case of reset */ obj->hz = hz; can_registers_init(obj); /* Bits 27:14 are available for dual CAN configuration and are reserved for single CAN configuration: */ #if defined(CAN3_BASE) && (CAN_NUM > 2) uint32_t filter_number = (can == CAN_1 || can == CAN_3) ? 0 : 14; #else uint32_t filter_number = (can == CAN_1) ? 0 : 14; #endif can_filter(obj, 0, 0, CANStandard, filter_number); }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { struct spi_s *spiobj = SPI_S(obj); SPI_HandleTypeDef *handle = &(spiobj->handle); // Determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); spiobj->spi = (SPIName)pinmap_merge(spi_data, spi_cntl); MBED_ASSERT(spiobj->spi != (SPIName)NC); #if defined SPI1_BASE // Enable SPI clock if (spiobj->spi == SPI_1) { __HAL_RCC_SPI1_CLK_ENABLE(); spiobj->spiIRQ = SPI1_IRQn; } #endif #if defined SPI2_BASE if (spiobj->spi == SPI_2) { __HAL_RCC_SPI2_CLK_ENABLE(); spiobj->spiIRQ = SPI2_IRQn; } #endif #if defined SPI3_BASE if (spiobj->spi == SPI_3) { __HAL_RCC_SPI3_CLK_ENABLE(); spiobj->spiIRQ = SPI3_IRQn; } #endif #if defined SPI4_BASE if (spiobj->spi == SPI_4) { __HAL_RCC_SPI4_CLK_ENABLE(); spiobj->spiIRQ = SPI4_IRQn; } #endif #if defined SPI5_BASE if (spiobj->spi == SPI_5) { __HAL_RCC_SPI5_CLK_ENABLE(); spiobj->spiIRQ = SPI5_IRQn; } #endif #if defined SPI6_BASE if (spiobj->spi == SPI_6) { __HAL_RCC_SPI6_CLK_ENABLE(); spiobj->spiIRQ = SPI6_IRQn; } #endif // Configure the SPI pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); spiobj->pin_miso = miso; spiobj->pin_mosi = mosi; spiobj->pin_sclk = sclk; spiobj->pin_ssel = ssel; if (ssel != NC) { pinmap_pinout(ssel, PinMap_SPI_SSEL); } else { handle->Init.NSS = SPI_NSS_SOFT; } /* Fill default value */ handle->Instance = SPI_INST(obj); handle->Init.Mode = SPI_MODE_MASTER; handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; handle->Init.Direction = SPI_DIRECTION_2LINES; handle->Init.CLKPhase = SPI_PHASE_1EDGE; handle->Init.CLKPolarity = SPI_POLARITY_LOW; handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; handle->Init.CRCPolynomial = 7; handle->Init.DataSize = SPI_DATASIZE_8BIT; handle->Init.FirstBit = SPI_FIRSTBIT_MSB; handle->Init.TIMode = SPI_TIMODE_DISABLED; init_spi(obj); }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; // determine the UART to use UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)uart != NC); obj->uart = (LPC_UART_TypeDef *)uart; // enable power switch (uart) { case UART_0: LPC_SC->PCONP |= 1 << 3; break; case UART_1: LPC_SC->PCONP |= 1 << 4; break; case UART_2: LPC_SC->PCONP |= 1 << 24; break; case UART_3: LPC_SC->PCONP |= 1 << 25; break; case UART_4: LPC_SC->PCONP |= 1 << 8; break; } // enable fifos and default rx trigger level obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled | 0 << 1 // Rx Fifo Reset | 0 << 2 // Tx Fifo Reset | 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars // disable irqs obj->uart->IER = 0 << 0 // Rx Data available irq enable | 0 << 1 // Tx Fifo empty irq enable | 0 << 2; // Rx Line Status irq enable // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } switch (uart) { case UART_0: obj->index = 0; break; case UART_1: obj->index = 1; break; case UART_2: obj->index = 2; break; case UART_3: obj->index = 3; break; case UART_4: obj->index = 4; break; } is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void analogin_init(analogin_t *obj, PinName pin) { static bool adc_hsi_inited = false; RCC_OscInitTypeDef RCC_OscInitStruct; uint32_t function = (uint32_t)NC; // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...) // are described in PinNames.h and PeripheralPins.c // Pin value must be between 0xF0 and 0xFF if ((pin < 0xF0) || (pin >= 0x100)) { // Normal channels // Get the peripheral name from the pin and assign it to the object obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC); // Get the functions (adc channel) from the pin and assign it to the object function = pinmap_function(pin, PinMap_ADC); // Configure GPIO pinmap_pinout(pin, PinMap_ADC); } else { // Internal channels obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal); function = pinmap_function(pin, PinMap_ADC_Internal); // No GPIO configuration for internal channels } MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC); MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); // Save pin number for the read function obj->pin = pin; // Configure ADC object structures obj->handle.State = HAL_ADC_STATE_RESET; obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; obj->handle.Init.Resolution = ADC_RESOLUTION_12B; obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example). obj->handle.Init.LowPowerAutoWait = ADC_AUTOWAIT_UNTIL_DATA_READ; // Enable the dynamic low power Auto Delay: new conversion start only when the previous conversion (for regular group) or previous sequence (for injected group) has been treated by user software. obj->handle.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_IDLE_PHASE; // Enable the auto-off mode: the ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered (with startup time between trigger and start of sampling). obj->handle.Init.ChannelsBank = ADC_CHANNELS_BANK_A; obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled obj->handle.Init.ExternalTrigConv = 0; // Not used obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; obj->handle.Init.DMAContinuousRequests = DISABLE; __HAL_RCC_ADC1_CLK_ENABLE(); if (HAL_ADC_Init(&obj->handle) != HAL_OK) { error("Cannot initialize ADC"); } // This section is done only once if (!adc_hsi_inited) { adc_hsi_inited = true; // Enable the HSI (to clock the ADC) RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; HAL_RCC_OscConfig(&RCC_OscInitStruct); } }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { SSP_InitTypeDef config; // Check pin parameters SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); obj->module = (SPIName)pinmap_merge(spi_data, spi_sclk); obj->module = (SPIName)pinmap_merge(spi_data, spi_cntl); MBED_ASSERT((int)obj->module!= NC); // Identify SPI module to use switch ((int)obj->module) { case SPI_0: obj->spi = TSB_SSP0; break; case SPI_1: obj->spi = TSB_SSP1; break; case SPI_2: obj->spi = TSB_SSP2; break; default: obj->spi= NULL; obj->module = (SPIName)NC; error("Cannot found SPI module corresponding with input pins."); break; } // pin out the spi pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); if (ssel != NC) { pinmap_pinout(ssel, PinMap_SPI_SSEL); } // Declare Config config.FrameFormat = SSP_FORMAT_SPI; // bit_rate = Fsys / (clk_prescale * (clk_rate + 1)) config.PreScale = 48; config.ClkRate = 0; config.ClkPolarity = SSP_POLARITY_LOW; config.ClkPhase = SSP_PHASE_FIRST_EDGE; config.DataSize = 0x08; obj->bits = config.DataSize; config.Mode = SSP_MASTER; SSP_Init(obj->spi, &config); // Disable all interrupt SSP_SetINTConfig(obj->spi, SSP_INTCFG_NONE); SSP_Enable(obj->spi); }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; // determine the UART to use UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)uart != NC); switch (uart) { case UART_0: obj->index = 0; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 12); break; case UART_1: obj->index = 1; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 20); LPC_SYSCON->PRESETCTRL |= (1 << 5); break; case UART_2: obj->index = 2; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 21); LPC_SYSCON->PRESETCTRL |= (1 << 6); break; case UART_3: obj->index = 3; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 22); LPC_SYSCON->PRESETCTRL |= (1 << 7); break; case UART_4: obj->index = 4; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 22); LPC_SYSCON->PRESETCTRL |= (1 << 8); break; } if (obj->index == 0) obj->uart = (LPC_USART0_Type *)uart; else obj->mini_uart = (LPC_USART4_Type *)uart; if (obj->index == 0) { // enable fifos and default rx trigger level obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled | 0 << 1 // Rx Fifo Clear | 0 << 2 // Tx Fifo Clear | 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars // disable irqs obj->uart->IER = 0 << 0 // Rx Data available irq enable | 0 << 1 // Tx Fifo empty irq enable | 0 << 2; // Rx Line Status irq enable } else { // Clear all status bits obj->mini_uart->STAT = (DELTACTS | DELTARXBRK); // Enable UART obj->mini_uart->CFG |= UART_EN; } // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart && (obj->index == 0)) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine the UART to use (UART_1, UART_2, ...) UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT(obj->uart != (UARTName)NC); // Enable USART clock if (obj->uart == UART_1) { __USART1_CLK_ENABLE(); obj->index = 0; } #if defined USART2_BASE if (obj->uart == UART_2) { __USART2_CLK_ENABLE(); obj->index = 1; } #endif #if defined USART3_BASE if (obj->uart == UART_3) { __USART3_CLK_ENABLE(); obj->index = 2; } #endif #if defined USART4_BASE if (obj->uart == UART_4) { __USART4_CLK_ENABLE(); obj->index = 3; } #endif #if defined USART5_BASE if (obj->uart == UART_5) { __USART5_CLK_ENABLE(); obj->index = 4; } #endif #if defined USART6_BASE if (obj->uart == UART_6) { __USART6_CLK_ENABLE(); obj->index = 5; } #endif #if defined USART7_BASE if (obj->uart == UART_7) { __USART7_CLK_ENABLE(); obj->index = 6; } #endif #if defined USART8_BASE if (obj->uart == UART_8) { __USART8_CLK_ENABLE(); obj->index = 7; } #endif // Configure the UART pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } // Configure UART obj->baudrate = 9600; obj->databits = UART_WORDLENGTH_8B; obj->stopbits = UART_STOPBITS_1; obj->parity = UART_PARITY_NONE; obj->pin_tx = tx; obj->pin_rx = rx; init_uart(obj); // For stdio management if (obj->uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { // determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel); #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) obj->spi = (LPC_SSP_TypeDef*)pinmap_merge(spi_data, spi_cntl); #elif defined(TARGET_LPC11U24) obj->spi = (LPC_SSPx_Type*)pinmap_merge(spi_data, spi_cntl); #else #error CPU undefined. #endif if ((int)obj->spi == NC) { error("SPI pinout mapping failed"); } // enable power and clocking #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) switch ((int)obj->spi) { case SPI_0: LPC_SC->PCONP |= 1 << 21; break; case SPI_1: LPC_SC->PCONP |= 1 << 10; break; } #elif defined(TARGET_LPC11U24) switch ((int)obj->spi) { case SPI_0: LPC_SYSCON->SYSAHBCLKCTRL |= 1 << 11; LPC_SYSCON->SSP0CLKDIV = 0x01; LPC_SYSCON->PRESETCTRL |= 1 << 0; break; case SPI_1: LPC_SYSCON->SYSAHBCLKCTRL |= 1 << 18; LPC_SYSCON->SSP1CLKDIV = 0x01; LPC_SYSCON->PRESETCTRL |= 1 << 2; break; } #else #error CPU undefined. #endif // set default format and frequency if (ssel == NC) { spi_format(obj, 8, 0, 0); // 8 bits, mode 0, master } else { spi_format(obj, 8, 0, 1); // 8 bits, mode 0, slave } spi_frequency(obj, 1000000); // enable the ssp channel obj->spi->CR1 |= 1 << 1; // pin out the spi pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); if (ssel != NC) { pinmap_pinout(ssel, PinMap_SPI_SSEL); } }