Merge pull request #701 from bcostm/master

Targets: NUCLEOs - Align hal files
pull/672/merge
Martin Kojtal 2014-11-14 02:13:22 -08:00
commit c4901dbb33
26 changed files with 110 additions and 86 deletions

View File

@ -36,12 +36,11 @@
extern "C" { extern "C" {
#endif #endif
// See stm32f0xx_hal_gpio.h and stm32f0xx_hal_gpio_ex.h for values of MODE, PUPD and AFNUM
#define STM_PIN_DATA(MODE, PUPD, AFNUM) ((int)(((AFNUM) << 7) | ((PUPD) << 4) | ((MODE) << 0))) #define STM_PIN_DATA(MODE, PUPD, AFNUM) ((int)(((AFNUM) << 7) | ((PUPD) << 4) | ((MODE) << 0)))
#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) #define STM_PIN_MODE(X) (((X) >> 0) & 0x0F)
#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) #define STM_PIN_PUPD(X) (((X) >> 4) & 0x07)
#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) #define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F)
#define STM_MODE_INPUT (0) #define STM_MODE_INPUT (0)
#define STM_MODE_OUTPUT_PP (1) #define STM_MODE_OUTPUT_PP (1)
#define STM_MODE_OUTPUT_OD (2) #define STM_MODE_OUTPUT_OD (2)

View File

@ -63,7 +63,7 @@
#define DEVICE_STDIO_MESSAGES 1 #define DEVICE_STDIO_MESSAGES 1
//#define DEVICE_ERROR_RED 0 #define DEVICE_ERROR_RED 0
#include "objects.h" #include "objects.h"

View File

@ -80,6 +80,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
pin_mode(sda, OpenDrain); pin_mode(sda, OpenDrain);
pin_mode(scl, OpenDrain); pin_mode(scl, OpenDrain);
} }
// Enable I2C2 clock and pinout if not done // Enable I2C2 clock and pinout if not done
if ((obj->i2c == I2C_2) && !i2c2_inited) { if ((obj->i2c == I2C_2) && !i2c2_inited) {
i2c2_inited = 1; i2c2_inited = 1;
@ -176,7 +177,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
int count; int count;
int value; int value;
/* update CR2 register */ // Update CR2 register
i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP))) i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
| (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ); | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ);
@ -199,7 +200,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
// If not repeated start, send stop. // If not repeated start, send stop.
if (stop) { if (stop) {
i2c_stop(obj); i2c_stop(obj);
/* Wait until STOPF flag is set */ // Wait until STOPF flag is set
timeout = FLAG_TIMEOUT; timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) { while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
timeout--; timeout--;
@ -207,7 +208,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
return -1; return -1;
} }
} }
/* Clear STOP Flag */ // Clear STOP Flag
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF); __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF);
} }
@ -221,12 +222,10 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
int timeout; int timeout;
int count; int count;
/* update CR2 register */ // Update CR2 register
i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP))) i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
| (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE); | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE);
for (count = 0; count < length; count++) { for (count = 0; count < length; count++) {
i2c_byte_write(obj, data[count]); i2c_byte_write(obj, data[count]);
} }
@ -241,10 +240,10 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
} }
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC); __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC);
// If not repeated start, send stop. // If not repeated start, send stop
if (stop) { if (stop) {
i2c_stop(obj); i2c_stop(obj);
/* Wait until STOPF flag is set */ // Wait until STOPF flag is set
timeout = FLAG_TIMEOUT; timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) { while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
timeout--; timeout--;
@ -252,7 +251,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
return -1; return -1;
} }
} }
/* Clear STOP Flag */ // Clear STOP Flag
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF); __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF);
} }
@ -297,7 +296,7 @@ void i2c_reset(i2c_t *obj)
{ {
int timeout; int timeout;
// wait before reset // Wait before reset
timeout = LONG_TIMEOUT; timeout = LONG_TIMEOUT;
while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0)); while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
@ -334,7 +333,6 @@ void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
void i2c_slave_mode(i2c_t *obj, int enable_slave) void i2c_slave_mode(i2c_t *obj, int enable_slave)
{ {
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
uint16_t tmpreg; uint16_t tmpreg;
@ -350,7 +348,6 @@ void i2c_slave_mode(i2c_t *obj, int enable_slave)
// Set new mode // Set new mode
i2c->OAR1 = tmpreg; i2c->OAR1 = tmpreg;
} }
// See I2CSlave.h // See I2CSlave.h

View File

@ -36,9 +36,6 @@
#include "mbed_error.h" #include "mbed_error.h"
// TIM1 cannot be used because already used by the us_ticker // TIM1 cannot be used because already used by the us_ticker
// Uncomment/comment line above to use an alternate timer,
// If the channel is not the same,
// Please don't forget to uncomment/comment in the pwmout_write() function also
static const PinMap PinMap_PWM[] = { static const PinMap PinMap_PWM[] = {
{PA_4, PWM_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM14)}, // TIM14_CH1 {PA_4, PWM_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM14)}, // TIM14_CH1
{PA_6, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3)}, // TIM3_CH1 {PA_6, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3)}, // TIM3_CH1
@ -128,7 +125,6 @@ void pwmout_write(pwmout_t* obj, float value)
// Channels 1 // Channels 1
case PA_4: case PA_4:
case PA_6: case PA_6:
// case PA_7:
case PB_1: case PB_1:
case PB_4: case PB_4:
case PB_8: case PB_8:
@ -140,7 +136,6 @@ void pwmout_write(pwmout_t* obj, float value)
// Channels 1N // Channels 1N
case PB_6: case PB_6:
case PB_7: case PB_7:
// case PB_15:
channel = TIM_CHANNEL_1; channel = TIM_CHANNEL_1;
complementary_channel = 1; complementary_channel = 1;
break; break;
@ -157,7 +152,6 @@ void pwmout_write(pwmout_t* obj, float value)
channel = TIM_CHANNEL_3; channel = TIM_CHANNEL_3;
break; break;
// Channels 4 // Channels 4
// case PB_1:
case PC_9: case PC_9:
channel = TIM_CHANNEL_4; channel = TIM_CHANNEL_4;
break; break;

View File

@ -59,8 +59,8 @@ void rtc_init(void)
// Enable LSE Oscillator // Enable LSE Oscillator
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* Mandatory, otherwise the PLL is reconfigured! */ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct.LSEState = RCC_LSE_ON; /* External 32.768 kHz clock on OSC_IN/OSC_OUT */ RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
// Connect LSE to RTC // Connect LSE to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
@ -76,8 +76,8 @@ void rtc_init(void)
} }
// Connect LSI to RTC // Connect LSI to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
// [TODO] This value is LSI typical value. To be measured precisely using a timer input capture. // This value is LSI typical value. To be measured precisely using a timer input capture for example.
rtc_freq = 32000; rtc_freq = LSI_VALUE;
} }
// Enable RTC // Enable RTC

View File

@ -102,6 +102,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
__USART1_CLK_ENABLE(); __USART1_CLK_ENABLE();
obj->index = 0; obj->index = 0;
} }
if (obj->uart == UART_2) { if (obj->uart == UART_2) {
__USART2_CLK_ENABLE(); __USART2_CLK_ENABLE();
obj->index = 1; obj->index = 1;
@ -110,8 +111,12 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
// Configure the UART pins // Configure the UART pins
pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(tx, PinMap_UART_TX);
pinmap_pinout(rx, PinMap_UART_RX); pinmap_pinout(rx, PinMap_UART_RX);
if (tx != NC) {
pin_mode(tx, PullUp); pin_mode(tx, PullUp);
}
if (rx != NC) {
pin_mode(rx, PullUp); pin_mode(rx, PullUp);
}
// Configure UART // Configure UART
obj->baudrate = 9600; obj->baudrate = 9600;
@ -139,6 +144,7 @@ void serial_free(serial_t *obj)
__USART1_RELEASE_RESET(); __USART1_RELEASE_RESET();
__USART1_CLK_DISABLE(); __USART1_CLK_DISABLE();
} }
if (obj->uart == UART_2) { if (obj->uart == UART_2) {
__USART2_FORCE_RESET(); __USART2_FORCE_RESET();
__USART2_RELEASE_RESET(); __USART2_RELEASE_RESET();

View File

@ -154,7 +154,7 @@ void spi_free(spi_t *obj)
__SPI2_CLK_DISABLE(); __SPI2_CLK_DISABLE();
} }
// Configure GPIO // Configure GPIOs
pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); 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_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_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
@ -220,6 +220,7 @@ void spi_frequency(spi_t *obj, int hz)
} else { // >= 24000000 } else { // >= 24000000
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz
} }
init_spi(obj); init_spi(obj);
} }
@ -245,13 +246,12 @@ static inline void ssp_write(spi_t *obj, int value)
{ {
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
while (!ssp_writeable(obj)); while (!ssp_writeable(obj));
if (obj->bits == SPI_DATASIZE_8BIT) {
if (obj->bits <= SPI_DATASIZE_8BIT) { // Force 8-bit access to the data register
// force 8-bit access the data register due to SPI data buffer in this device
uint8_t *p_spi_dr = 0; uint8_t *p_spi_dr = 0;
p_spi_dr = (uint8_t *) & (spi->DR); p_spi_dr = (uint8_t *) & (spi->DR);
*p_spi_dr = (uint8_t)value; *p_spi_dr = (uint8_t)value;
} else { } else { // SPI_DATASIZE_16BIT
spi->DR = (uint16_t)value; spi->DR = (uint16_t)value;
} }
} }
@ -260,9 +260,8 @@ static inline int ssp_read(spi_t *obj)
{ {
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
while (!ssp_readable(obj)); while (!ssp_readable(obj));
if (obj->bits == SPI_DATASIZE_8BIT) {
if (obj->bits <= SPI_DATASIZE_8BIT) { // Force 8-bit access to the data register
// force 8-bit access the data register due to SPI data buffer in this device
uint8_t *p_spi_dr = 0; uint8_t *p_spi_dr = 0;
p_spi_dr = (uint8_t *) & (spi->DR); p_spi_dr = (uint8_t *) & (spi->DR);
return (int)(*p_spi_dr); return (int)(*p_spi_dr);
@ -294,15 +293,29 @@ int spi_slave_read(spi_t *obj)
{ {
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
while (!ssp_readable(obj)); while (!ssp_readable(obj));
if (obj->bits == SPI_DATASIZE_8BIT) {
// Force 8-bit access to the data register
uint8_t *p_spi_dr = 0;
p_spi_dr = (uint8_t *) & (spi->DR);
return (int)(*p_spi_dr);
} else {
return (int)spi->DR; return (int)spi->DR;
} }
}
void spi_slave_write(spi_t *obj, int value) void spi_slave_write(spi_t *obj, int value)
{ {
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
while (!ssp_writeable(obj)); while (!ssp_writeable(obj));
if (obj->bits == SPI_DATASIZE_8BIT) {
// Force 8-bit access to the data register
uint8_t *p_spi_dr = 0;
p_spi_dr = (uint8_t *) & (spi->DR);
*p_spi_dr = (uint8_t)value;
} else { // SPI_DATASIZE_16BIT
spi->DR = (uint16_t)value; spi->DR = (uint16_t)value;
} }
}
int spi_busy(spi_t *obj) int spi_busy(spi_t *obj)
{ {

View File

@ -82,6 +82,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
pin_mode(sda, OpenDrain); pin_mode(sda, OpenDrain);
pin_mode(scl, OpenDrain); pin_mode(scl, OpenDrain);
} }
// Enable I2C2 clock and pinout if not done // Enable I2C2 clock and pinout if not done
if ((obj->i2c == I2C_2) && !i2c2_inited) { if ((obj->i2c == I2C_2) && !i2c2_inited) {
i2c2_inited = 1; i2c2_inited = 1;
@ -178,7 +179,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
int count; int count;
int value; int value;
/* update CR2 register */ // Update CR2 register
i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP))) i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
| (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ); | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ);
@ -201,7 +202,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
// If not repeated start, send stop. // If not repeated start, send stop.
if (stop) { if (stop) {
i2c_stop(obj); i2c_stop(obj);
/* Wait until STOPF flag is set */ // Wait until STOPF flag is set
timeout = FLAG_TIMEOUT; timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) { while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
timeout--; timeout--;
@ -209,7 +210,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
return -1; return -1;
} }
} }
/* Clear STOP Flag */ // Clear STOP Flag
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF); __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF);
} }
@ -223,12 +224,10 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
int timeout; int timeout;
int count; int count;
/* update CR2 register */ // Update CR2 register
i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP))) i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
| (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE); | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE);
for (count = 0; count < length; count++) { for (count = 0; count < length; count++) {
i2c_byte_write(obj, data[count]); i2c_byte_write(obj, data[count]);
} }
@ -243,10 +242,10 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
} }
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC); __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC);
// If not repeated start, send stop. // If not repeated start, send stop
if (stop) { if (stop) {
i2c_stop(obj); i2c_stop(obj);
/* Wait until STOPF flag is set */ // Wait until STOPF flag is set
timeout = FLAG_TIMEOUT; timeout = FLAG_TIMEOUT;
while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) { while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
timeout--; timeout--;
@ -254,7 +253,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
return -1; return -1;
} }
} }
/* Clear STOP Flag */ // Clear STOP Flag
__HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF); __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_STOPF);
} }
@ -299,7 +298,7 @@ void i2c_reset(i2c_t *obj)
{ {
int timeout; int timeout;
// wait before reset // Wait before reset
timeout = LONG_TIMEOUT; timeout = LONG_TIMEOUT;
while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0)); while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
@ -336,7 +335,6 @@ void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
void i2c_slave_mode(i2c_t *obj, int enable_slave) void i2c_slave_mode(i2c_t *obj, int enable_slave)
{ {
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
uint16_t tmpreg; uint16_t tmpreg;
@ -352,7 +350,6 @@ void i2c_slave_mode(i2c_t *obj, int enable_slave)
// Set new mode // Set new mode
i2c->OAR1 = tmpreg; i2c->OAR1 = tmpreg;
} }
// See I2CSlave.h // See I2CSlave.h

View File

@ -59,8 +59,8 @@ void rtc_init(void)
// Enable LSE Oscillator // Enable LSE Oscillator
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* Mandatory, otherwise the PLL is reconfigured! */ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct.LSEState = RCC_LSE_ON; /* External 32.768 kHz clock on OSC_IN/OSC_OUT */ RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
// Connect LSE to RTC // Connect LSE to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
@ -76,8 +76,8 @@ void rtc_init(void)
} }
// Connect LSI to RTC // Connect LSI to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
// [TODO] This value is LSI typical value. To be measured precisely using a timer input capture. // This value is LSI typical value. To be measured precisely using a timer input capture for example.
rtc_freq = 32000; rtc_freq = LSI_VALUE;
} }
// Enable RTC // Enable RTC

View File

@ -113,6 +113,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
__USART1_CLK_ENABLE(); __USART1_CLK_ENABLE();
obj->index = 0; obj->index = 0;
} }
if (obj->uart == UART_2) { if (obj->uart == UART_2) {
__USART2_CLK_ENABLE(); __USART2_CLK_ENABLE();
obj->index = 1; obj->index = 1;
@ -122,6 +123,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
__USART3_CLK_ENABLE(); __USART3_CLK_ENABLE();
obj->index = 2; obj->index = 2;
} }
if (obj->uart == UART_4) { if (obj->uart == UART_4) {
__USART4_CLK_ENABLE(); __USART4_CLK_ENABLE();
obj->index = 3; obj->index = 3;
@ -163,16 +165,19 @@ void serial_free(serial_t *obj)
__USART1_RELEASE_RESET(); __USART1_RELEASE_RESET();
__USART1_CLK_DISABLE(); __USART1_CLK_DISABLE();
} }
if (obj->uart == UART_2) { if (obj->uart == UART_2) {
__USART2_FORCE_RESET(); __USART2_FORCE_RESET();
__USART2_RELEASE_RESET(); __USART2_RELEASE_RESET();
__USART2_CLK_DISABLE(); __USART2_CLK_DISABLE();
} }
if (obj->uart == UART_3) { if (obj->uart == UART_3) {
__USART3_FORCE_RESET(); __USART3_FORCE_RESET();
__USART3_RELEASE_RESET(); __USART3_RELEASE_RESET();
__USART3_CLK_DISABLE(); __USART3_CLK_DISABLE();
} }
if (obj->uart == UART_4) { if (obj->uart == UART_4) {
__USART4_FORCE_RESET(); __USART4_FORCE_RESET();
__USART4_RELEASE_RESET(); __USART4_RELEASE_RESET();

View File

@ -158,7 +158,7 @@ void spi_free(spi_t *obj)
__SPI2_CLK_DISABLE(); __SPI2_CLK_DISABLE();
} }
// Configure GPIO // Configure GPIOs
pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); 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_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_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
@ -224,6 +224,7 @@ void spi_frequency(spi_t *obj, int hz)
} else { // >= 24000000 } else { // >= 24000000
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz
} }
init_spi(obj); init_spi(obj);
} }

View File

@ -51,7 +51,7 @@ void us_ticker_init(void)
// Configure time base // Configure time base
TimMasterHandle.Instance = TIM_MST; TimMasterHandle.Instance = TIM_MST;
TimMasterHandle.Init.Period = 0xFFFFFFFF; TimMasterHandle.Init.Period = 0xFFFFFFFF;
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 <EFBFBD>s tick TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
TimMasterHandle.Init.ClockDivision = 0; TimMasterHandle.Init.ClockDivision = 0;
TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimMasterHandle.Init.RepetitionCounter = 0; TimMasterHandle.Init.RepetitionCounter = 0;

View File

@ -36,12 +36,11 @@
extern "C" { extern "C" {
#endif #endif
// See stm32f0xx_hal_gpio.h and stm32f0xx_hal_gpio_ex.h for values of MODE, PUPD and AFNUM
#define STM_PIN_DATA(MODE, PUPD, AFNUM) ((int)(((AFNUM) << 7) | ((PUPD) << 4) | ((MODE) << 0))) #define STM_PIN_DATA(MODE, PUPD, AFNUM) ((int)(((AFNUM) << 7) | ((PUPD) << 4) | ((MODE) << 0)))
#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) #define STM_PIN_MODE(X) (((X) >> 0) & 0x0F)
#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) #define STM_PIN_PUPD(X) (((X) >> 4) & 0x07)
#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) #define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F)
#define STM_MODE_INPUT (0) #define STM_MODE_INPUT (0)
#define STM_MODE_OUTPUT_PP (1) #define STM_MODE_OUTPUT_PP (1)
#define STM_MODE_OUTPUT_OD (2) #define STM_MODE_OUTPUT_OD (2)

View File

@ -44,8 +44,8 @@ static const PinMap PinMap_PWM[] = {
{PA_3, PWM_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM15)}, // TIM15_CH2 {PA_3, PWM_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM15)}, // TIM15_CH2
// {PA_5, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH1 // {PA_5, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH1
{PA_6, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1 {PA_6, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1
{PA_7, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17)}, // TIM17_CH1 {PA_7, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17)}, // TIM17_CH1 - ARDUINO
// {PA_7, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH1N // {PA_7, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH1N - ARDUINO
{PA_8, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH1 {PA_8, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH1
{PA_9, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH2 {PA_9, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH2
// {PA_9, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_TIM2)}, // TIM2_CH3 // {PA_9, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_TIM2)}, // TIM2_CH3
@ -60,14 +60,14 @@ static const PinMap PinMap_PWM[] = {
{PB_0, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH2N {PB_0, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH2N
{PB_1, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH3N {PB_1, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH3N
// {PB_3, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH2 // {PB_3, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH2 - ARDUINO --> USED BY TIMER
{PB_4, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1 {PB_4, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1 - ARDUINO
{PB_5, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_TIM17)},// TIM17_CH1 {PB_5, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_TIM17)},// TIM17_CH1
{PB_6, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1N {PB_6, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1N - ARDUINO
{PB_7, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17)}, // TIM17_CH1N {PB_7, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17)}, // TIM17_CH1N
{PB_8, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1 {PB_8, PWM_16, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM16)}, // TIM16_CH1
{PB_9, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17)}, // TIM17_CH1 {PB_9, PWM_17, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM17)}, // TIM17_CH1
// {PB_10, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH3 // {PB_10, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH3 - ARDUINO --> USED BY TIMER
// {PB_11, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH4 // {PB_11, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH4
{PB_13, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH1N {PB_13, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_TIM1)}, // TIM1_CH1N
{PB_14, PWM_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM15)}, // TIM15_CH1 {PB_14, PWM_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM15)}, // TIM15_CH1

View File

@ -111,6 +111,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
if (obj->spi == SPI_2) { if (obj->spi == SPI_2) {
__SPI2_CLK_ENABLE(); __SPI2_CLK_ENABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_CLK_ENABLE(); __SPI3_CLK_ENABLE();
} }
@ -151,6 +152,7 @@ void spi_free(spi_t *obj)
__SPI2_RELEASE_RESET(); __SPI2_RELEASE_RESET();
__SPI2_CLK_DISABLE(); __SPI2_CLK_DISABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_FORCE_RESET(); __SPI3_FORCE_RESET();
__SPI3_RELEASE_RESET(); __SPI3_RELEASE_RESET();

View File

@ -35,16 +35,16 @@
#include "pinmap.h" #include "pinmap.h"
static const PinMap PinMap_ADC[] = { static const PinMap PinMap_ADC[] = {
{PA_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN1 - ARDUINO {PA_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN1 - ARDUINO A0
{PA_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN2 - ARDUINO {PA_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN2 - ARDUINO A1
{PA_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN3 {PA_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN3
{PA_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN4 {PA_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN4
{PA_4, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN1 - ARDUINO {PA_4, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN1 - ARDUINO A2
{PA_5, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN2 {PA_5, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN2
{PA_6, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN3 {PA_6, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN3
{PA_7, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN4 {PA_7, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN4
{PB_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN11 - ARDUINO {PB_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN11 - ARDUINO A3
{PB_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN12 {PB_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN12
{PB_2, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN12 {PB_2, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN12
{PB_12, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN13 {PB_12, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN13
@ -52,8 +52,8 @@ static const PinMap PinMap_ADC[] = {
{PB_14, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN14 {PB_14, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN14
{PB_15, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN15 {PB_15, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN15
{PC_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN6 - ARDUINO {PC_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN6 - ARDUINO A5
{PC_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN7 - ARDUINO {PC_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN7 - ARDUINO A4
{PC_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN8 {PC_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN8
{PC_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN9 {PC_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN9
{PC_4, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN5 {PC_4, ADC_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC2_IN5

View File

@ -67,6 +67,7 @@ void analogout_init(dac_t *obj, PinName pin)
if (obj->dac == DAC_1) { if (obj->dac == DAC_1) {
__DAC1_CLK_ENABLE(); __DAC1_CLK_ENABLE();
} }
if (obj->dac == DAC_2) { if (obj->dac == DAC_2) {
__DAC2_CLK_ENABLE(); __DAC2_CLK_ENABLE();
} }

View File

@ -68,7 +68,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl); obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
MBED_ASSERT(obj->i2c != (I2CName)NC); MBED_ASSERT(obj->i2c != (I2CName)NC);
// Enable I2C1 clock and pinout if not done // Enable I2C clock and pinout if not done
if ((obj->i2c == I2C_1) && !i2c1_inited) { if ((obj->i2c == I2C_1) && !i2c1_inited) {
i2c1_inited = 1; i2c1_inited = 1;
__HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK); __HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK);

View File

@ -111,7 +111,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
obj->bits = SPI_DATASIZE_8BIT; obj->bits = SPI_DATASIZE_8BIT;
obj->cpol = SPI_POLARITY_LOW; obj->cpol = SPI_POLARITY_LOW;
obj->cpha = SPI_PHASE_1EDGE; obj->cpha = SPI_PHASE_1EDGE;
obj->br_presc = SPI_BAUDRATEPRESCALER_256; obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1 MHz (HSI) or 1.13 MHz (HSE)
obj->pin_miso = miso; obj->pin_miso = miso;
obj->pin_mosi = mosi; obj->pin_mosi = mosi;

View File

@ -253,7 +253,6 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
mode = STM_MODE_IT_EVT_RESET; mode = STM_MODE_IT_EVT_RESET;
obj->event = EDGE_NONE; obj->event = EDGE_NONE;
} }
} }
pin_function(obj->pin, STM_PIN_DATA(mode, pull, 0)); pin_function(obj->pin, STM_PIN_DATA(mode, pull, 0));

View File

@ -45,7 +45,7 @@ static const PinMap PinMap_I2C_SDA[] = {
{PB_3, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, {PB_3, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)},
{PB_4, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, {PB_4, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)},
{PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // ARDUINO
{PC_9, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PC_9, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
{NC, NC, 0} {NC, NC, 0}
}; };
@ -53,7 +53,7 @@ static const PinMap PinMap_I2C_SDA[] = {
static const PinMap PinMap_I2C_SCL[] = { static const PinMap PinMap_I2C_SCL[] = {
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
{PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
{PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, {PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // ARDUINO
{PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
{NC, NC, 0} {NC, NC, 0}
}; };

View File

@ -49,8 +49,8 @@ static const PinMap PinMap_PWM[] = {
// {PA_3, PWM_9, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9)}, // TIM9_CH2 // {PA_3, PWM_9, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9)}, // TIM9_CH2
{PA_5, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH1 {PA_5, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH1
{PA_6, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH1 {PA_6, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH1
{PA_7, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH1N {PA_7, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH1N - ARDUINO
// {PA_7, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2 // {PA_7, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2 - ARDUINO
{PA_8, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH1 {PA_8, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH1
{PA_9, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH2 {PA_9, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH2
{PA_10, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH3 {PA_10, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH3
@ -61,22 +61,22 @@ static const PinMap PinMap_PWM[] = {
// {PB_0, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH3 // {PB_0, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH3
{PB_1, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH3N {PB_1, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH3N
// {PB_1, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH4 // {PB_1, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH4
{PB_3, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH2 {PB_3, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH2 - ARDUINO
{PB_4, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH1 {PB_4, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH1 - ARDUINO
{PB_5, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2 {PB_5, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2
{PB_6, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH1 {PB_6, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH1 - ARDUINO
{PB_7, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH2 {PB_7, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH2
{PB_8, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH3 {PB_8, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH3
// {PB_8, PWM_10,STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10)}, // TIM10_CH1 // {PB_8, PWM_10,STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10)}, // TIM10_CH1
{PB_9, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH4 {PB_9, PWM_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4)}, // TIM4_CH4
// {PB_9, PWM_11,STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11)}, // TIM11_CH1 // {PB_9, PWM_11,STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11)}, // TIM11_CH1
{PB_10, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH3 {PB_10, PWM_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2)}, // TIM2_CH3 - ARDUINO
{PB_13, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH1N {PB_13, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH1N
{PB_14, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH2N {PB_14, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH2N
{PB_15, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH3N {PB_15, PWM_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1)}, // TIM1_CH3N
{PC_6, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH1 {PC_6, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH1
{PC_7, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2 {PC_7, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH2 - ARDUINO
{PC_8, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH3 {PC_8, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH3
{PC_9, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH4 {PC_9, PWM_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3)}, // TIM3_CH4

View File

@ -79,7 +79,7 @@ void rtc_init(void)
__HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSI); __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSI);
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
// [TODO] This value is LSI typical value. To be measured precisely using a timer input capture // [TODO] This value is LSI typical value. To be measured precisely using a timer input capture
rtc_freq = 32000; rtc_freq = LSI_VALUE;
} }
// Enable RTC // Enable RTC

View File

@ -136,7 +136,6 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
stdio_uart_inited = 1; stdio_uart_inited = 1;
memcpy(&stdio_uart, obj, sizeof(serial_t)); memcpy(&stdio_uart, obj, sizeof(serial_t));
} }
} }
void serial_free(serial_t *obj) void serial_free(serial_t *obj)
@ -225,10 +224,12 @@ static void uart1_irq(void)
{ {
uart_irq(UART_1, 0); uart_irq(UART_1, 0);
} }
static void uart2_irq(void) static void uart2_irq(void)
{ {
uart_irq(UART_2, 1); uart_irq(UART_2, 1);
} }
static void uart6_irq(void) static void uart6_irq(void)
{ {
uart_irq(UART_6, 2); uart_irq(UART_6, 2);

View File

@ -37,7 +37,7 @@
#include "pinmap.h" #include "pinmap.h"
static const PinMap PinMap_SPI_MOSI[] = { static const PinMap PinMap_SPI_MOSI[] = {
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
// {PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // {PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
{PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
@ -47,7 +47,7 @@ static const PinMap PinMap_SPI_MOSI[] = {
}; };
static const PinMap PinMap_SPI_MISO[] = { static const PinMap PinMap_SPI_MISO[] = {
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
// {PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // {PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
@ -57,7 +57,7 @@ static const PinMap PinMap_SPI_MISO[] = {
}; };
static const PinMap PinMap_SPI_SCLK[] = { static const PinMap PinMap_SPI_SCLK[] = {
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
// {PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // {PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
@ -119,9 +119,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
if (obj->spi == SPI_1) { if (obj->spi == SPI_1) {
__SPI1_CLK_ENABLE(); __SPI1_CLK_ENABLE();
} }
if (obj->spi == SPI_2) { if (obj->spi == SPI_2) {
__SPI2_CLK_ENABLE(); __SPI2_CLK_ENABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_CLK_ENABLE(); __SPI3_CLK_ENABLE();
} }

View File

@ -130,15 +130,19 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
if (obj->spi == SPI_1) { if (obj->spi == SPI_1) {
__SPI1_CLK_ENABLE(); __SPI1_CLK_ENABLE();
} }
if (obj->spi == SPI_2) { if (obj->spi == SPI_2) {
__SPI2_CLK_ENABLE(); __SPI2_CLK_ENABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_CLK_ENABLE(); __SPI3_CLK_ENABLE();
} }
if (obj->spi == SPI_4) { if (obj->spi == SPI_4) {
__SPI4_CLK_ENABLE(); __SPI4_CLK_ENABLE();
} }
if (obj->spi == SPI_5) { if (obj->spi == SPI_5) {
__SPI5_CLK_ENABLE(); __SPI5_CLK_ENABLE();
} }
@ -179,21 +183,25 @@ void spi_free(spi_t *obj)
__SPI1_RELEASE_RESET(); __SPI1_RELEASE_RESET();
__SPI1_CLK_DISABLE(); __SPI1_CLK_DISABLE();
} }
if (obj->spi == SPI_2) { if (obj->spi == SPI_2) {
__SPI2_FORCE_RESET(); __SPI2_FORCE_RESET();
__SPI2_RELEASE_RESET(); __SPI2_RELEASE_RESET();
__SPI2_CLK_DISABLE(); __SPI2_CLK_DISABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_FORCE_RESET(); __SPI3_FORCE_RESET();
__SPI3_RELEASE_RESET(); __SPI3_RELEASE_RESET();
__SPI3_CLK_DISABLE(); __SPI3_CLK_DISABLE();
} }
if (obj->spi == SPI_4) { if (obj->spi == SPI_4) {
__SPI4_FORCE_RESET(); __SPI4_FORCE_RESET();
__SPI4_RELEASE_RESET(); __SPI4_RELEASE_RESET();
__SPI4_CLK_DISABLE(); __SPI4_CLK_DISABLE();
} }
if (obj->spi == SPI_5) { if (obj->spi == SPI_5) {
__SPI5_FORCE_RESET(); __SPI5_FORCE_RESET();
__SPI5_RELEASE_RESET(); __SPI5_RELEASE_RESET();