Skip to content

Commit b423de6

Browse files
committed
Add Nucleo-f091RC variant
Signed-off-by: Frederic.Pillon <frederic.pillon@st.com>
1 parent 7fac7e5 commit b423de6

39 files changed

+1394
-88
lines changed

Diff for: boards.txt

+17-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.f_cpu=16000000L
2929
Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.usb_product="NUCLEO-F429ZI"
3030
Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.board=NUCLEO_F429ZI
3131
Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.series=STM32F4xx
32-
Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.ldscript=linker_scripts/gcc/STM32F429ZI_FLASH.ld
3332
Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.variant=NUCLEO_F429ZI
3433
Nucleo_144.menu.Nucleo_144_board.NUCLEO_F429ZI.build.cmsis_lib_gcc=arm_cortexM4l_math
3534
#To enable USB add '-DUSBCON'
@@ -58,6 +57,23 @@ Nucleo_64.pid.0=0x5711
5857
Nucleo_64.build.core=arduino
5958
Nucleo_64.build.board=Nucleo_64
6059

60+
# NUCLEO_F091RC board
61+
62+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC=Nucleo F091RC
63+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.node=NODE_F091RC
64+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.upload.maximum_size=262144
65+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.upload.maximum_data_size=32768
66+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.mcu=cortex-m0
67+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.f_cpu=8000000L
68+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.usb_product="NUCLEO-F091RC"
69+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.board=NUCLEO_F091RC
70+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.series=STM32F0xx
71+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.variant=NUCLEO_F091RC
72+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.cmsis_lib_gcc=arm_cortexM0l_math
73+
#To enable USB add '-DUSBCON'
74+
#To enable HID (keyboard and mouse support) add also '-DUSBD_USE_HID_COMPOSITE'
75+
Nucleo_64.menu.Nucleo_64_board.NUCLEO_F091RC.build.extra_flags=-DSTM32F091xC {build.usb_flags}
76+
6177

6278
Nucleo_64.menu.upload_method.MassStorageMethod=Mass Storage
6379
Nucleo_64.menu.upload_method.MassStorageMethod.upload.protocol=
@@ -91,7 +107,6 @@ Disco_board.menu.Disco_board.DISCO_F407VG.build.f_cpu=16000000L
91107
Disco_board.menu.Disco_board.DISCO_F407VG.build.usb_product="DISCO-F407G"
92108
Disco_board.menu.Disco_board.DISCO_F407VG.build.board=DISCO_F407VG
93109
Disco_board.menu.Disco_board.DISCO_F407VG.build.series=STM32F4xx
94-
Disco_board.menu.Disco_board.DISCO_F407VG.build.ldscript=linker_scripts/gcc/STM32F407VGTx_FLASH.ld
95110
Disco_board.menu.Disco_board.DISCO_F407VG.build.variant=DISCO_F407VG
96111
Disco_board.menu.Disco_board.DISCO_F407VG.build.cmsis_lib_gcc=arm_cortexM4l_math
97112

File renamed without changes.

Diff for: cores/arduino/stm32/analog.c

+21-4
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@
7070
* @{
7171
*/
7272

73+
#ifdef STM32F0xx
74+
#define SAMPLINGTIME ADC_SAMPLETIME_1CYCLE_5
75+
#else
7376
#define SAMPLINGTIME ADC_SAMPLETIME_3CYCLES /*!< ADC conversions sampling time. */
77+
#endif
7478
#define ADC_REGULAR_RANK_1 1
7579
/**
7680
* @}
@@ -350,9 +354,12 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
350354
/* ADC Periph clock enable */
351355
if(hadc->Instance == ADC1) {
352356
__HAL_RCC_ADC1_CLK_ENABLE();
353-
} else if(hadc->Instance == ADC3) {
357+
}
358+
#ifdef ADC3
359+
else if(hadc->Instance == ADC3) {
354360
__HAL_RCC_ADC3_CLK_ENABLE();
355361
}
362+
#endif
356363

357364
/* Enable GPIO clock ****************************************/
358365
port = set_GPIO_Port_Clock(STM_PORT(g_current_pin));
@@ -378,9 +385,12 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
378385

379386
if(hadc->Instance == ADC1) {
380387
__HAL_RCC_ADC1_CLK_DISABLE();
381-
} else if(hadc->Instance == ADC3) {
388+
}
389+
#ifdef ADC3
390+
else if(hadc->Instance == ADC3) {
382391
__HAL_RCC_ADC3_CLK_DISABLE();
383392
}
393+
#endif
384394
}
385395

386396
/**
@@ -404,13 +414,20 @@ uint16_t adc_read_value(PinName pin)
404414
AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
405415
AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */
406416
AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */
407-
AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */
408417
AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */
409-
AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */
410418
AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */
411419
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
412420
AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */
413421
AdcHandle.State = HAL_ADC_STATE_RESET;
422+
#ifdef STM32F0xx
423+
AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */
424+
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */
425+
AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */
426+
AdcHandle.Init.SamplingTimeCommon = SAMPLINGTIME;
427+
#else
428+
AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */
429+
AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */
430+
#endif
414431

415432
g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/
416433

Diff for: cores/arduino/stm32/clock.c

+13-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,18 @@ void SysTick_Handler(void)
136136
void delayInsideIT(uint32_t delay_us)
137137
{
138138
uint32_t nb_loop;
139-
139+
#ifdef STM32F0xx
140+
nb_loop = (((HAL_RCC_GetHCLKFreq() / 1000000)/5)*delay_us)+1; /* uS (divide by 4 because each loop take about 4 cycles including nop +1 is here to avoid delay of 0 */
141+
__asm__ volatile(
142+
"1: " "\n\t"
143+
" nop " "\n\t"
144+
" sub %0, %0, #1 " "\n\t"
145+
" bne 1b " "\n\t"
146+
: "=r" (nb_loop)
147+
: "0"(nb_loop)
148+
: "r3"
149+
);
150+
#else
140151
nb_loop = (((HAL_RCC_GetHCLKFreq() / 1000000)/4)*delay_us)+1; /* uS (divide by 4 because each loop take about 4 cycles including nop +1 is here to avoid delay of 0 */
141152
__asm__ volatile(
142153
"1: " "\n\t"
@@ -147,6 +158,7 @@ void delayInsideIT(uint32_t delay_us)
147158
: "0"(nb_loop)
148159
: "r3"
149160
);
161+
#endif
150162
}
151163

152164
/**

Diff for: cores/arduino/stm32/interrupt.c

+61-1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,24 @@ typedef struct {
9494
* @{
9595
*/
9696
static gpio_irq_conf_str gpio_irq_conf[NB_EXTI] = {
97+
#ifdef STM32F0xx
98+
{.pin = GPIO_PIN_0, .irqnb = EXTI0_1_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
99+
{.pin = GPIO_PIN_1, .irqnb = EXTI0_1_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
100+
{.pin = GPIO_PIN_2, .irqnb = EXTI2_3_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
101+
{.pin = GPIO_PIN_3, .irqnb = EXTI2_3_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
102+
{.pin = GPIO_PIN_4, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
103+
{.pin = GPIO_PIN_5, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
104+
{.pin = GPIO_PIN_6, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
105+
{.pin = GPIO_PIN_7, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
106+
{.pin = GPIO_PIN_8, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
107+
{.pin = GPIO_PIN_9, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
108+
{.pin = GPIO_PIN_10, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
109+
{.pin = GPIO_PIN_11, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
110+
{.pin = GPIO_PIN_12, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
111+
{.pin = GPIO_PIN_13, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
112+
{.pin = GPIO_PIN_14, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
113+
{.pin = GPIO_PIN_15, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 }
114+
#else
97115
{.pin = GPIO_PIN_0, .irqnb = EXTI0_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
98116
{.pin = GPIO_PIN_1, .irqnb = EXTI1_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
99117
{.pin = GPIO_PIN_2, .irqnb = EXTI2_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
@@ -110,6 +128,7 @@ static gpio_irq_conf_str gpio_irq_conf[NB_EXTI] = {
110128
{.pin = GPIO_PIN_13, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
111129
{.pin = GPIO_PIN_14, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 },
112130
{.pin = GPIO_PIN_15, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING, .configured = 0 }
131+
#endif
113132
};
114133

115134
/**
@@ -210,6 +229,47 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
210229
}
211230
}
212231

232+
#ifdef STM32F0xx
233+
/**
234+
* @brief This function handles external line 0 to 1 interrupt request.
235+
* @param None
236+
* @retval None
237+
*/
238+
void EXTI0_1_IRQHandler(void)
239+
{
240+
uint32_t pin;
241+
for(pin = GPIO_PIN_0; pin <= GPIO_PIN_1; pin=pin<<1) {
242+
HAL_GPIO_EXTI_IRQHandler(pin);
243+
}
244+
}
245+
246+
247+
/**
248+
* @brief This function handles external line 2 to 3 interrupt request.
249+
* @param None
250+
* @retval None
251+
*/
252+
void EXTI2_3_IRQHandler(void)
253+
{
254+
uint32_t pin;
255+
for(pin = GPIO_PIN_2; pin <= GPIO_PIN_3; pin=pin<<1) {
256+
HAL_GPIO_EXTI_IRQHandler(pin);
257+
}
258+
}
259+
260+
/**
261+
* @brief This function handles external line 4 to 15 interrupt request.
262+
* @param None
263+
* @retval None
264+
*/
265+
void EXTI4_15_IRQHandler(void)
266+
{
267+
uint32_t pin;
268+
for(pin = GPIO_PIN_4; pin <= GPIO_PIN_15; pin=pin<<1) {
269+
HAL_GPIO_EXTI_IRQHandler(pin);
270+
}
271+
}
272+
#else
213273
/**
214274
* @brief This function handles external line 0 interrupt request.
215275
* @param None
@@ -286,7 +346,7 @@ void EXTI15_10_IRQHandler(void)
286346
HAL_GPIO_EXTI_IRQHandler(pin);
287347
}
288348
}
289-
349+
#endif
290350
/**
291351
* @}
292352
*/

Diff for: cores/arduino/stm32/spi_com.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ typedef struct spi_s spi_t;
6262

6363

6464
///@brief specifies the SPI speed bus in HZ.
65-
#define SPI_SPEED_CLOCK_DIV2_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/2))
66-
#define SPI_SPEED_CLOCK_DIV4_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/4))
67-
#define SPI_SPEED_CLOCK_DIV8_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/8))
68-
#define SPI_SPEED_CLOCK_DIV16_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/16))
69-
#define SPI_SPEED_CLOCK_DIV32_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/32))
70-
#define SPI_SPEED_CLOCK_DIV64_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/64))
71-
#define SPI_SPEED_CLOCK_DIV128_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/128))
72-
#define SPI_SPEED_CLOCK_DIV256_MHZ ((uint32_t)(HAL_RCC_GetPCLK2Freq()/256))
65+
#define SPI_SPEED_CLOCK_DIV2_MHZ ((uint32_t)(SystemCoreClock/2))
66+
#define SPI_SPEED_CLOCK_DIV4_MHZ ((uint32_t)(SystemCoreClock/4))
67+
#define SPI_SPEED_CLOCK_DIV8_MHZ ((uint32_t)(SystemCoreClock/8))
68+
#define SPI_SPEED_CLOCK_DIV16_MHZ ((uint32_t)(SystemCoreClock/16))
69+
#define SPI_SPEED_CLOCK_DIV32_MHZ ((uint32_t)(SystemCoreClock/32))
70+
#define SPI_SPEED_CLOCK_DIV64_MHZ ((uint32_t)(SystemCoreClock/64))
71+
#define SPI_SPEED_CLOCK_DIV128_MHZ ((uint32_t)(SystemCoreClock/128))
72+
#define SPI_SPEED_CLOCK_DIV256_MHZ ((uint32_t)(SystemCoreClock/256))
7373

7474
///@brief speficies the SPI mode to use
7575
//Mode Clock Polarity (CPOL) Clock Phase (CPHA)

Diff for: cores/arduino/stm32/stm32_def.h

+26
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,30 @@
4545
#else
4646
#error "STM32YYxx chip series is not defined in boards.txt."
4747
#endif
48+
49+
50+
#ifndef __HAL_RCC_ADC_FORCE_RESET
51+
#define __HAL_RCC_ADC_FORCE_RESET __HAL_RCC_ADC1_FORCE_RESET
52+
#endif
53+
#ifndef __HAL_RCC_ADC_RELEASE_RESET
54+
#define __HAL_RCC_ADC_RELEASE_RESET __HAL_RCC_ADC1_RELEASE_RESET
55+
#endif
56+
#ifndef __HAL_RCC_DAC_CLK_DISABLE
57+
#define __HAL_RCC_DAC_CLK_DISABLE __HAL_RCC_DAC1_CLK_DISABLE
58+
#endif
59+
#ifndef __HAL_RCC_DAC_CLK_ENABLE
60+
#define __HAL_RCC_DAC_CLK_ENABLE __HAL_RCC_DAC1_CLK_ENABLE
61+
#endif
62+
#ifndef __HAL_RCC_UART4_CLK_ENABLE
63+
#define __HAL_RCC_UART4_CLK_ENABLE __HAL_RCC_USART4_CLK_ENABLE
64+
#endif
65+
#ifndef __HAL_RCC_UART4_RELEASE_RESET
66+
#define __HAL_RCC_UART4_RELEASE_RESET __HAL_RCC_USART4_RELEASE_RESET
67+
#endif
68+
#ifndef __HAL_RCC_UART4_FORCE_RESET
69+
#define __HAL_RCC_UART4_FORCE_RESET __HAL_RCC_USART4_FORCE_RESET
70+
#endif
71+
72+
73+
4874
#endif //_STM32_DEF_

Diff for: cores/arduino/stm32/stm32_def_build.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
#ifndef _STM32_DEF_BUILD_
2323
#define _STM32_DEF_BUILD_
2424

25-
#if defined(STM32F407xx)
25+
#if defined(STM32F091xC)
26+
#define CMSIS_STARTUP_FILE "startup_stm32f091xc.s"
27+
#elif defined(STM32F407xx)
2628
#define CMSIS_STARTUP_FILE "startup_stm32f407xx.s"
2729
#elif defined(STM32F429xx)
2830
#define CMSIS_STARTUP_FILE "startup_stm32f429xx.s"

Diff for: cores/arduino/stm32/stm32_eeprom.c

+35-1
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,15 @@
6969
* @{
7070
*/
7171
// We use the last page of the flash to store data (to prevent code overwrite).
72+
#ifdef STM32F0xx
73+
// Flash base address (Bank2, page 256)
74+
#define FLASH_BASE_ADDRESS 0x0803F800
75+
#define FLASH_PAGE_NUMBER 127
76+
#else
7277
// Use the last 16 page of the second bank (sector 15)
7378
#define FLASH_BASE_ADDRESS ((uint32_t)(0x0810C000))
7479
#define FLASH_DATA_SECTOR 15
80+
#endif
7581

7682
/**
7783
* @}
@@ -150,10 +156,37 @@ void set_data_to_flash(void)
150156
{
151157
//copy in flash
152158
FLASH_EraseInitTypeDef EraseInitStruct;
153-
uint32_t SectorError = 0;
154159
uint32_t offset = 0;
155160
uint32_t address = FLASH_BASE_ADDRESS;
156161
uint32_t address_end = FLASH_BASE_ADDRESS + E2END;
162+
#ifdef STM32F0xx
163+
uint32_t pageError = 0;
164+
uint64_t data = 0;
165+
166+
// ERASING page
167+
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
168+
EraseInitStruct.PageAddress = FLASH_BASE_ADDRESS;
169+
EraseInitStruct.NbPages = 1;
170+
171+
if(HAL_FLASH_Unlock() == HAL_OK) {
172+
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);
173+
174+
if(HAL_FLASHEx_Erase(&EraseInitStruct, &pageError) == HAL_OK) {
175+
while(address < address_end) {
176+
data = *((uint64_t*)(((uint8_t*)tmpEE + offset)));
177+
178+
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address, data) == HAL_OK) {
179+
address += 8;
180+
offset += 8;
181+
} else {
182+
address = address_end+1;
183+
}
184+
}
185+
}
186+
HAL_FLASH_Lock();
187+
}
188+
#else
189+
uint32_t SectorError = 0;
157190
uint32_t data = 0;
158191

159192
// ERASING page
@@ -177,6 +210,7 @@ void set_data_to_flash(void)
177210
}
178211
}
179212
HAL_FLASH_Lock();
213+
#endif
180214
}
181215

182216

0 commit comments

Comments
 (0)