Skocz do zawartości

Kod do watchdogów z stm32


Teigrekpe

Pomocna odpowiedź

Proszę serdecznie o sprawdzenie kodu(zaznaczone na zielono) do zadań poniżej.

Jeżeli ktoś ma doświadczenie przy programowaniu stm32 Proszę o kontakt tutaj lub mailowo: teigrekpe - gmail

Sprawa jest ważna na pewno się odwdzięczę. 🙂

Temat zadania:

3.1. Zadanie 1 (1 punkt)

W dostępnym projekcie ustawić częstość wyzwalania zgodnie z algorytmem:

t wyzw = 1 + 300 x (nr stanowiska)

i wysterować wybraną diodę LED sygnalizującą momenty dokonanych konwersji.

3.2. Zadanie 2 (2 punkty)

Wykorzystać analogowy watchdog do kontroli poziomu mierzonego napięcia.

Ustalić wartości progów:

dolny: U Lprog = 0[V] + 0.15 x (nr stanowiska)

górny U Hprog = 1.5[V] + 0.15 x (nr stanowiska)

Przekroczenie progów sygnalizować zaświeceniem wybranej diody LED.

 

 

 

 

#include "stm32f10x.h"
#include "lcd4bit.h"
#include <stdio.h>

void RCC_Conf(void);
void NVIC_Conf(void);
void GPIO_Conf(void);
void TIMER1(void);
void ADC1_Conf(void);

ADC_InitTypeDef ADC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

uint16_t ADC1Val = 0;
char wynik[7];
unsigned char a=0;

int main(void)
{	

RCC_Conf(); 
NVIC_Conf();
GPIO_Conf();
TIMER1();
ADC1_Conf();

LCD_Init();
LCD_Clear();

TIM1->CR1|= 0x00000001;	 //aktywacja timera TIM1

while(1)
{

[color=red]if(ADC_SR_ADW==1)	//wykryto sygnal z komparatora
{
GPIOB->ODR|=0x80000000;	//zapalamy diode iformujac o przekroczeniu progow
ADC_SR_ADW=0;	//kasujemy flagê komparatora
}[/color]
DC1Val = ADC_GetConversionValue(ADC1) * 0.807;
sprintf(wynik, "%d,%03d V", ADC1Val / 1000, ADC1Val % 1000);
LCD_Clear();
LCD_GoTo(0,0);
LCD_SendText("NAPIECIE NA P1:");
LCD_GoTo(1,3);
LCD_SendText((uint8_t*)wynik);
delay_ms(500);

}	
}

void GPIO_Conf(void)
{

GPIOA->CRL=0x44444444;	 // ustaw. wej. cyfrowe na PCA(3..0)
GPIOB->CRH=0x33333333;	 // ustaw. sterow. diodami LED na PCB(15..8)
GPIOC->CRL=0x44404444;	 // pomiar analog. na wej. PC4

}

void RCC_Conf(void)	//ustawia zewnetrzny oscylator na 8MHz
{

RCC_DeInit();	 // reset ustawien RCC
RCC->CR=RCC_CR_HSEON;	 // wlaczenie HSE
while((RCC_CR_HSERDY)==0);	 // czekaj az zewn. osc. sie ustabil.

RCC->CFGR = 0x00154400;	 // ustalenie prescaler?w

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2); // zwloka dla pamieci Flash

RCC->CR |= 0x01000000; // wlaczenie PLL 
while((RCC_CR_PLLRDY)==0);	 // czekaj az PLL sie ustabil.

RCC->CFGR |= 0x00000002; // w?. PLL na SYSCLK
while(RCC_GetSYSCLKSource() != 0x08); // czekaj az PLL bedzie sygnalem zegarowym systemu

//wlaczenie sygn. zegara na peryferia
RCC->APB2ENR=RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPBEN|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_TIM1EN|RCC_APB2ENR_ADC1EN;
RCC->APB1ENR=RCC_APB1ENR_SPI2EN;	 // wlaczenie SPI dla LCD

}

void NVIC_Conf(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM 
// Jezeli tablica wektorow w RAM, to ustaw jej adres na 0x20000000
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else // VECT_TAB_FLASH
// W przeciwnym wypadku ustaw na 0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 
#endif

// Wlacz przerwanie od TIM1
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}	

void TIMER1(void)
{
[color=red]int x; //numer stanowiska
TIM1->PSC = 5599;	 //fclk = 56MHz/5600 = 10kHz
TIM1->ARR = 9999+300*x;	 //podzielnik -> 10kHz
TIM1->CR1|= 0x00000010;	 //dekrementcja licznika
TIM1->DIER|= 0x00000002;	 //aktyw. przerwania od CC1[/color]

}

void ADC1_Conf(void)
{

[color=red]//konfiguracja kompratatora analogowego
//warttosc podajemy w postaci binarnej zgodnie z zaleznoscia: Val_bin=Voltage*1024/3.3V
//przykladowo dla U=0.6V mamy Val_bin=0.6*1024/3.3=186 (numer stanowiska 4)
ADC_LTR = 186;
//dla 1,5+0,6V=2.1V mamy Val_bin=2.1*1024/3.3 = 652
ADC_HTR = 652;
//ustawienie ktory kanal ma byc obserwowany przez watchdoga
ADC1->CR1|=(1<<AWDSGL)|(1<<AWDEN)|(1<<JAWDEN);
//wybranie kanalu 4 do obserwacji
ADC1->CR1|= 0x00000004;[/color]

//======================================================================
ADC1->CR2|= 0x00100000;	 //wyzw. zewn. od timera TIM1 kanalu CC1,
//wyrown. do prawej
ADC1->SQR3|= 0x0000000E;	 //kanal 14
ADC1->CR2|= 0x00000001;	 //aktywacja ADC1

ADC1->CR2|= 0x00000008;	 //reset kalibracji
while((ADC_CR2_RSTCAL)==1);	 //czekaj na zakoncz. resetu kalibracji

ADC1->CR2|= 0x00000004;	 //kalibracja
while((ADC_CR2_CAL)==1);	 //czekaj na zakoncz. kalibracji

}
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.