TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: Nocturno en 14 de Febrero de 2018, 14:21:00

Título: Dudas STM32CubeMX
Publicado por: Nocturno en 14 de Febrero de 2018, 14:21:00
Hola compañeros.
Estoy usando Eclipse + STM32CubeMX para empezar un nuevo proyecto, en el que he seleccionado el STM32F103C8Tx configurado de esta manera:
(http://www.todopic.com.ar/foros/imgtiny/55oxaw.jpg)

Pues bien, si intento generar el código de forma automática se me queda enganchado aquí:
(http://www.todopic.com.ar/foros/imgtiny/2q1gdo3.jpg)

Si desactivo los dos pines asignados a la USART (PA9 y PA10) sí que tira adelante y me genera el proyecto sin problemas.

¿Se os ocurre cómo puedo solucionarlo?

Gracias
Título: Re:Dudas STM32CubeMX
Publicado por: planeta9999 en 14 de Febrero de 2018, 15:02:25

A mi me pasó algo parecido con un proyecto, y era porque se habían corrompido algunos de los ficheros que genera Cube. Borré todos los archivos, salvo el fuente de Cube, guárdandome antes el código que ya había metido en el main.c y pude regenerar de nuevo el proyecto, Cube vuelve a crear todos los archivos.

Los directorios dentro del proyecto son Src para los fuentes e Inc para los includes, en mi caso tenía ficheros corrompidos en ambos. Le estuve dando durante días, porque si me había funcionado todo desde el principio, hasta que un día se me empezó a quedar bloqueado al generar el proyecto, y ya no hubo forma hasta que borré todos los .h y los .c que había creado Cube.
Título: Re:Dudas STM32CubeMX
Publicado por: Nocturno en 18 de Febrero de 2018, 05:08:17
Pues tienes razón, lo borre todo y lo hice de nuevo y funcionó perfecto. Gracias
Título: Re:Dudas STM32CubeMX
Publicado por: juaperser1 en 18 de Febrero de 2018, 10:01:06
En vez de configurar eclipse desde 0, yo te recomiendo el AC6 viene ya todo configurado y listo para usar

Título: Re:Dudas STM32CubeMX
Publicado por: Nocturno en 18 de Febrero de 2018, 10:28:41
Sí, por supuesto, de hecho usé  tu vídeo para configurarlo todo exactamente igual
Título: Re:Dudas STM32CubeMX
Publicado por: juaperser1 en 18 de Febrero de 2018, 11:05:26
Dentro de poco lo mejor será usar el atollic, que lo compro St y ya lo ofrece gratuitamente para los STM y también es base eclipse, tiene herramientas avanzadas de depuración y más cosas, pero hasta que no esté pulido del todo prefiero el AC6.
Pero bueno si no es para un proyecto crítico y te apetece probarlo, ya puedes gratuitamente para los stm32.

Un saludo
Título: Re:Dudas STM32CubeMX
Publicado por: Nocturno en 18 de Febrero de 2018, 13:20:23
Pues ya he instalado Atollic. Aparentemente no veo diferencias con Eclipse, ¿es mejor?

Por otro lado, ¿se puede hacer simulación con alguna herramienta?

Gracias
Título: Re:Dudas STM32CubeMX
Publicado por: juaperser1 en 18 de Febrero de 2018, 14:14:10
Atollic, basicamente es como keil o IAR. Si se puede decir que es mejor, además de que dentro de poco será la versión oficial del IDE para los micros de ST.

Lo que pasa es que esta basado en eclipse, es como el CCS de texas instruments.

No sabría decirte todas las herramientas que tiene o si tiene simulador, lo que si se es que las herramientas para debuguear están muy bien incluso para RTOS y tiene muy buenas herramientas para ver el uso de memoria y eso.

Cuando me ponga con el investigaré todas estas herramientas.

un saludo.
Título: Re:Dudas STM32CubeMX
Publicado por: Nocturno en 21 de Febrero de 2018, 17:02:36
Llevo varios días dándole vueltas y no consigo que el CubeMX me genere el código de interrupción de los timers. He probado varias configuraciones, y los 4 timers, pero nada.
Imagino que será un bug, pero me parece algo tan básico que me extraña y lo más normal será que yo esté haciendo algo mal.
Título: Re:Dudas STM32CubeMX
Publicado por: tsk en 21 de Febrero de 2018, 17:44:00
En alguna parte del main.c después del

Código: C
  1. MX_TIMX_Init();

Necesitas agregar

Código: C
  1. HAL_TIM_Base_Start_IT(&htimX);

Donde X es el número del timer, por ejemplo el timer 3.

Para atender la interrupción después agregas la función
Código: C
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.         if(htim->Instance == htim3.Instance)
  4.         {
  5.            //Código que se ejecutara en la interrupción
  6.         }
  7. }

Título: Re:Dudas STM32CubeMX
Publicado por: planeta9999 en 21 de Febrero de 2018, 17:55:26

Si que es raro. Yo precisamente tengo una aplicacióin reciente que hice para un cliente, y uso una interrupcion con un timer para encender y actualizar unos displays conectados con registros de desplazamiento 74HC595, y me va perfecto.

Te dejo mi configuración, en Cube y en el main.


(https://i.imgur.com/ow2ucHm.jpg)

(https://i.imgur.com/865dyfG.jpg)

(https://i.imgur.com/pEaabPG.jpg)

(https://i.imgur.com/V2GNi5I.jpg)

(https://i.imgur.com/lln5pAr.jpg)
Título: Re:Dudas STM32CubeMX
Publicado por: Nocturno en 22 de Febrero de 2018, 03:21:41
He generado un nuevo proyecto que usa sólo los timers y ahora sí me incluye el código correctamente. Parece que definitivamente se trata de un bug porque no he hecho nada diferente, excepto empezar con un proyecto limpio.
Gracias planeta.
Título: Re:Dudas STM32CubeMX
Publicado por: Thulsa Doom en 06 de Junio de 2018, 09:00:16
Hola a todos, pues aprovechando este hilo, no sé si será mejor abrir uno nuevo con mi pregunta pero como va de lo mismo.. si hay que cambiar me lo dicen y creo otro nuevo.
Resulta que me he cambiado hace nada de pic a estos micros de 32bit, yo estoy usando la placa STM32F4 Discovery STM32F407 Cortex-m4 Developme... y la verdad que todavía estoy muy verde, poco a poco lo estoy asimilando. pero una cosa que me pasa con el STM32Cube, ósea que uso las mismas herramientas que están en este hilo, y lo que me pasa es que he estado mirando lo de la interrupción SYStick para el manejo de tiempos y he llegado a esta línea
(https://i.imgur.com/zDASufj.png)

Pues en el cube yo configuro una velocidad diferente de reloj.
(https://i.imgur.com/FRvpmIL.png)
Compilo el proyecto y cuando voy a la configuración de la velocidad de reloj que he puesto más arriba no cambia de ese valor de 16MHz al nuevo valor de 168MHz que he configurado.

¿Estoy haciendo algo mal o esto hay que configurarlo a mano y lo del cube son solo cálculos apara que nosotros sepamos que hay que cambiar?

Otra pregunta Off Topic.. ¿me podéis recomendar algún libro para el manejo de estos micros?, preferiblemente en castellano que mi inglés es muy básico.

Gracias
Título: Re:Dudas STM32CubeMX
Publicado por: KILLERJC en 06 de Junio de 2018, 10:04:30
Pienso que deberia ponerse en el valor correcto, pero pensandolo un poco tal ves ese valor sea el del cristal porque se use al comienzo (delays,etc), y luego se actualice una ves que el PLL se encuentra funcionando.

Si no me equivoco las que lo actualizan son HAL_RCC_ClockConfig() o HAL_RCC_GetHCLKFreq(), podes fijarte si existe esas funciones luego de activar el PLL y setear la frecuencia, y si es asi, ese valor deberia actualizarse en runtime. Tambien podrias, si tenes una placa de evaluacion realizar un debug y observar si ese valor cambia.
Título: Re:Dudas STM32CubeMX
Publicado por: planeta9999 en 06 de Junio de 2018, 11:24:29
 
Estás seleccionando el oscilador RC interno (HSI), no es nada recomendable teniendo en cuenta que en la placa de la Discovery tienes el cuarzo para poder usar el oscilador a cuarzo (HSE) que es mucho más preciso y estable.

El fuente que consultas es correcto, eso te lo genera todo automáticamente el Cube y está bien, el SystemCoreClock es 16Mhz (HSI RC), que se convierte a 168Mhz con el PLL, y eso seguirá así mientras no cambies el valor HSI RC. Igual que a cuarzo será siempre a 8 Mhz y se elevará a 168Mhz también con el PLL, a menos que uses un cuarzo de otro valor y lo cambies en HSE Input frequency.

Cambia la configuración del oscilador, selecciona HSE en PLL Source Mux, para usar el oscilador a cuarzo y cambia tambien el valor Input frequency de HSE para el valor del cuarzo, que si no recuerdo mal es de 8Mhz en la Discovery. Una vez hecho eso tendrás que configurar el PLL para que saque 168Mhz.

En cuanto a libros, en español no vas a encontrar nada, es lo mismo que pedir los datasheet en otro idioma que no sea el inglés.


Esta es la configuración en Cube, para usar el oscilador a cuarzo de 8Mhz con la Discovery.

(https://i.imgur.com/wQUecb2.jpg)

(https://i.imgur.com/yot3nlR.jpg)
Título: Re:Dudas STM32CubeMX
Publicado por: KILLERJC en 06 de Junio de 2018, 14:21:34
Pero de todas formas ese no es el problema, el problema es que segun el codigo auto-generado por el CubeMx, Deberia ser 168Mhz, y no 16.
Es como si en tu codigo pusiera que el SystemCoreClock, fuera de 8Mhz.

Esa es su duda.
Título: Re:Dudas STM32CubeMX
Publicado por: planeta9999 en 06 de Junio de 2018, 16:00:21
 
Lo que Cubemx genera, está siempre bien, no tiene sentido ponerse a urgar en el fuente. Además el Systick, que viene a ser como el millis() en Arduino, se utiliza para medir tiempos entre eventos, y da igual cual sea su frecuencia base.

Una cosa es querer entender el contenido del fuente que genera Cubemx, y otra cuestionarlo, estar bien, esta bien seguro.

En mi programa que tiene activado el oscilador a cuarzo de 8Mhz, con el PLL para sacar 168Mhz, tiene eso mismo puesto en el fuente, pero si miramos más abajo en el mismo fuente, SystemCoreClock se carga con el valor de HSI_VALUE o HSE_VALUE, según hayamos elegido el oscilador a cuarzo o RC, y el PLL.

Código: C
  1. switch (tmp)
  2.   {
  3.     case 0x00:  /* HSI used as system clock source */
  4.       SystemCoreClock = HSI_VALUE;
  5.       break;
  6.     case 0x04:  /* HSE used as system clock source */
  7.       SystemCoreClock = HSE_VALUE;
  8.       break;
  9.     case 0x08:  /* PLL used as system clock source */
  10.  
  11.       /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
  12.          SYSCLK = PLL_VCO / PLL_P
  13.          */    
  14.       pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
  15.       pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
  16.      
  17.       if (pllsource != 0)
  18.       {
  19.         /* HSE used as PLL clock source */
  20.         pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  21.       }
  22.       else
  23.       {
  24.         /* HSI used as PLL clock source */
  25.         pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
  26.       }
  27.  
  28.       pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
  29.       SystemCoreClock = pllvco/pllp;
  30.       break;
  31.     default:
  32.       SystemCoreClock = HSI_VALUE;
  33.       break;
  34.   }


Yo no perdería el tiempo con esas cosas, lo que hace Cubemx, siempre está bien. Lo que no se aún cual es el problema, si es que hay algún problema, querer tocar la frecuencia de base que usa Systick, no sirve para nada.

Además si leemos las notas que aparencen en el fuente, lo aclaran mejor:
If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) or HSI_VALUE(*) multiplied/divided by the PLL factors.

Código: C
  1. Each time the core clock (HCLK) changes, this function must be called
  2.   *         to update SystemCoreClock variable value. Otherwise, any configuration
  3.   *         based on this variable will be incorrect.        
  4.   *    
  5.   * @note   - The system frequency computed by this function is not the real
  6.   *           frequency in the chip. It is calculated based on the predefined
  7.   *           constant and the selected clock source:
  8.   *            
  9.   *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
  10.   *                                              
  11.   *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
  12.   *                          
  13.   *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
  14.   *             or HSI_VALUE(*) multiplied/divided by the PLL factors.
  15.   *        
  16.   *         (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value
  17.   *             16 MHz) but the real value may vary depending on the variations
  18.   *             in voltage and temperature.  
  19.   *    
  20.   *         (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value
  21.   *              depends on the application requirements), user has to ensure that HSE_VALUE
  22.   *              is same as the real frequency of the crystal used. Otherwise, this function
  23.   *              may have wrong result.
Título: Re:Dudas STM32CubeMX
Publicado por: Thulsa Doom en 06 de Junio de 2018, 18:19:22
El problema es que me gusta saber lo que se está haciendo y entender un poco el código fuente, mi idea es usar ese systick para eso mismo que comentas, para lo mismo que el mills en arduino o el tick en pic, y ponerme a practicar encendiendo un led a diferentes velocidades, en definitiva cacharrear un poco, por eso me puse a investigar de donde viene cada cosa y vi que en esa línea no cambiaba la frecuencia del cristal al cambiarla en el Cube, por eso pregunté por que al igual o yo estaba haciendo algo mal en el Cube o no instalé bien el software o algo
Título: Re:Dudas STM32CubeMX
Publicado por: planeta9999 en 06 de Junio de 2018, 19:54:21
 
No cambia en el valor por omisión que le da a la variable, al declararla. Pero si miras más abajo en el fuente, si que le asigna un valor, según el tipo de oscilador que hayas configurado, RC o a cuarzo, y también si activaste el PLL.

Yo el chequeo de tiempos entre eventos, lo estoy usando con Kinetis, y aunque también es un ARM y usa el mismo compilador, al estar bajo el entorno de Arduino, le han creado la función millis() y micros(), para medir el tiempo que ha pasado en milisegundos y microsegundos. Seguro que estás funciones hacen la lectura del Systick.

En los STM32 no he tenido necesidad de usarla, pero algo leí hace tiempo, porque buscaba el millis() y no lo encontraba por ninguna parte. Al final el Systick es lo mismo, y si estas acostumbrado a usar el millis() de Arduino, puedes crearte tu propia función millis() y meterle allí el Systick.

Por Google anda como crear tu millis() para STM32

Código: C
  1. volatile uint32_t ticks;
  2. extern "C" void SysTick_Handler (void)
  3.  {
  4.    ticks++;
  5.  }
  6.  
  7.  
  8. // return the system clock as milliseconds
  9. inline uint32_t millis (void)
  10. {
  11.    return ticks;
  12. }
Título: Re:Dudas STM32CubeMX
Publicado por: Thulsa Doom en 08 de Junio de 2018, 10:55:45
Siento ser cabezota pero si no entiendo el código fuente no me encuentro ni seguro de lo que estoy haciendo ni agusto prorgamando, ya he tenido problemas en el pasado intentando usar la librería TCP/IP de microchip, intenté controlar periféricos externos y se me hizo un lío por que no podría poner el código en cualquier parte, tuve que estudiar la librería para integrar mis modificaciones y que no generara conflicto, me supuso un curro tremendo, me tuve que sentar con una hoja de papel y un lápiz y hacerme un esquema de flujo para poder entenderla  :oops:, si lo sé, ya se que van a decir.. que soy un bruto pero que quieren que les diga... pues si jajajaja.

A lo que voy, más o menos te he entendido, lo que tengo dudas, se supone que la función:
Código: [Seleccionar]
void SystemCoreClockUpdate(void) es la encargada de actualizar el valor del reloj del sistema, ¿no?.
Entonces siguiendo el flujo del sistema veo algo que no me cuadra y es que en ningún momento veo que se llame a a esa función para actualizar el reloj. si nos fijamos en el archivo main.c vemos las funciones de configuración de puertos, reloj, periféricos y demás.

(https://i.imgur.com/meycx2q.png)

Pues en la función
Código: [Seleccionar]
HAL_Init(); se supone que se configura la base de tiempos de 1ms

(https://i.imgur.com/FYHVH9F.png)
Pues si nos vamos a esa función se ve como se configura o se ajusta el tiempo de 1ms a la velocidad del cristal que no coincide con lo que hemos seleccionado, en mi caso cristal externo de 8MHz

(https://i.imgur.com/cFwi4e4.png)

Entonces si nos llevamos por eso ¿lo propio no sería decirle al sistema que actualice el la velocidad del cristal con la función
Código: [Seleccionar]
SystemCoreClockUpdate() antes de las configuraciones generales, de esta manera?

(https://i.imgur.com/wOHmy24.png)

Al igual estoy equivocado por que soy un simple aficinado y esto se hace automáticamente de otra manera que no lo veo, en fin no sé.

Todo esto es porque estoy implementando la librería tick de micro chip y estoy a ver que me hace falta y lo que no, ósea lo que se está ya ejecutando y lo que no para eliminarlo o añadirlo ya que la librería tick se vasa en la velocidad de preescales para ajustar los tiempos a 1sg, 1 minuto y una hora, tengo hecho algo pero me falta lo que comento para ajustarlo bien.

(https://i.imgur.com/7EOr62Y.png).

Pero al igual es un disparate lo que hago  :oops:



Título: Re:Dudas STM32CubeMX
Publicado por: KILLERJC en 08 de Junio de 2018, 13:08:04
En la funcion:

Código: C
  1. void SystemClock_Config(void)

Se llama a la funcion:

Código: C
  1. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

la funcion HAL_RCC_GetHCLKFreq actualiza el SystemCoreClock (con los preescalers) y devuelve su valor:

Código: C
  1. SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> POSITION_VAL(RCC_CFGR_HPRE)];
  2.   return SystemCoreClock;
Título: Re:Dudas STM32CubeMX
Publicado por: Thulsa Doom en 08 de Junio de 2018, 14:09:31
Me van a perdonar pero sigo sin verlo.   :oops:

(https://i.imgur.com/onAfVxm.png)
Título: Re:Dudas STM32CubeMX
Publicado por: KILLERJC en 08 de Junio de 2018, 23:56:33
Perdona, por no tener las fuentes utilice lo que encontre en internet, que son las fuentes colgadas por mbed.

Ahora en casa, con la ultima versiona de las HAL para F4 tengo que dentro de SystemConfig_Clock tenes esto:

Código: C
  1. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  2.   {
  3.     _Error_Handler(__FILE__, __LINE__);
  4.   }

Dentro de la funcion HAL_RCC_ClockConfig, tenes:

Código: C
  1. /* Update the SystemCoreClock global variable */
  2.   SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos];

Ta ves con la version cambio... Pero ahi se actualiza esa variable global.
Título: Re:Dudas STM32CubeMX
Publicado por: Thulsa Doom en 11 de Junio de 2018, 04:08:01
Bueno, sea como sea voy a tener que sentarme y hacer el diagrama de flujo.
Gracias por la ayuda  :lol:
Título: Re:Dudas STM32CubeMX
Publicado por: KILLERJC en 11 de Junio de 2018, 09:27:34
Bueno, sea como sea voy a tener que sentarme y hacer el diagrama de flujo.
Gracias por la ayuda  :lol:

Como consejo... no te pongas a revolver las HAL, a no ser que simplemente quieras entender como es que estan escritas. Pienso que vas a perder demasiado tiempo intentando entender todo. Y que luego vas a estar igual que antes.

Las HAL o Hardware Abstraction Layer, es justamente para eso, aislar al programador de todo lo demás, es aprender  que funciones hay, para que sirven, y usarlas. Y en caso de que no funcionen como vos queres ahí si podes investigar o crear la tuya a tu gusto.
Título: Re:Dudas STM32CubeMX
Publicado por: Thulsa Doom en 12 de Junio de 2018, 04:10:31
Vale, entendido, me lo tomaré con más calma  ;-), gracias por la ayuda