Начинаю ради интереса осваивать stm32 на примере stm32vl discovery (stm32f100rb), столкнулся с парой проблем - подскажите куда копать
1) Если в проект добавить st'шные библиотеки на периферию старше 3ей версии, то радостно отваливается симулятор в дебаге (как чистый симулятор, так и просмотр периферии при дебаге на аппаратном устройстве - доступна только вкладка core peripherals) ругаясь на 65ую ошибку запрета доступа к памяти - погуглив нашелся способ разрешить доступ - не помог даже полный доступ ко всей памяти:
Код:
|
Include "C:\\11\\dbg.ini"
MAP 0x0, 0xFFFFFFFF READ WRITE // allow R/W access to IO space
*** error 65: access violation at 0x0000000C : no 'read' permission |
Все пути к inc прописаны правильно, все компилируется и собирается без проблем
Интересно что да-же родные st'шные примеры, включая примерный проект под uVision страдают аналогичной болячкой.
Дебаг удалось запустить на кривой комбинации файлов разных версий, но начались проблемы с отладкой (через раз не видит содержимое некоторых регистров и т.п.)
Вопрос - как победить библиотеку? Может подкините архив с uVision'овским проектом + stm32f10x_stdperiph_lib (желательно 3.3 или 3.4) + cmsis в рабочем виде? замучался ужасно
2) И второй вопрос
Пытаюсь разобраться с ADC - пробовал писать по смотря в даташит и по аналогии с мегой - не получилось
Начал разбираться на примерах ... либо следствие проблемы из пункта 1) либо я что-то делаю не так ибо то работает правильно то не работает
Например (код найден в сети, немного подправлен)
Код:
|
#include "stm32F10x.h"
#define CCR_ENABLE_Set ((uint32_t)0x00000001)
void setsystemclock(void);
__IO uint16_t ADCConvertedValue;
int temp=0;
int main(void)
{
int temp=0;
setsystemclock(); //set system clock to 24Mhz3
//rcc CONFIGURATION
RCC-›AHBENR=RCC_AHBENR_DMA1EN; //dma clock enable
RCC-›APB2ENR=RCC_APB2ENR_IOPCEN | RCC_APB2ENR_ADC1EN; //portc and ADC clock enable.
//GPIO CONFIGURATION
GPIOC-›CRL=0x0;// ADC1_IN14
//ADC configuration
// ADC1-›CR1=ADC_CR1_SCAN;
ADC1-›CR2=ADC_CR2_ALIGN | ADC_CR2_EXTSEL ; //data align right , software start
ADC1-›SMPR1=0x00005000;// 55 cycles conversion time
ADC1-›SQR3=0xe;//14Ch
ADC1-›SQR1|=ADC_SQR1_SQ14_0;
// ADC1-›CR2 |=ADC_CR1_SCAN ; /* Enable ADC1 DMA */
ADC1-›CR2 |=ADC_CR2_ADON; /* Enable ADC1 */
ADC1-›CR2 |=ADC_CR2_RSTCAL ;//reset calibration
while ((ADC1-›CR2 & ADC_CR2_RSTCAL) != 0x00); //wait for end of ADC1 reset calibration register
ADC1-›CR2 |=ADC_CR2_CAL;/* Start ADC1 calibaration */
while((ADC1-›CR2 & ADC_CR2_CAL) != 0x00);/* Check the end of ADC1 calibration */
ADC1-›CR2 |=ADC_CR2_SWSTART |ADC_CR2_EXTTRIG; /* Start ADC1 Software Conversion */
while(1)
{
while ((ADC1-›SR&ADC_SR_EOC) == 0x00)
{
}
temp=ADC1-›DR;
ADC1-›CR2 |=ADC_CR2_SWSTART |ADC_CR2_EXTTRIG; /* Start ADC1 Software Conversion */
}
}
void setsystemclock(void)
{
/* Enable PLL */
RCC-›CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC-›CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC-›CFGR = (RCC-›CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL;
// Select PREDIV1 as PLL source and sett PLL mul to 3 (set bit 0)
// for 8*3 = 24 MHz
RCC-›CFGR |= RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL_0;
/* Wait till PLL is used as system clock source */
while ((RCC-›CFGR & RCC_CFGR_SWS) != 0x08)
{
} ;
} |
С PLL проблемку нашел, в результате ядро работает на 8МГц а АЦП на 4МГц но вроде как не важно т.к. насколько я понял главное не превышать разрешенные 14Мгц
Проблема в чем - при отладке на железке ЕОС то выставляется в 1 то не выставляется - закономерность уловить не смог И дебаг упорно не видит содержимое ADC1-›DR пока не поставишь watch на любую переменную, которая находится где-нить рядом в памяти (либо достаточно просто в просмотре памяти открыть адрес DR или что-то близкое)
Подскажите пожалуйста - это проблема uVision'а или моих кривых рук?