Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-src by
Revision 215:83cf97a28428, committed 2014-05-27
- Comitter:
- mbed_official
- Date:
- Tue May 27 08:30:06 2014 +0100
- Parent:
- 214:b6ec89a903fb
- Child:
- 216:577900467c9e
- Commit message:
- Synchronized with git revision a8b7f5df2cb5d7a76fda549a15b91fdaba6e2986
Full URL: https://github.com/mbedmicro/mbed/commit/a8b7f5df2cb5d7a76fda549a15b91fdaba6e2986/
[KLXX] Added RPC + RTOS support (KL05Z)
Changed in this revision
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/rtc_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/rtc_api.c Tue May 27 08:30:06 2014 +0100
@@ -87,7 +87,12 @@
}
void rtc_free(void) {
- RCC_DeInit(); // Resets the RCC clock configuration to the default reset state
+ // Disable RTC, LSE and LSI clocks
+ PWR_BackupAccessCmd(ENABLE); // Allow access to Backup Domain
+ RCC_RTCCLKCmd(DISABLE);
+ RCC_LSEConfig(RCC_LSE_OFF);
+ RCC_LSICmd(DISABLE);
+
rtc_inited = 0;
}
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/serial_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/serial_api.c Tue May 27 08:30:06 2014 +0100
@@ -95,12 +95,15 @@
// Enable USART clock
if (obj->uart == UART_1) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
+ obj->index = 0;
}
if (obj->uart == UART_2) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
+ obj->index = 1;
}
if (obj->uart == UART_3) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
+ obj->index = 2;
}
// Configure the UART pins
@@ -118,11 +121,6 @@
init_usart(obj);
- // The index is used by irq
- if (obj->uart == UART_1) obj->index = 0;
- if (obj->uart == UART_2) obj->index = 1;
- if (obj->uart == UART_3) obj->index = 2;
-
// For stdio management
if (obj->uart == STDIO_UART) {
stdio_uart_inited = 1;
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/i2c_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/i2c_api.c Tue May 27 08:30:06 2014 +0100
@@ -93,7 +93,7 @@
// I2C configuration
i2c_frequency(obj, 100000); // 100 kHz per default
-
+
// I2C master by default
obj->slave = 0;
}
@@ -111,11 +111,11 @@
I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
I2cHandle.Init.OwnAddress1 = 0;
I2cHandle.Init.OwnAddress2 = 0;
- HAL_I2C_Init(&I2cHandle);
- if(obj->slave) {
+ HAL_I2C_Init(&I2cHandle);
+ if (obj->slave) {
/* Enable Address Acknowledge */
I2cHandle.Instance->CR1 |= I2C_CR1_ACK;
- }
+ }
} else {
error("I2C error: frequency setting failed (max 400kHz).");
}
@@ -172,10 +172,10 @@
return 0;
}
}
-
- i2c->DR = __HAL_I2C_7BIT_ADD_READ(address);
-
-
+
+ i2c->DR = __HAL_I2C_7BIT_ADD_READ(address);
+
+
// Wait address is acknowledged
timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) {
@@ -222,9 +222,9 @@
return 0;
}
}
-
+
i2c->DR = __HAL_I2C_7BIT_ADD_WRITE(address);
-
+
// Wait address is acknowledged
timeout = FLAG_TIMEOUT;
@@ -235,7 +235,7 @@
}
}
__HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle);
-
+
for (count = 0; count < length; count++) {
if (i2c_byte_write(obj, data[count]) != 1) {
i2c_stop(obj);
@@ -283,7 +283,7 @@
// Wait until the byte is transmitted
timeout = FLAG_TIMEOUT;
while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXE) == RESET) &&
- (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == RESET)) {
+ (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == RESET)) {
if ((timeout--) == 0) {
return 0;
}
@@ -325,7 +325,7 @@
void i2c_slave_mode(i2c_t *obj, int enable_slave) {
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
- if(enable_slave) {
+ if (enable_slave) {
obj->slave = 1;
/* Enable Address Acknowledge */
I2cHandle.Instance->CR1 |= I2C_CR1_ACK;
@@ -340,19 +340,19 @@
int i2c_slave_receive(i2c_t *obj) {
int retValue = NoData;
-
- if(__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == 1) {
- if(__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == 1) {
- if(__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TRA) == 1)
- retValue = ReadAddressed;
+
+ if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == 1) {
+ if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == 1) {
+ if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TRA) == 1)
+ retValue = ReadAddressed;
else
- retValue = WriteAddressed;
-
+ retValue = WriteAddressed;
+
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_ADDR);
- }
+ }
}
-
- return(retValue);
+
+ return (retValue);
}
int i2c_slave_read(i2c_t *obj, char *data, int length) {
@@ -362,8 +362,7 @@
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
- while(length > 0)
- {
+ while (length > 0) {
/* Wait until RXNE flag is set */
// Wait until the byte is received
Timeout = FLAG_TIMEOUT;
@@ -372,14 +371,14 @@
if (Timeout == 0) {
return 0;
}
- }
+ }
/* Read data from DR */
(*data++) = I2cHandle.Instance->DR;
length--;
size++;
- if((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == SET) && (length != 0)){
+ if ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == SET) && (length != 0)) {
/* Read data from DR */
(*data++) = I2cHandle.Instance->DR;
length--;
@@ -394,8 +393,8 @@
if (Timeout == 0) {
return 0;
}
- }
-
+ }
+
/* Clear STOP flag */
__HAL_I2C_CLEAR_STOPFLAG(&I2cHandle);
@@ -418,8 +417,7 @@
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
- while(length > 0)
- {
+ while (length > 0) {
/* Wait until TXE flag is set */
Timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXE) == RESET) {
@@ -427,23 +425,22 @@
if (Timeout == 0) {
return 0;
}
- }
+ }
-
- /* Write data to DR */
- I2cHandle.Instance->DR = (*data++);
- length--;
- size++;
- if((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == SET) && (length != 0))
- {
/* Write data to DR */
I2cHandle.Instance->DR = (*data++);
length--;
size++;
- }
+
+ if ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == SET) && (length != 0)) {
+ /* Write data to DR */
+ I2cHandle.Instance->DR = (*data++);
+ length--;
+ size++;
+ }
}
-
+
/* Wait until AF flag is set */
Timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_AF) == RESET) {
@@ -451,9 +448,9 @@
if (Timeout == 0) {
return 0;
}
- }
+ }
-
+
/* Clear AF flag */
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_AF);
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/objects.h Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/objects.h Tue May 27 08:30:06 2014 +0100
@@ -66,6 +66,8 @@
uint32_t databits;
uint32_t stopbits;
uint32_t parity;
+ PinName pin_tx;
+ PinName pin_rx;
};
struct spi_s {
@@ -76,6 +78,10 @@
uint32_t mode;
uint32_t nss;
uint32_t br_presc;
+ PinName pin_miso;
+ PinName pin_mosi;
+ PinName pin_sclk;
+ PinName pin_ssel;
};
struct i2c_s {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/serial_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/serial_api.c Tue May 27 08:30:06 2014 +0100
@@ -93,12 +93,15 @@
// Enable USART clock
if (obj->uart == UART_1) {
__USART1_CLK_ENABLE();
+ obj->index = 0;
}
if (obj->uart == UART_2) {
__USART2_CLK_ENABLE();
+ obj->index = 1;
}
if (obj->uart == UART_6) {
__USART6_CLK_ENABLE();
+ obj->index = 2;
}
// Configure the UART pins
@@ -113,12 +116,10 @@
obj->stopbits = UART_STOPBITS_1;
obj->parity = UART_PARITY_NONE;
- init_uart(obj);
+ obj->pin_tx = tx;
+ obj->pin_rx = rx;
- // The index is used by irq
- if (obj->uart == UART_1) obj->index = 0;
- if (obj->uart == UART_2) obj->index = 1;
- if (obj->uart == UART_6) obj->index = 2;
+ init_uart(obj);
// For stdio management
if (obj->uart == STDIO_UART) {
@@ -129,6 +130,27 @@
}
void serial_free(serial_t *obj) {
+ // Reset UART and disable clock
+ if (obj->uart == UART_1) {
+ __USART1_FORCE_RESET();
+ __USART1_RELEASE_RESET();
+ __USART1_CLK_DISABLE();
+ }
+ if (obj->uart == UART_2) {
+ __USART2_FORCE_RESET();
+ __USART2_RELEASE_RESET();
+ __USART2_CLK_DISABLE();
+ }
+ if (obj->uart == UART_6) {
+ __USART6_FORCE_RESET();
+ __USART6_RELEASE_RESET();
+ __USART6_CLK_DISABLE();
+ }
+
+ // Configure GPIOs
+ pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+ pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+
serial_irq_ids[obj->index] = 0;
}
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/spi_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/spi_api.c Tue May 27 08:30:06 2014 +0100
@@ -138,6 +138,11 @@
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) { // SW NSS Master mode
obj->mode = SPI_MODE_MASTER;
obj->nss = SPI_NSS_SOFT;
@@ -151,8 +156,30 @@
}
void spi_free(spi_t *obj) {
- SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
- HAL_SPI_DeInit(&SpiHandle);
+ // Reset SPI and disable clock
+ if (obj->spi == SPI_1) {
+ __SPI1_FORCE_RESET();
+ __SPI1_RELEASE_RESET();
+ __SPI1_CLK_DISABLE();
+ }
+
+ if (obj->spi == SPI_2) {
+ __SPI2_FORCE_RESET();
+ __SPI2_RELEASE_RESET();
+ __SPI2_CLK_DISABLE();
+ }
+
+ if (obj->spi == SPI_3) {
+ __SPI3_FORCE_RESET();
+ __SPI3_RELEASE_RESET();
+ __SPI3_CLK_DISABLE();
+ }
+
+ // Configure GPIOs
+ pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+ pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+ pin_function(obj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+ pin_function(obj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
}
void spi_format(spi_t *obj, int bits, int mode, int slave) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/analogout_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/analogout_api.c Tue May 27 08:30:06 2014 +0100
@@ -54,8 +54,8 @@
// Configure GPIO
pinmap_pinout(pin, PinMap_DAC);
- // Save the channel for the write and read functions
- obj->channel = pin;
+ // Save the pin for future use
+ obj->pin = pin;
// Enable DAC clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
@@ -66,11 +66,11 @@
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
- if (obj->channel == PA_4) {
+ if (obj->pin == PA_4) {
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_1, ENABLE);
}
- if (obj->channel == PA_5) {
+ if (obj->pin == PA_5) {
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_2, ENABLE);
}
@@ -79,22 +79,24 @@
}
void analogout_free(dac_t *obj) {
+ // Configure GPIOs
+ pin_function(obj->pin, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
}
static inline void dac_write(dac_t *obj, uint16_t value) {
- if (obj->channel == PA_4) {
+ if (obj->pin == PA_4) {
DAC_SetChannel1Data(DAC_Align_12b_R, value);
}
- if (obj->channel == PA_5) {
+ if (obj->pin == PA_5) {
DAC_SetChannel2Data(DAC_Align_12b_R, value);
}
}
static inline int dac_read(dac_t *obj) {
- if (obj->channel == PA_4) {
+ if (obj->pin == PA_4) {
return (int)DAC_GetDataOutputValue(DAC_Channel_1);
}
- if (obj->channel == PA_5) {
+ if (obj->pin == PA_5) {
return (int)DAC_GetDataOutputValue(DAC_Channel_2);
}
return 0;
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c Tue May 27 08:30:06 2014 +0100
@@ -317,10 +317,9 @@
uint32_t event;
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
- event = I2C_GetLastEvent( i2c );
- if(event != 0)
- {
- switch(event){
+ event = I2C_GetLastEvent(i2c);
+ if (event != 0) {
+ switch (event) {
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
retValue = WriteAddressed;
break;
@@ -335,22 +334,22 @@
break;
}
- // clear ADDR
- if((retValue == WriteAddressed) || (retValue == ReadAddressed)){
+ // clear ADDR
+ if ((retValue == WriteAddressed) || (retValue == ReadAddressed)) {
i2c->SR1;// read status register 1
i2c->SR2;// read status register 2
}
// clear stopf
- if(I2C_GetFlagStatus(i2c, I2C_FLAG_STOPF) == SET) {
+ if (I2C_GetFlagStatus(i2c, I2C_FLAG_STOPF) == SET) {
i2c->SR1;// read status register 1
- I2C_Cmd(i2c, ENABLE);
+ I2C_Cmd(i2c, ENABLE);
}
// clear AF
- if(I2C_GetFlagStatus(i2c, I2C_FLAG_AF) == SET) {
+ if (I2C_GetFlagStatus(i2c, I2C_FLAG_AF) == SET) {
I2C_ClearFlag(i2c, I2C_FLAG_AF);
- }
+ }
}
- return(retValue);
+ return (retValue);
}
int i2c_slave_read(i2c_t *obj, char *data, int length) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/objects.h Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/objects.h Tue May 27 08:30:06 2014 +0100
@@ -60,7 +60,7 @@
struct dac_s {
DACName dac;
- PinName channel;
+ PinName pin;
};
struct serial_s {
@@ -70,6 +70,8 @@
uint32_t databits;
uint32_t stopbits;
uint32_t parity;
+ PinName pin_tx;
+ PinName pin_rx;
};
struct spi_s {
@@ -80,6 +82,10 @@
uint32_t mode;
uint32_t nss;
uint32_t br_presc;
+ PinName pin_miso;
+ PinName pin_mosi;
+ PinName pin_sclk;
+ PinName pin_ssel;
};
struct i2c_s {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/pwmout_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/pwmout_api.c Tue May 27 08:30:06 2014 +0100
@@ -102,8 +102,8 @@
}
void pwmout_free(pwmout_t* obj) {
- TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
- TIM_DeInit(tim);
+ // Configure GPIOs
+ pin_function(obj->pin, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
}
void pwmout_write(pwmout_t* obj, float value) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/serial_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/serial_api.c Tue May 27 08:30:06 2014 +0100
@@ -99,18 +99,23 @@
// Enable USART clock
if (obj->uart == UART_1) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
+ obj->index = 0;
}
if (obj->uart == UART_2) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
+ obj->index = 1;
}
if (obj->uart == UART_3) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
+ obj->index = 2;
}
if (obj->uart == UART_4) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
+ obj->index = 3;
}
if (obj->uart == UART_5) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
+ obj->index = 4;
}
// Configure the UART pins
@@ -125,14 +130,10 @@
obj->stopbits = USART_StopBits_1;
obj->parity = USART_Parity_No;
- init_usart(obj);
+ obj->pin_tx = tx;
+ obj->pin_rx = rx;
- // The index is used by irq
- if (obj->uart == UART_1) obj->index = 0;
- if (obj->uart == UART_2) obj->index = 1;
- if (obj->uart == UART_3) obj->index = 2;
- if (obj->uart == UART_4) obj->index = 3;
- if (obj->uart == UART_5) obj->index = 4;
+ init_usart(obj);
// For stdio management
if (obj->uart == STDIO_UART) {
@@ -142,6 +143,37 @@
}
void serial_free(serial_t *obj) {
+ // Reset UART and disable clock
+ if (obj->uart == UART_1) {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
+ }
+ if (obj->uart == UART_2) {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE);
+ }
+ if (obj->uart == UART_3) {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE);
+ }
+ if (obj->uart == UART_4) {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, DISABLE);
+ }
+ if (obj->uart == UART_5) {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, DISABLE);
+ }
+
+ // Configure GPIOs
+ pin_function(obj->pin_tx, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
+ pin_function(obj->pin_rx, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
+
serial_irq_ids[obj->index] = 0;
}
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/spi_api.c Tue May 27 08:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/spi_api.c Tue May 27 08:30:06 2014 +0100
@@ -132,6 +132,11 @@
obj->cpha = SPI_CPHA_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) { // Master
obj->mode = SPI_Mode_Master;
obj->nss = SPI_NSS_Soft;
@@ -145,8 +150,30 @@
}
void spi_free(spi_t *obj) {
- SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
- SPI_I2S_DeInit(spi);
+ // Reset SPI and disable clock
+ if (obj->spi == SPI_1) {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);
+ }
+
+ if (obj->spi == SPI_2) {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, DISABLE);
+ }
+
+ if (obj->spi == SPI_3) {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, DISABLE);
+ }
+
+ // Configure GPIOs
+ pin_function(obj->pin_miso, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
+ pin_function(obj->pin_mosi, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
+ pin_function(obj->pin_sclk, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
+ pin_function(obj->pin_ssel, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
}
void spi_format(spi_t *obj, int bits, int mode, int slave) {
