Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

102 строки
2.5 KiB

  1. #include "hal.h"
  2. #include <libopencm3/stm32/rcc.h>
  3. #include <libopencm3/stm32/rng.h>
  4. #include <libopencm3/stm32/gpio.h>
  5. #include <libopencm3/stm32/usart.h>
  6. #include <libopencm3/cm3/nvic.h>
  7. #include <libopencm3/stm32/flash.h>
  8. #include <libopencm3/cm3/systick.h>
  9. /* 24 MHz */
  10. const struct rcc_clock_scale benchmarkclock = {
  11. .pllm = 8, //VCOin = HSE / PLLM = 1 MHz
  12. .plln = 192, //VCOout = VCOin * PLLN = 192 MHz
  13. .pllp = 8, //PLLCLK = VCOout / PLLP = 24 MHz (low to have 0WS)
  14. .pllq = 4, //PLL48CLK = VCOout / PLLQ = 48 MHz (required for USB, RNG)
  15. .pllr = 0,
  16. .hpre = RCC_CFGR_HPRE_DIV_NONE,
  17. .ppre1 = RCC_CFGR_PPRE_DIV_2,
  18. .ppre2 = RCC_CFGR_PPRE_DIV_NONE,
  19. .pll_source = RCC_CFGR_PLLSRC_HSE_CLK,
  20. .voltage_scale = PWR_SCALE1,
  21. .flash_config = FLASH_ACR_DCEN | FLASH_ACR_ICEN | FLASH_ACR_LATENCY_0WS,
  22. .ahb_frequency = 24000000,
  23. .apb1_frequency = 12000000,
  24. .apb2_frequency = 24000000,
  25. };
  26. static void clock_setup(const enum clock_mode clock)
  27. {
  28. switch(clock)
  29. {
  30. case CLOCK_BENCHMARK:
  31. rcc_clock_setup_pll(&benchmarkclock);
  32. break;
  33. case CLOCK_FAST:
  34. default:
  35. rcc_clock_setup_pll(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]);
  36. break;
  37. }
  38. rcc_periph_clock_enable(RCC_GPIOA);
  39. rcc_periph_clock_enable(RCC_USART2);
  40. rcc_periph_clock_enable(RCC_DMA1);
  41. rcc_periph_clock_enable(RCC_RNG);
  42. flash_prefetch_enable();
  43. }
  44. static void gpio_setup(void)
  45. {
  46. gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO2 | GPIO3);
  47. gpio_set_af(GPIOA, GPIO_AF7, GPIO2 | GPIO3);
  48. }
  49. static void usart_setup(int baud)
  50. {
  51. usart_set_baudrate(USART2, baud);
  52. usart_set_databits(USART2, 8);
  53. usart_set_stopbits(USART2, USART_STOPBITS_1);
  54. usart_set_mode(USART2, USART_MODE_TX_RX);
  55. usart_set_parity(USART2, USART_PARITY_NONE);
  56. usart_set_flow_control(USART2, USART_FLOWCONTROL_NONE);
  57. usart_enable(USART2);
  58. }
  59. static void systick_setup(void)
  60. {
  61. systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
  62. systick_set_reload(16777215);
  63. systick_interrupt_enable();
  64. systick_counter_enable();
  65. }
  66. static void send_USART_str(const char* in)
  67. {
  68. int i;
  69. for(i = 0; in[i] != 0; i++) {
  70. usart_send_blocking(USART2, *(unsigned char *)(in+i));
  71. }
  72. usart_send_blocking(USART2, '\n');
  73. }
  74. void hal_setup(const enum clock_mode clock)
  75. {
  76. clock_setup(clock);
  77. gpio_setup();
  78. usart_setup(115200);
  79. systick_setup();
  80. rng_enable();
  81. }
  82. void hal_send_str(const char* in)
  83. {
  84. send_USART_str(in);
  85. }
  86. static volatile unsigned long long overflowcnt = 0;
  87. void sys_tick_handler(void)
  88. {
  89. ++overflowcnt;
  90. }