Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.25 KB | None | 0 0
  1. #include "stm32f10x.h"
  2. #include "math.h"
  3. #define BUFFER_LEN 1000
  4.  
  5. #define MAX_VAL 65535
  6.  
  7. void send_char(char c)
  8. {
  9. while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  10. USART_SendData(USART2, c);
  11. }
  12.  
  13. int __io_putchar(int c)
  14. {
  15. if (c=='\n')
  16. send_char('\r');
  17. send_char(c);
  18. return c;
  19. }
  20.  
  21. /*FUNKCJA CONFIGURACYJNA*/
  22. void configRCC()
  23. {
  24. /*KOMUNIKATY O BLEDACH*/
  25. //przywrocenie stanu poczatkowego
  26. ErrorStatus status ;
  27. //przelaczenia na taktowania
  28. RCC_DeInit() ;
  29. //oczekiwania na rozpoczecie pracy przez rezonator
  30. RCC_HSEConfig(RCC_HSE_ON);
  31. //sprawdzanie poprawnego dziania
  32. status = RCC_WaitForHSEStartUp() ;
  33. if(status == SUCCESS )
  34. {
  35. /*AKTYWACJA BUFORA PAMIECI FLASH*/
  36. //opoznienie dostepu do pamieci (2 cykle)
  37. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable) ;
  38. //zegar rdzenia
  39. FLASH_SetLatency(FLASH_Latency_2) ;
  40. //taktowanie magistrali APB2
  41. RCC_HCLKConfig(RCC_SYSCLK_Div1) ;
  42. //taktowanie magistrali APB1
  43. RCC_PCLK2Config(RCC_HCLK_Div1) ;
  44. //mnoznik czestotliwosci -> 8MHz * 9 = 72MHz
  45. RCC_PCLK1Config(RCC_HCLK_Div2);
  46. //aktywacja petli PLL
  47. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  48. //oczekiwanie na gotowosc PLL//oczekiwanie na gotowosc PLL
  49. RCC_PLLCmd(ENABLE);
  50. //wybranie sygnalu pochodzacego z PLL jako sygnalu systemowego
  51. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){;}
  52. //ocekiwanie na przelaczenie taktowania na PLL
  53. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  54. while(RCC_GetSYSCLKSource() != 0x08) {;}
  55. }
  56. }
  57.  
  58. void initDACs()
  59. {
  60. //struktura inicjujaca
  61. SPI_InitTypeDef spiInitStructure;
  62. GPIO_InitTypeDef GPIO_InitStructure;
  63. //dolaczenie sygnalu taktujacego
  64. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 , ENABLE);
  65. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  66. //ustawianie parametrów struktury inicjujacej
  67. spiInitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  68. spiInitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  69. spiInitStructure.SPI_CPOL = SPI_CPOL_Low;
  70. spiInitStructure.SPI_DataSize = SPI_DataSize_16b;
  71. spiInitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  72. spiInitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  73. spiInitStructure.SPI_Mode = SPI_Mode_Master;
  74. spiInitStructure.SPI_NSS = SPI_NSS_Soft;
  75. //zapisanie struktury
  76. SPI_Init(SPI2, &spiInitStructure);
  77. SPI_Cmd (SPI2, ENABLE) ;
  78. //konfiguracja - PORT A
  79. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  80. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  81. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  82. GPIO_Init(GPIOA, &GPIO_InitStructure);
  83. //konfiguracja - port B
  84. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  85. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
  86. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  87. GPIO_Init(GPIOB, &GPIO_InitStructure);
  88. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  89. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  90. GPIO_Init(GPIOB, &GPIO_InitStructure);
  91. }
  92.  
  93. //zapis do lewego kanalu
  94. void writeDAC_R(__IO uint16_t val)
  95. {
  96. __IO uint32_t speed;
  97. //przetworzenie wartosci
  98. val &= 0x0FFF ; val |= 0x7000;
  99. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  100. GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  101. SPI_I2S_SendData(SPI2, val);
  102. for(speed=0 ; speed<4 ; speed++){;}
  103. GPIO_SetBits(GPIOB, GPIO_Pin_12);
  104. }
  105.  
  106. void writeDAC_L(__IO uint16_t val)
  107. {
  108. __IO uint32_t speed;
  109. //przetworzenie wartosci
  110. val &= 0x0FFF ; val |= 0x7000;
  111. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  112. GPIO_ResetBits(GPIOA, GPIO_Pin_8);
  113. SPI_I2S_SendData(SPI2, val);
  114. for(speed=0 ; speed<4 ; speed++){;}
  115. GPIO_SetBits(GPIOA, GPIO_Pin_8);
  116. }
  117.  
  118.  
  119.  
  120. void gpioInit()
  121. {
  122. //struktura inicjujaca
  123. GPIO_InitTypeDef GPIO_InitStructure;
  124. //dolacz sygnal zegarowy do modulu portu A oraz B
  125. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  126. //konfiguracja diod LED - port B
  127. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  128. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  129. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  130. GPIO_Init(GPIOB, &GPIO_InitStructure);
  131.  
  132. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
  133. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  134. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  135. GPIO_Init(GPIOA, &GPIO_InitStructure);
  136. }
  137.  
  138. void initADC(){
  139. ADC_InitTypeDef adc;
  140. ADC_StructInit(&adc);
  141. adc.ADC_ContinuousConvMode = ENABLE; // tryb ciagly
  142. adc.ADC_NbrOfChannel = 2; // 2 kanaly
  143. adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // brak wyzwalania, start programowy
  144. ADC_Init(ADC1, &adc);
  145. ADC_Init(ADC2, &adc);
  146. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
  147. ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 2, ADC_SampleTime_1Cycles5);
  148. ADC_Cmd(ADC1, ENABLE);
  149. ADC_Cmd(ADC2, ENABLE);
  150. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  151. ADC_SoftwareStartConvCmd(ADC2, ENABLE);
  152. }
  153. /**
  154. *
  155. **/
  156. void led_resetAll(){
  157. GPIO_ResetBits(GPIOA,GPIO_Pin_12);
  158. GPIO_ResetBits(GPIOA,GPIO_Pin_11);
  159. GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  160. GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  161. GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  162. GPIO_ResetBits(GPIOB,GPIO_Pin_6);
  163. GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  164. }
  165. /**
  166. * LED tryb domyślny
  167. **/
  168. void led_default(uint16_t adc_l, uint16_t adc_r) {
  169. // allways on
  170. led_resetAll();
  171. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  172. // lewa
  173. if (adc_l>2000)
  174. GPIO_SetBits(GPIOB,GPIO_Pin_5);
  175. if (adc_l>(2500))
  176. GPIO_SetBits(GPIOA,GPIO_Pin_12);
  177. if (adc_l>(3500))
  178. GPIO_SetBits(GPIOA,GPIO_Pin_11);
  179. // prawa
  180. if (adc_r>2000)
  181. GPIO_SetBits(GPIOB,GPIO_Pin_7);
  182. if (adc_r>(2500))
  183. GPIO_SetBits(GPIOB,GPIO_Pin_8);
  184. if (adc_r>(3500))
  185. GPIO_SetBits(GPIOB,GPIO_Pin_9);
  186. }
  187.  
  188.  
  189. //ooooooooooooooooooladddddddddawid
  190.  
  191. int xS0 = 0;
  192. int stan_przycisk_S0 = 0;
  193. __IO uint32_t j;
  194. int mode_s0;
  195.  
  196.  
  197.  
  198. void przyciskS0 (uint16_t adc_l, uint16_t adc_r) {
  199. if (mode_s0 == 1){ xS0++; }
  200.  
  201. xS0 = xS0 % 3;
  202.  
  203. if (xS0 == 0){
  204. led_resetAll();
  205. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  206. // lewa
  207. if (adc_l>2000)
  208. GPIO_SetBits(GPIOB,GPIO_Pin_5);
  209. if (adc_l>(2500))
  210. GPIO_SetBits(GPIOA,GPIO_Pin_12);
  211. if (adc_l>(3500))
  212. GPIO_SetBits(GPIOA,GPIO_Pin_11);
  213. // prawa
  214. if (adc_r>2000)
  215. GPIO_SetBits(GPIOB,GPIO_Pin_7);
  216. if (adc_r>(2500))
  217. GPIO_SetBits(GPIOB,GPIO_Pin_8);
  218. if (adc_r>(3500))
  219. GPIO_SetBits(GPIOB,GPIO_Pin_9);
  220. }
  221.  
  222. if (xS0 == 1){
  223. led_resetAll();
  224. if (adc_l>2000)
  225. GPIO_SetBits(GPIOB,GPIO_Pin_9);
  226. if (adc_l>(2250))
  227. GPIO_SetBits(GPIOB,GPIO_Pin_8);
  228. if (adc_l>(2500))
  229. GPIO_SetBits(GPIOB,GPIO_Pin_7);
  230. if (adc_l>(2750))
  231. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  232. if (adc_l>3000)
  233. GPIO_SetBits(GPIOB,GPIO_Pin_5);
  234. if (adc_l>(3250))
  235. GPIO_SetBits(GPIOA,GPIO_Pin_12);
  236. if (adc_l>(3500))
  237. GPIO_SetBits(GPIOA,GPIO_Pin_11);
  238. }
  239.  
  240. if (xS0 == 2){
  241. led_resetAll();
  242. if (adc_r>2000)
  243. GPIO_SetBits(GPIOB,GPIO_Pin_9);
  244. if (adc_r>(2250))
  245. GPIO_SetBits(GPIOB,GPIO_Pin_8);
  246. if (adc_r>(2500))
  247. GPIO_SetBits(GPIOB,GPIO_Pin_7);
  248. if (adc_r>(2750))
  249. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  250. if (adc_r>3000)
  251. GPIO_SetBits(GPIOB,GPIO_Pin_5);
  252. if (adc_r>(3250))
  253. GPIO_SetBits(GPIOA,GPIO_Pin_12);
  254. if (adc_r>(3500))
  255. GPIO_SetBits(GPIOA,GPIO_Pin_11);
  256. }
  257. }
  258.  
  259.  
  260. int main(void)
  261. {
  262. GPIO_InitTypeDef gpio;
  263.  
  264. USART_InitTypeDef uart;
  265.  
  266. gpioInit();
  267. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  268. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
  269.  
  270. RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  271.  
  272. gpio.GPIO_Pin = GPIO_Pin_0;
  273. gpio.GPIO_Mode = GPIO_Mode_AIN;
  274. GPIO_Init(GPIOA, &gpio);
  275.  
  276.  
  277. USART_StructInit(&uart);
  278. uart.USART_BaudRate = 9600;
  279. USART_Init(USART2, &uart);
  280. USART_Cmd(USART2, ENABLE);
  281.  
  282. initDACs() ;
  283. initADC() ;
  284.  
  285.  
  286. //funckje dawidola
  287.  
  288.  
  289. uint16_t tab[BUFFER_LEN];
  290. int i=0;
  291. for(i=0;i<BUFFER_LEN;i++)
  292. tab[i] = 0;
  293. while (1)
  294. {
  295. uint16_t adc_l = ADC_GetConversionValue(ADC1);
  296. uint16_t adc_r = ADC_GetConversionValue(ADC2);
  297. writeDAC_L(adc_l);
  298. writeDAC_R(adc_r);
  299.  
  300.  
  301. // Przelaczanie pomiedzy kanalami srodek, lewy, prawy
  302. if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))
  303. {
  304. mode_s0 = 1; // jezeli wcisnelismy przycisk to stan=1
  305. for(j=0; j<0x7FFFFF; j++); //opoznienie 1sekundowy
  306. } else { mode_s0 = 0; }
  307.  
  308. przyciskS0(adc_l,adc_r);
  309.  
  310.  
  311.  
  312.  
  313. }
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement