Skocz do zawartości

[STM32] ADC i RTC nie współpracują Nucleo F103RB


Vroobee

Pomocna odpowiedź

Witam,
mam problem polegający na tym, że nie jest możliwa jednoczesna praca ADC i wewnętrznego RTC procka STM32F103RBT6. W momencie zadeklarowania typu wejścia dla pinu PA0 jako wejście GPIO_MODE_AIN RTC po prostu przestaje odliczać.

RTC wykorzystuje oscylator LSE 32,767 Hz i wykorzystuje rejestr APB1, natomiast ADC wykorzystuje rejestr APB2 i zegar systemowy. Poniżej wklejam listingi.

Jakby ktoś był łaskawy pomóc to byłbym wdzięczny 🙂

Plik main.c

#include <stm32f10x.h>
#include <stm32f10x_bkp.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_pwr.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_rtc.h>
#include <stdlib.h>

#include "../src/Delay/delay.h"
#include "../src/GPIO_Init/gpio_init.h"
#include "../src/USART/usart_init.h"
#include "../src/USART/usart_cmd.h"
#include "../src/RCC_Init/rcc_init.h"


void RTC_Config(void);
void NVIC_Config(void);
void RTC_IRQHandler(void);
void ADC_Config (void);

int main(void)
{
rcc_init();
gpio_init();
usart_init();
NVIC_Config();
RTC_Config();
ADC_Config();

GPIO_SetBits(GPIOA, GPIO_Pin_5);

while (1){
	char adc_buff[10] = {"0/0"};
	uint16_t adc = ADC_GetConversionValue(ADC1);
	itoa(adc, adc_buff, 10);
	usart_send_str(adc_buff);
	usart_send_str("\n\r");
}
}

void RTC_Config (void){
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(32767);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
RCC_ClearFlag();
}

void NVIC_Config(void){
NVIC_InitTypeDef nvic;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
nvic.NVIC_IRQChannel = RTC_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 1;
nvic.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&nvic);
}

void RTC_IRQHandler(void){
volatile uint32_t stanRTC;
static char stanRTCstring[17] = {"0/0"};
if (RTC_GetFlagStatus(RTC_IT_SEC) != RESET){
	RTC_WaitForLastTask();
	RTC_ClearITPendingBit(RTC_IT_SEC);
	GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)));
	stanRTC = RTC_GetCounter();
	itoa (stanRTC, stanRTCstring, 10);
	//usart_send_str(stanRTCstring);
	//usart_send_str("\r\n");
}
}

void ADC_Config (void){
ADC_InitTypeDef adc;
adc.ADC_ContinuousConvMode = ENABLE;
adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
adc.ADC_DataAlign = ADC_DataAlign_Right;
adc.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &adc);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5);
ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

Plik gpio_init.c

#include "stm32f10x.h"
#include "../src/GPIO_Init/gpio_init.h"


void gpio_init(void){
GPIO_InitTypeDef gpio;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

GPIO_StructInit(&gpio);

//********************USART***********************
	//USART Rx
gpio.GPIO_Pin = GPIO_Pin_3;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpio);
	//USART Tx
gpio.GPIO_Pin = GPIO_Pin_2;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &gpio);

//***********************SPI**************************
	//MOSI
gpio.GPIO_Pin = GPIO_Pin_7;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio);
	//MISO
gpio.GPIO_Pin = GPIO_Pin_6;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio);
	//SCK
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio);

//*****************GPIO**********************
//User_LED
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &gpio);

//ADC0
gpio.GPIO_Pin = GPIO_Pin_0;
gpio.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &gpio);

}

Plik rcc_init.c

#include "../RCC_Init/rcc_init.h"

#include "stm32f10x.h"

void rcc_init(void){
 ErrorStatus HSEStartUpStatus;
 RCC_DeInit();
 RCC_HSEConfig(RCC_HSE_ON);
 HSEStartUpStatus = RCC_WaitForHSEStartUp();
 if(HSEStartUpStatus == SUCCESS){
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
   FLASH_SetLatency(FLASH_Latency_2);
   RCC_HCLKConfig(RCC_SYSCLK_Div1);
   RCC_PCLK2Config(RCC_HCLK_Div1);
   RCC_PCLK1Config(RCC_HCLK_Div2);
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
   RCC_PLLCmd(ENABLE);
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   while(RCC_GetSYSCLKSource() != 0x08);
 } else {
 }
}

[ Dodano: 24-07-2016, 14:49 ]

Rozwiązane (chyba). Wystarczyło dopisać jedną linijkę do funkcji inicjalizacyjnej przerwań

void NVIC_Config(void){
NVIC_InitTypeDef nvic;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

nvic.NVIC_IRQChannel = RTC_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 1;
nvic.NVIC_IRQChannelSubPriority = 0;
nvic.NVIC_IRQChannelCmd = ENABLE;    //ta linijka
NVIC_Init(&nvic);
}
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!

Anonim
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.