2017-01-18 06:48 AM
Hi to all,
this is my first project using a STM32F373 MCU, but I am not able even to let a LED blink.
I assume that system clock is not running as I get no response also enabling the MCO and check it with a scope.
For my clock initialization routine I used the cubemx code as base. Here is my code:
--------------------------------------------------------
/*-------------------------------- HSE - HSI Configuration -----------------------*/
if(!HSEHSI)
{
if(!(RCC->CR & RCC_CR_HSION)) RCC->CR |= RCC_CR_HSION; // If HSI in not ON, just enable it
while(!(RCC->CR & RCC_CR_HSIRDY));
RCC->CR &= ~RCC_CR_PLLON; // Disable PLL
RCC->CFGR &= ~RCC_CFGR_PLLSRC_HSE_PREDIV; // HSI as PLL source
}
else
{
RCC->CR &= ~RCC_CR_HSEBYP; // Disable HSE_BYPASS
RCC->CR |= RCC_CR_HSEON; // Enable HSE
while(!(RCC->CR & RCC_CR_HSERDY)); // Wait for HSE being ready
RCC->CR &= ~RCC_CR_PLLON; // Disable PLL
while(RCC->CR & RCC_CR_PLLRDY); // Wait for PLL disabled
RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV; // HSE as PLL source
RCC->CFGR &= ~RCC_CFGR_PLLXTPRE; // HSE not divided
RCC->CFGR2 &= (RCC->CFGR2 & ~RCC_CFGR2_PREDIV) | RCC_CFGR2_PREDIV_DIV1; // Input clock not divided
}
RCC->CFGR = ((RCC->CFGR & ~RCC_CFGR_PLLMUL) | RCC_CFGR_PLLMUL9); // PLL = 9*HSE
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL; // PLL as SYSTEM CLOCK
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PLLXTPRE) | RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV1; // HSE/PREDIV clock not divided for PLL entry
RCC->CFGR |= RCC_CFGR_USBPRE_DIV1_5; // USB divided by 3
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PPRE2) | RCC_CFGR_PPRE2_DIV1; // APB2 not divided
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_PPRE1) | RCC_CFGR_PPRE1_DIV2; // APB1 divided by 2
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_HPRE) | RCC_CFGR_HPRE_DIV1; // AHB not divided
RCC->CFGR2 &= (RCC->CFGR & ~RCC_CFGR_MCO) | RCC_CFGR_MCO_SYSCLK; // Enable MCO
RCC->CR |= RCC_CR_PLLON; // Enable PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); // Wait for PLL enabled
// FLASH->ACR = (FLASH->ACR &(~FLASH_ACR_LATENCY)) | FLASH_ACR_LATENCY_2; // Set FLASH latency = 2
/*-------------------------------- LSE - LSI Configuration -----------------------*/
if(!LSELSI)
{
if(!(RCC->CSR & RCC_CSR_LSION)) RCC->CSR |= RCC_CSR_LSION; //Enable LSI
while(!(RCC->CSR & RCC_CSR_LSIRDY)); // Wait for LSI ready
RCC->BDCR = (RCC->BDCR & ~RCC_BDCR_RTCSEL) | RCC_BDCR_RTCSEL_LSI; // LSI as RTC clock
}
else
{
PWR->CR |= PWR_CR_DBP; // Disable RTC write protect
if(!(RCC->BDCR & RCC_BDCR_LSEON)) RCC->BDCR = (RCC->BDCR & ~RCC_BDCR_LSE) | RCC_BDCR_LSEON; // If LSE in not ON, just enable it
while(!(RCC->BDCR & RCC_BDCR_LSERDY));
RCC->BDCR = (RCC->BDCR & ~RCC_BDCR_RTCSEL) | RCC_BDCR_RTCSEL_LSE; // LSE as RTC clock
}
RCC->CIR = 0x00000000; // Disable all interrupts�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?
--------------------------------------------------------
Someone encountered this problem already?
Do I make some mistakes?
Thank you
Freya
2017-01-18 07:00 AM
Hi Freya,
I advise you to refer to the 'GPIO_IOToggle' example provided in the
package or in (STSW-STM32108)
under the following paths:Khouloud
2017-01-18 07:09 AM
this is my first project using a STM32F373 MCU, but I am not able even to let a LED blink.
Start with blinky with no touching the clocks, running on whatever default clock is after reset.
Only if you get that running, start playing with clocks.
Style advice: don't read-modify-write the registers unless absolutely necessary; prefer direct writes to them.
JW
2017-01-19 01:19 PM
,
,
Hi to all,
I checked GPIO toggle and used deafult values, but nothing changed, so I reduced my program as much as I could:
--------------------------------------------------------------------------------------------
♯ include 'stm32f3xx.h'
♯ define LED3 , , , , , ,1 , , , , , ,//GPIOD
,
♯ define LED2 , , , , , ,2 , , , , , ,//GPIOD,
♯ define LED1 , , , , , ,3 , , , , , ,//GPIOD,
♯ define LED0 , , , , , ,4 , , , , , ,//GPIOD,
void SystemInit(),
{,
// , , ,if(!(RCC->,CR &, RCC_CR_HSIRDY)) RCC->,CR |= RCC_CR_HSION,,
// , , ,while((RCC->,CR &, RCC_CR_HSIRDY) == 0), , , ,// Wait for HSI being ready,
, , ,return,,
}int main(void)
,
{,
, , ,if(!(RCC->,AHBENR &, RCC_AHBENR_GPIODEN)) RCC->,AHBENR |= RCC_AHBENR_GPIODEN, , , , , , ,// Enable GPIOD clock , , ,,
// , , ,RCC->,AHBENR |= RCC_AHBENR_GPIODEN,,
, , ,,
, , ,GPIOD->,MODER &,= ~(0x03<,<,(2*LED3) | 0x03<,<,(2*LED2) | 0x03<,<,(2*LED1) | 0x03<,<,(2*LED0)), , , ,//Alternate function = output,
, , ,GPIOD->,MODER |= 0x01<,<,(2*LED3) | 0x01<,<,(2*LED2) | 0x01<,<,(2*LED1) | 0x01<,<,(2*LED0),,
, , ,GPIOD->,OTYPER &,= ~(0x01<,<,LED2 | 0x01<,<,LED1 | 0x01<,<,LED0), , , ,//Output push-pull,
, , ,GPIOD->,OTYPER |= 0x00<,<,LED3 | 0x00<,<,LED2 | 0x00<,<,LED1 | 0x00<,<,LED0,,
, , ,GPIOD->,OSPEEDR &,= ~(0x03<,<,(2*LED3) | 0x03<,<,(2*LED2) | 0x03<,<,(2*LED1) | 0x03<,<,(2*LED0)), , , ,//Pin speed = low speed,
, , ,GPIOD->,OSPEEDR |= 0x00<,<,(2*LED3) | 0x00<,<,(2*LED2) | 0x00<,<,(2*LED1) | 0x00<,<,(2*LED0),,
, , ,GPIOD->,PUPDR &,= ~(0x03<,<,(2*LED3) | 0x03<,<,(2*LED2) | 0x03<,<,(2*LED1) | 0x03<,<,(2*LED0)), , , ,//No Pull up or Pull Down,
, , ,GPIOD->,PUPDR |= 0x00<,<,(2*LED3) | 0x00<,<,(2*LED2) | 0x00<,<,(2*LED1) | 0x00<,<,(2*LED0),,
, , ,,
, , ,GPIOD->,BSRRL |= 1<,<,LED3 | 1<,<,LED2 | 1<,<,LED1 | 1<,<,LED0,, , ,
,
, , , while(1),
, , ,{ ,,
, , ,},
}--------------------------------------------------------------------------------------------
Assuming that clock configuration in automatically set at reset, I configure GPIO pins, but nothing happenes.
Similar code on STM32F030 works, so I do not understand why not here.
Thank you
Freya
2017-01-19 01:52 PM
Looks good. Question is, whether the startup code is OK.
Is this a known good board such as a Nucleo? If not, I'd double-check all ground and all supply pins including VCAPs (measuring the voltage on them and checking against datasheet).
JW
2017-01-24 11:07 AM
Hi JW,
it is a my own board, not a welll known one.
I tried to modify the code using include files for stm32f0xx MCU's, but leaving startup_stm32f373xc.s as startup file and the programs worked fine.
But every time I try to select stm32f373as MCU, it does not work.
Is it my fault or is it a compiler (Keil) fault?
Do I have to check some settings?Thank you
Freya2017-01-24 01:44 PM
I don't understand what did you do, but mixing files intended for different families won't do any good.
The ST-provided startup makes usually calls to routines setting up clocks etc.
/
*
Call
the clock system intitialization function.
*
/
bl
SystemInit
/
*
Call
static constructors
*
/
bl
__libc_init_array
Try to comment them out.JW
2017-01-28 08:13 AM
Hi to all,
the problem is partially solved.
I added the following lines:
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ #endifand
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
and now everything works. The remaining part of problem is that MCu works at 36 MHz instead of 72 MHz
Freya