Неініціалізовані дані.bss - это что такое?
Неініціалізовані дані.
В том, что он не поддерживает j-link?Полное говно - не дебажится нихрена. В чем может быть глюк?
Ув. Reset, еще вопрос к вам, а если в данном проце (LPC2368) поставили защиту от чтения получится J-Link-ом (или U-Link-ом) прочитать? Девайс - китайское барахло, а именно программатор SH7055.
Reset, тогда к вам последний вопрос - а у вас есть программатор для LPC2368FBD100, чтоб считать прошивку (желательно через JTAG)? Может защиты и нет, я не знаю. Просто по разным форумам читаю, но никто не может подсказать.
В общем мне необходимо считать прошивку с этого проца, естественно не стереть ее!
Если можете помочь - помогите, не бесплатно.
[SIZE="1"][I]GPIO:
// ADCGPIO
/*Configure GPIO pin : PA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);[/I][/SIZE]
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Подаем тактирование на АЦП 1//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC1->CR2 |= ADC_CR2_RSTCAL;
ADC1->CR2 |= ADC_CR2_CAL;
ADC1->CR2 &= ~ADC_CR2_ALIGN; //Выравнивание по правому краю
ADC1->CR2 |=( ADC_CR2_CONT|ADC_CR2_EXTTRIG|ADC_CR2_EXTSEL|ADC_CR2_TSVREFE|ADC_CR2_DMA);
//ADC1->CR2 |= ADC_CR2_EXTTRIG;
//ADC1->CR2 |= ADC_CR2_EXTSEL_2;
/* Задаем длительность выборки */
ADC1->SMPR2 |= (ADC_SMPR2_SMP4_2 | ADC_SMPR2_SMP4_1 | ADC_SMPR2_SMP4_0);
ADC1->CR1 |= ADC_CR1_EOCIE;
ADC1->CR1 |= ADC_CR1_SCAN;
/* Настраиваем каналы */
ADC1->SQR1 |= (2<<20); // 10 - три канала
ADC1->SQR3 |= (4<<15) | (5<<10) | (6<<5) | 7; // Сами номера каналов
ADC1->SQR3|=(ADC_SQR3_SQ1_1|ADC_SQR3_SQ1_2|ADC_SQR3_SQ1_3);
while(ADC_GetCalibrationStatus(ADC1));
ADC1->CR2 |= (ADC_CR2_ADON);
}
{
RCC->AHBENR |= RCC_AHBENR_DMA1EN;//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA1_Channel1->CPAR |= (uint32_t) &ADC1->DR;
DMA1_Channel1->CPAR |= (uint32_t) &ADC1->DR; //DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)(&USART1->DR);
DMA1_Channel1->CMAR |= (uint32_t) &ADC3ch.ADCbuf1[0];//DMA_InitStructure.DMA_MemoryBaseAddr = (u16)&ADC3ch.ADCbuf1;//RX1.BFR;//&RXb1;
DMA1_Channel1->CNDTR = 16;//DMA_InitStructure.DMA_BufferSize = 3;
DMA1_Channel1->CCR = 0;//DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DST;//SRC - читать в память
DMA1_Channel1->CCR |= (DMA_CCR1_MINC|DMA_CCR1_PSIZE_0|DMA_CCR1_MSIZE_0|DMA_CCR1_PL|DMA_CCR1_TCIE);//16-бит АЦП
DMA1_Channel1->CCR &= ~DMA_CCR1_MEM2MEM; // Режим обмена память-память - выключен
DMA1_Channel1->CCR |= DMA_CCR1_EN; // Включаем
}
Как работает этот грёбаный регистр? Числа случайны и взяты из случайного примера, любые совпадения с реальными считать совпадениями.ADC1->SQR3 |= (4<<15) | (5<<10) | (6<<5) | 7; // Сами номера каналов
/* Private define ------------------------------------------------------------*/
#define ADC_NbrOfDualChannel 2 // Кількість спарених каналів АЦП.
/* Private variables ---------------------------------------------------------*/
static uint32_t ADC_DualConvertedValue[ADC_NbrOfDualChannel]; // Масив спарених кодів АЦП.
/* Private functions ---------------------------------------------------------*/
/**
* @brief Конфігурація RCC для ADC.
* @param Немає
* @retval Немає
*/
static void Adc_RCC_Configuration (void)
{
// Вибір дільника частоти ADC.
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
// Включення тактування DMA1.
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// Включення тактування ADC і GPIOA.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 | RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
}
/**
* @brief Конфігурація NVIC для ADC.
* @param Немає
* @retval Немає
*/
static void Adc_NVIC_Configuration (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// Конфігурація переривання DMA1 Channel1.
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief Конфігурація GPIO для ADC.
* @param Немає
* @retval Немає
*/
static void Adc_GPIO_Configuration (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Конфігурація PA.00 - PA.02 (ADC Channel0 - Channel2) як аналогові входи.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @brief Конфігурація DMA для ADC.
* @param Немає
* @retval Немає
*/
static void Adc_DMA_Configuration (void)
{
DMA_InitTypeDef DMA_InitStructure;
// Конфігурація DMA1 Channel1.
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) ADC_DualConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ADC_NbrOfDualChannel;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
// Дозвіл переривання DMA1 Channel1 Transfer Complete.
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
// Дозвіл DMA1 Channel1.
DMA_Cmd(DMA1_Channel1, ENABLE);
}
/**
* @brief Конфігурація каналів ADC.
* @param Немає
* @retval Немає
*/
static void ADC_Configuration (void)
{
ADC_InitTypeDef ADC_InitStructure;
// Конфігурація ADC1 і ADC2.
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = ADC_NbrOfDualChannel;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Init(ADC2, &ADC_InitStructure);
// Дозвіл каналу Vrefint.
ADC_TempSensorVrefintCmd(ENABLE);
// Конфігурація звичайних каналів ADC1 і ADC2.
ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 2, ADC_SampleTime_1Cycles5);
// Дозвіл ADC1 і ADC2.
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC2, ENABLE);
// Скидання регістрів калібровки ADC1 і ADC2.
ADC_ResetCalibration(ADC1);
ADC_ResetCalibration(ADC2);
// Перевірка закінчення скидання регістрів калібровки ADC1 і ADC2.
while(ADC_GetResetCalibrationStatus(ADC1));
while(ADC_GetResetCalibrationStatus(ADC2));
// Старт калібрування ADC1 і ADC2.
ADC_StartCalibration(ADC1);
ADC_StartCalibration(ADC2);
// Перевірка закінчення калібрування ADC1 і ADC2.
while(ADC_GetCalibrationStatus(ADC1));
while(ADC_GetCalibrationStatus(ADC2));
// Дозвіл ADC1 DMA.
ADC_DMACmd(ADC1, ENABLE);
// Дозвіл зовнішнього тригера перетворення ADC2.
ADC_ExternalTrigConvCmd(ADC2, ENABLE);
// Програмний старт перетворення ADC1.
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
/**
* @brief Ініціалізація аналогових входів.
* @param Немає
* @retval Немає
*/
void AdcInit (void)
{
Adc_RCC_Configuration(); // Конфігурація RCC для ADC.
Adc_NVIC_Configuration(); // Конфігурація NVIC для ADC.
Adc_GPIO_Configuration(); // Конфігурація GPIO для ADC.
Adc_DMA_Configuration(); // Конфігурація DMA для ADC.
ADC_Configuration(); // Конфігурація ADC.
}
/**
* @brief Обробка буфера з результатами АЦП.
* @param Немає
* @retval Немає
*/
void DMA1_Channel1_IRQHandler (void)
{
if(DMA_GetITStatus(DMA1_IT_TC1))
{
DMA_ClearITPendingBit(DMA1_IT_GL1);
}
}
Ув. Reset, позволю совет - сейчас St толкает CubeMx - генератор кода для stm32. Есть масса достоинств. Недостатки конечно то-же есть. Как всегда ( приколы с Spi, Rtc, Ethernet, нет пока emWin для Stm32f4 - приходиться самому, по старинке ). Но инициализация периферии таки обычно работает.
Жрёт много. Переведя иниты с перифа на прямые записи регистров экономится чуть-ли не 1 кБ.Въезжать в ЭТО не серьезно. Почему STPeriph не используешь?
Собсно, им и пользовался, но какое он имеет к DMA отношение? Скачал вчера последний - не заметил там вообще DMA, как и его разрешения для АЦП. Как по мне - ещё писать и писать этот продукт. Но в копилку положил - он из полезного, красненьким подсвечивает периферию двойного применения, которую уже задействовали.Ув. Reset, позволю совет - сейчас St толкает CubeMx - генератор кода для stm32. Есть масса достоинств. Недостатки конечно то-же есть. Как всегда ( приколы с Spi, Rtc, Ethernet, нет пока emWin для Stm32f4 - приходиться самому, по старинке ). Но инициализация периферии таки обычно работает.
Не знаю кто это. Такоэ себе. Далёк от совершенства, как я от французского балета.Дополню:
STM32CubeMX = бывший MicroXplorer.
А объясните мне, в чём заключается эйфория от этой хрени? Может я не ту версию скачал? Или там глубже лезть надо?Так что-бы да, так вроде нет. Значительно мощнее и удобнее. Скорее ближе к генератору в 5 кейле с его паками. Я например уже и подзабыл как FreeRTOS вручную накатывать ( оно понятно что и вспомнить недолго ). С lwIp ( с его туевой хучей настроек ) - просто песня. В кейле правда emWin есть в генераторе. Когда-то было важно. Но вроде пока обхожусь.
Чего? Все это делается на этапе компиляции. Результатом есть такая же прямая загрузка значения в регистры.Жрёт много. Переведя иниты с перифа на прямые записи регистров экономится чуть-ли не 1 кБ.
Исходник фстудию. Писал бутлоадер с асм-функцией. Работает нормально.Лучше подскажите мне что еще сохранить в функции на асме вставленой в си в cvavr чтобы она не херила данные. Там довольно сложно и разбирать полный промежуточный асм код я уже затрахался мочи нет. Но некоторые флаги( глобальные переменные) в процессе работы слетают при использовании асм функции. Все регистры посохранял.
Не правда. Или мы о разном. если черезЧего? Все это делается на этапе компиляции. Результатом есть такая же прямая загрузка значения в регистры.
Лучше подскажите мне что еще сохранить в функции на асме вставленой в си в cvavr чтобы она не херила данные. Там довольно сложно и разбирать полный промежуточный асм код я уже затрахался мочи нет. Но некоторые флаги( глобальные переменные) в процессе работы слетают при использовании асм функции. Все регистры посохранял.
Не поленился, создал проект под 100 семейство - реально ограничен функционал. Видимо St не считает нужным уже их поддерживать. Да и я уже подзабыл.
Создай проект под 4 семейство ( перед этим паки нужно поставить ) - сравни.