[SOLVED] embOS vs Peripheral Driver

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • [SOLVED] embOS vs Peripheral Driver

      Hallo ich bin Anfänger was MC Programmierung angeht und ich habe einen STM32f103RB auf einer Platine und einen Sensor den ich auslesen will.
      Ich habe bereits ein fertiges Projekt mit Segger Embedded Studio und der Standard Periphal Library (STM32F10x_StdPeriph_Driver) entworfen, das per I2C die Daten ausliest und per UART versendet.
      Ich wollte nun das Programm erweitern und mit embOS arbeiten, leider scheint die Lib des Drivers wieder mit dem Systick zu arbeiten, der vom embOS auch verwendet wird.
      Gibt es irgendeine Möglichkeit meinen Code aus dem vorherigen Projekt zu verwenden oder muss ich alle defines und Schnittstellen Implementierungen neu schreiben?
    • Hallo Philipp,

      wenn ich das richtig im Kopf habe wird der SysTick in der STM32F10x_StdPeriph_Driver nur für Timeouts benutzt.
      D.h. dort wird wahrscheinlich nur irgendein Zähler inkrementiert.
      Das einfachste wäre also den SysTick in der STM32F10x_StdPeriph_Driver nicht zu initialisieren und das Inkrementieren in unserem SysTick Interrupt Handler auszuführen.

      Alternativ könnte man natürlich auch für das embOS einfach einen anderen Hardware Timer benutzen.
      embOS ist nicht auf den SysTick angewiesen. Jeder andere Hardware Timer funktioniert auch.


      pbrinkmann wrote:

      Gibt es irgendeine Möglichkeit meinen Code aus dem vorherigen Projekt zu verwenden oder muss ich alle defines und Schnittstellen Implementierungen neu schreiben?
      Du musst auf keinen Fall irgend etwas neu implementieren. Die Benutzung von embOS mit solchen Libraries ist quasi Standard und wird von vielen Kunden benutzt.


      Viele Grüße,
      Til
    • Damit ich nicht falsch liege es handelt sich um diesen Code den ich ändern muss wenn ich den HW Timer für embOS ändere:

      Source Code: RTOSInit_STM32F103.c

      1. /*********************************************************************
      2. *
      3. * SysTick_Handler()
      4. *
      5. * Function description
      6. * This is the hardware timer exception handler.
      7. */
      8. void SysTick_Handler(void) {
      9. #if (OS_PROFILE != 0)
      10. if (SEGGER_SYSVIEW_DWT_IS_ENABLED() == 0u) {
      11. SEGGER_SYSVIEW_TickCnt++;
      12. }
      13. #endif
      14. OS_INT_EnterNestable();
      15. OS_TICK_Handle();
      16. #if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK)
      17. JLINKMEM_Process();
      18. #endif
      19. OS_INT_LeaveNestable();
      20. }
      21. /*********************************************************************
      22. *
      23. * OS_InitHW()
      24. *
      25. * Function description
      26. * Initialize the hardware required for embOS to run.
      27. */
      28. void OS_InitHW(void) {
      29. OS_INT_IncDI();
      30. //
      31. // Initialize NVIC vector table offset register if applicable for this device.
      32. // Might be necessary for RAM targets or application not running from 0x00.
      33. //
      34. #if (defined(__VTOR_PRESENT) && __VTOR_PRESENT == 1)
      35. SCB->VTOR = (OS_U32)&__Vectors;
      36. #endif
      37. //
      38. // Enable instruction and data cache if applicable for this device
      39. //
      40. #if (defined(__ICACHE_PRESENT) && __ICACHE_PRESENT == 1)
      41. SCB_EnableICache();
      42. #endif
      43. #if (defined(__DCACHE_PRESENT) && __DCACHE_PRESENT == 1)
      44. SCB_EnableDCache();
      45. #endif
      46. //
      47. // We assume PLL and core clock were already set by the SystemInit() function,
      48. // which was called from the startup code. Therefore, we just ensure the system
      49. // clock variable is updated and then set the periodic system timer tick for embOS.
      50. //
      51. SystemCoreClockUpdate(); // Update the system clock variable (might not have been set before)
      52. SysTick_Config(OS_TIMER_FREQ / OS_INT_FREQ); // Setup SysTick Timer
      53. NVIC_SetPriority(SysTick_IRQn, (1u << __NVIC_PRIO_BITS) - 2u); // Set the priority higher than the PendSV priority
      54. //
      55. // Inform embOS about the timer settings
      56. //
      57. {
      58. OS_SYSTIMER_CONFIG SysTimerConfig = {OS_TIMER_FREQ, OS_INT_FREQ, OS_TIMER_DOWNCOUNTING, _OS_GetHWTimerCycles, _OS_GetHWTimer_IntPending};
      59. OS_TIME_ConfigSysTimer(&SysTimerConfig);
      60. }
      61. //
      62. // Configure and initialize SEGGER SystemView
      63. //
      64. #if (OS_PROFILE != 0)
      65. SEGGER_SYSVIEW_Conf();
      66. #endif
      67. //
      68. // Initialize communication for embOSView
      69. //
      70. #if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK)
      71. JLINKMEM_SetpfOnRx(OS_COM_OnRx);
      72. JLINKMEM_SetpfOnTx(OS_COM_OnTx);
      73. JLINKMEM_SetpfGetNextChar(OS_COM_GetNextChar);
      74. #elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART)
      75. BSP_UART_Init(OS_UART, OS_BAUDRATE, BSP_UART_DATA_BITS_8, BSP_UART_PARITY_NONE, BSP_UART_STOP_BITS_1);
      76. BSP_UART_SetReadCallback(OS_UART, _OS_OnRX);
      77. BSP_UART_SetWriteCallback(OS_UART, (int(*)(unsigned int))OS_COM_OnTx);
      78. #endif
      79. OS_INT_DecRI();
      80. }
      Display All
    • Korrekt, der embOS Timer wird in der OS_InitHW() in der RTOSInit.c initialisiert.
      Dazu passend müssen dann einige Sachen in der RTOSInit.c angepasst werden damit alle embOS Timing Funktionen über den neuen Timer informiert sind.
      Das ist aber fast selbsterklärend (z.B. OS_TIMER_FREQ auf die richtige Frequenz des genutzten Timers setzen).

      Ich würde aber empfehlen den anderen Weg zu versuchen. Das ist eigentlich einfacher.
      Im Zweifelsfall kannst du uns auch dein Projekt schicken und wir schauen mal, ob wir dir weiterhelfen können.

      Am besten dann über unser Ticket System oder über die Support Emailadresse (findest du im embOS Manual im Kapitel Support).

      Viele Grüße,
      Til