Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. DMA - SPI - акселерометр

Ниже приведен пример кода работы DMA в связке с SPI, USART и акселерометром MEMS платы DISCOVERY. Процесс работы прост - считывается значения регистров акселерометра, и передается через DMA на периферию USART2, которая отправляет данные через переходник RS-232- >USB на компьютер, и визуализируется в виде графика на дисплее. Чтоб не загружать страницу, сюда небыли помещены #defin-ы с указателями на адреса регистров STM32F407VG, но по названиям думаю тут все понятно, какие регистры используются. О том как определять адреса регистров по документации читайте в начальных статьях по программированию STM32.


  1. void SysTick_Handler(void)
  2. {
  3. GPIOE_BSRR|=0x80000;
  4. DMA2_S3CR|=0x1;
  5. }
  6. void USART_TX(uint32_t y)
  7. {
  8. USART2_DR=y-127;// центрируем график с осей по центру экрана
  9. while (!(USART2_SR&0x80)==0x80){}
  10. }
  11. void SystemInit(void)
  12. {
  13. }
  14. uint8_t x[] ={0xA9,0};//Адрес регистров осей акселерометра которые будут считываться.
  15. uint8_t y[2];
  16. uint8_t z;
  17. uint32_t i;
  18. void USART_ini(void)
  19. {
  20. RCC_GPIO|=0x1;
  21. GPIOA_MODER|=0xA0;
  22. GPIOA_AFRL|=0x7700;
  23. RCC_UART2|=0x20000;
  24. USART2_BRR=0x683;
  25. USART2_CR3|=0x80;
  26. USART2_CR1|=0x8;
  27. NVIC_ISER1|=0x40;
  28. USART2_CR1|=0x2000;
  29. }
  30. void SPI_ini(void)
  31. {
  32. RCC_GPIO|=0x19;
  33. GPIOA_MODER|=0xA800;
  34. GPIOA_AFRL|=0x55500000;
  35. GPIOE_MODER|=0x40;
  36. GPIOE_PUPDR|=0x40;
  37. GPIOE_BSRR|=0x8;
  38. RCC_SPI1|=0x1000;
  39. SPI1_CR1 |= 0x0002 |0x0001;
  40. SPI1_CR1 |=0x0300|0x0028;
  41. SPI1_CR1 |=0x04;
  42. SPI1_CRCPR=7;
  43. SPI1_CR2|=0x3;
  44. SPI1_CR1|=0x0040;
  45. GPIOE_BSRR=0x80000;
  46. SPI1_DR=0x20;
  47. while (!(SPI1_SR&0x1)==0x1){};
  48. z=SPI1_DR;
  49. SPI1_DR=0x97;
  50. while (!(SPI1_SR&0x1)==0x01){}
  51. z=SPI1_DR;
  52. GPIOE_BSRR=0x8;
  53. }
  54. void DMA_ini(void)
  55. {
  56. DMA1_RCC|=0x200000;
  57. DMA2_RCC|=0x400000;
  58. //.....................TX
  59. DMA2_S3CR= 0x06000000;//DMA_Channel_3;
  60. DMA2_S3PAR=0x4001300C;//SPI->DR
  61. DMA2_S3M0AR= (uint32_t)x;
  62. DMA2_S3CR|= 0x40;//DMA_DIR_MemoryToPeripheral;
  63. DMA2_S3NDTR=2;
  64. DMA2_S3CR|=0x0400;
  65. DMA2_S3CR|=0x10000;
  66. //DMA2_S3CR|=0x8;
  67. //DMA2_S3CR|=0x100;//DMA_CIRCULAR
  68. DMA2_S3CR|=0x10;
  69. NVIC_ISER1=0x8000000;
  70. DMA2_S3CR|=0x10;
  71. //....................RX
  72. DMA2_S0CR= 0x06000000;//DMA_Channel_3;
  73. DMA2_S0PAR=0x4001300C;//SPI->DR
  74. DMA2_S0M0AR=(uint32_t)y;
  75. DMA2_S0CR|= 0;//peripheralToMemory
  76. DMA2_S0NDTR=2;
  77. DMA2_S0CR|=0x400;
  78. DMA2_S0CR|=0x10000;
  79. //DMA2_S0CR|=0x100;
  80. DMA2_S0CR|=0x10;
  81. NVIC_ISER1=0x1000000;
  82. DMA2_S0CR|=0x10;
  83. } void DMA2_Stream0_IRQHandler(void)//...........SPI->RX
  84. {
  85. GPIOE_BSRR=0x8;
  86. DMA2_LIFCR=0x20;
  87. USART_TX(y[1]);
  88. }
  89. void DMA2_Stream3_IRQHandler(void)//...........SPI->TX
  90. {
  91. GPIOE_BSRR=0x80000;
  92. if((DMA2_LISR&0x8000000)==0x8000000)
  93. {DMA2_LIFCR=0x8000000;
  94. DMA2_S0CR|=0x1;}
  95. }
  96. void DMA1_Stream6_IRQHandler(void)
  97. {
  98. if((DMA_HISR&0x200000)==0x200000)
  99. DMA_HIFCR=0x200000;
  100. }
  101. int main(void)
  102. {
  103. USART_ini();
  104. SPI_ini();
  105. DMA_ini();
  106. GPIOD_MODER|=0x55000000;
  107. GPIOD_OTYPER|=0x55000000;
  108. SysTic_RVR=0xFFF;
  109. SysTic_CVR=0x0;
  110. SysTic_CTRL_Status=0x10007;
  111. while(1)
  112. {
  113. GPIOD_ODR=0xF000;
  114. for(i=0;i<1000000;i++){};
  115. GPIOD_ODR=0x0;
  116. for(i=0;i<1000000;i++){};
  117. }
  118. }

Комментариев нет:

Отправить комментарий