Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f10x.h"
- #include "math.h"
- #define BUFFER_LEN 1000
- #define MAX_VAL 65535
- void send_char(char c)
- {
- while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
- USART_SendData(USART2, c);
- }
- int __io_putchar(int c)
- {
- if (c=='\n')
- send_char('\r');
- send_char(c);
- return c;
- }
- /*FUNKCJA CONFIGURACYJNA*/
- void configRCC()
- {
- /*KOMUNIKATY O BLEDACH*/
- //przywrocenie stanu poczatkowego
- ErrorStatus status ;
- //przelaczenia na taktowania
- RCC_DeInit() ;
- //oczekiwania na rozpoczecie pracy przez rezonator
- RCC_HSEConfig(RCC_HSE_ON);
- //sprawdzanie poprawnego dziania
- status = RCC_WaitForHSEStartUp() ;
- if(status == SUCCESS )
- {
- /*AKTYWACJA BUFORA PAMIECI FLASH*/
- //opoznienie dostepu do pamieci (2 cykle)
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable) ;
- //zegar rdzenia
- FLASH_SetLatency(FLASH_Latency_2) ;
- //taktowanie magistrali APB2
- RCC_HCLKConfig(RCC_SYSCLK_Div1) ;
- //taktowanie magistrali APB1
- RCC_PCLK2Config(RCC_HCLK_Div1) ;
- //mnoznik czestotliwosci -> 8MHz * 9 = 72MHz
- RCC_PCLK1Config(RCC_HCLK_Div2);
- //aktywacja petli PLL
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- //oczekiwanie na gotowosc PLL//oczekiwanie na gotowosc PLL
- RCC_PLLCmd(ENABLE);
- //wybranie sygnalu pochodzacego z PLL jako sygnalu systemowego
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){;}
- //ocekiwanie na przelaczenie taktowania na PLL
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- while(RCC_GetSYSCLKSource() != 0x08) {;}
- }
- }
- void initDACs()
- {
- //struktura inicjujaca
- SPI_InitTypeDef spiInitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- //dolaczenie sygnalu taktujacego
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 , ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
- //ustawianie parametrów struktury inicjujacej
- spiInitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
- spiInitStructure.SPI_CPHA = SPI_CPHA_1Edge;
- spiInitStructure.SPI_CPOL = SPI_CPOL_Low;
- spiInitStructure.SPI_DataSize = SPI_DataSize_16b;
- spiInitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
- spiInitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
- spiInitStructure.SPI_Mode = SPI_Mode_Master;
- spiInitStructure.SPI_NSS = SPI_NSS_Soft;
- //zapisanie struktury
- SPI_Init(SPI2, &spiInitStructure);
- SPI_Cmd (SPI2, ENABLE) ;
- //konfiguracja - PORT A
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- //konfiguracja - port B
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- //zapis do lewego kanalu
- void writeDAC_R(__IO uint16_t val)
- {
- __IO uint32_t speed;
- //przetworzenie wartosci
- val &= 0x0FFF ; val |= 0x7000;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
- GPIO_ResetBits(GPIOB, GPIO_Pin_12);
- SPI_I2S_SendData(SPI2, val);
- for(speed=0 ; speed<4 ; speed++){;}
- GPIO_SetBits(GPIOB, GPIO_Pin_12);
- }
- void writeDAC_L(__IO uint16_t val)
- {
- __IO uint32_t speed;
- //przetworzenie wartosci
- val &= 0x0FFF ; val |= 0x7000;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
- GPIO_ResetBits(GPIOA, GPIO_Pin_8);
- SPI_I2S_SendData(SPI2, val);
- for(speed=0 ; speed<4 ; speed++){;}
- GPIO_SetBits(GPIOA, GPIO_Pin_8);
- }
- void gpioInit()
- {
- //struktura inicjujaca
- GPIO_InitTypeDef GPIO_InitStructure;
- //dolacz sygnal zegarowy do modulu portu A oraz B
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
- //konfiguracja diod LED - port B
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void initADC(){
- ADC_InitTypeDef adc;
- ADC_StructInit(&adc);
- adc.ADC_ContinuousConvMode = ENABLE; // tryb ciagly
- adc.ADC_NbrOfChannel = 2; // 2 kanaly
- adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // brak wyzwalania, start programowy
- ADC_Init(ADC1, &adc);
- ADC_Init(ADC2, &adc);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
- ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 2, ADC_SampleTime_1Cycles5);
- ADC_Cmd(ADC1, ENABLE);
- ADC_Cmd(ADC2, ENABLE);
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- ADC_SoftwareStartConvCmd(ADC2, ENABLE);
- }
- /**
- *
- **/
- void led_resetAll(){
- GPIO_ResetBits(GPIOA,GPIO_Pin_12);
- GPIO_ResetBits(GPIOA,GPIO_Pin_11);
- GPIO_ResetBits(GPIOB,GPIO_Pin_9);
- GPIO_ResetBits(GPIOB,GPIO_Pin_8);
- GPIO_ResetBits(GPIOB,GPIO_Pin_7);
- GPIO_ResetBits(GPIOB,GPIO_Pin_6);
- GPIO_ResetBits(GPIOB,GPIO_Pin_5);
- }
- /**
- * LED tryb domyślny
- **/
- void led_default(uint16_t adc_l, uint16_t adc_r) {
- // allways on
- led_resetAll();
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
- // lewa
- if (adc_l>2000)
- GPIO_SetBits(GPIOB,GPIO_Pin_5);
- if (adc_l>(2500))
- GPIO_SetBits(GPIOA,GPIO_Pin_12);
- if (adc_l>(3500))
- GPIO_SetBits(GPIOA,GPIO_Pin_11);
- // prawa
- if (adc_r>2000)
- GPIO_SetBits(GPIOB,GPIO_Pin_7);
- if (adc_r>(2500))
- GPIO_SetBits(GPIOB,GPIO_Pin_8);
- if (adc_r>(3500))
- GPIO_SetBits(GPIOB,GPIO_Pin_9);
- }
- //ooooooooooooooooooladddddddddawid
- int xS0 = 0;
- int stan_przycisk_S0 = 0;
- __IO uint32_t j;
- int mode_s0;
- void przyciskS0 (uint16_t adc_l, uint16_t adc_r) {
- if (mode_s0 == 1){ xS0++; }
- xS0 = xS0 % 3;
- if (xS0 == 0){
- led_resetAll();
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
- // lewa
- if (adc_l>2000)
- GPIO_SetBits(GPIOB,GPIO_Pin_5);
- if (adc_l>(2500))
- GPIO_SetBits(GPIOA,GPIO_Pin_12);
- if (adc_l>(3500))
- GPIO_SetBits(GPIOA,GPIO_Pin_11);
- // prawa
- if (adc_r>2000)
- GPIO_SetBits(GPIOB,GPIO_Pin_7);
- if (adc_r>(2500))
- GPIO_SetBits(GPIOB,GPIO_Pin_8);
- if (adc_r>(3500))
- GPIO_SetBits(GPIOB,GPIO_Pin_9);
- }
- if (xS0 == 1){
- led_resetAll();
- if (adc_l>2000)
- GPIO_SetBits(GPIOB,GPIO_Pin_9);
- if (adc_l>(2250))
- GPIO_SetBits(GPIOB,GPIO_Pin_8);
- if (adc_l>(2500))
- GPIO_SetBits(GPIOB,GPIO_Pin_7);
- if (adc_l>(2750))
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
- if (adc_l>3000)
- GPIO_SetBits(GPIOB,GPIO_Pin_5);
- if (adc_l>(3250))
- GPIO_SetBits(GPIOA,GPIO_Pin_12);
- if (adc_l>(3500))
- GPIO_SetBits(GPIOA,GPIO_Pin_11);
- }
- if (xS0 == 2){
- led_resetAll();
- if (adc_r>2000)
- GPIO_SetBits(GPIOB,GPIO_Pin_9);
- if (adc_r>(2250))
- GPIO_SetBits(GPIOB,GPIO_Pin_8);
- if (adc_r>(2500))
- GPIO_SetBits(GPIOB,GPIO_Pin_7);
- if (adc_r>(2750))
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
- if (adc_r>3000)
- GPIO_SetBits(GPIOB,GPIO_Pin_5);
- if (adc_r>(3250))
- GPIO_SetBits(GPIOA,GPIO_Pin_12);
- if (adc_r>(3500))
- GPIO_SetBits(GPIOA,GPIO_Pin_11);
- }
- }
- int main(void)
- {
- GPIO_InitTypeDef gpio;
- USART_InitTypeDef uart;
- gpioInit();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
- gpio.GPIO_Pin = GPIO_Pin_0;
- gpio.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &gpio);
- USART_StructInit(&uart);
- uart.USART_BaudRate = 9600;
- USART_Init(USART2, &uart);
- USART_Cmd(USART2, ENABLE);
- initDACs() ;
- initADC() ;
- //funckje dawidola
- uint16_t tab[BUFFER_LEN];
- int i=0;
- for(i=0;i<BUFFER_LEN;i++)
- tab[i] = 0;
- while (1)
- {
- uint16_t adc_l = ADC_GetConversionValue(ADC1);
- uint16_t adc_r = ADC_GetConversionValue(ADC2);
- writeDAC_L(adc_l);
- writeDAC_R(adc_r);
- // Przelaczanie pomiedzy kanalami srodek, lewy, prawy
- if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))
- {
- mode_s0 = 1; // jezeli wcisnelismy przycisk to stan=1
- for(j=0; j<0x7FFFFF; j++); //opoznienie 1sekundowy
- } else { mode_s0 = 0; }
- przyciskS0(adc_l,adc_r);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement