Технический форум по робототехнике.
Gekatonheyr » 27 сен 2014, 09:49
Добрый день.
Помогите плз разобраться с проблемой.
Есть оценочная плата Stm32l152cdiscovery, есть среда разработки CoIDE.
Загружаю проект из официального сайта, компилирую его в CoIDE и заливаю через USB на
МК. Проект не работает. Это при том, что компилируется без ошибок.
Начинаю отладку - видно что стопорится на функции ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS).
Последняя в свою очередь вызывается из Current_Measurement(). Код, на котором стопорится (stm32l1xx_adc.c):
if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET)
{
/* ADC_FLAG is set */
bitstatus = SET;
}
else
{
/* ADC_FLAG is reset */
bitstatus = RESET;
}
/* Return the ADC_FLAG status */
return bitstatus;
То есть как я понимаю, не может он дождаться установки бита синхронизации АЦП, поскольку все время возвращает статус RESET.
С другой стороны, если заливаю бинарный файл, который идет вместе с фирмваре-пак от STM через ST-Link,
то все проходит нормально и работает.
Помогите победить сие неудобство. Или тыкните что почитать, потому как ничего не могу найти в инете.
Заранее благодарен.
elmot » 27 сен 2014, 20:37
Первое правило работы с стм32 - если периферия не работает, проверь, включено ли у нее тактирование.
Gekatonheyr » 28 сен 2014, 08:41
Та периферия-то затактирована, порты А,В,С подключены. Ножки настроены. Смотрел на отладке - все нормально вроде... Кроме того - бинаник жеж из фирмвари заливается и работает нормально. Пробовал откомпилировать проект в Keil - все получается, заливается и работает нормально.
У меня еще другая проблема по этому поводу возникала. Пишу вот такую програмку:
#define STM32L1XX_MDP
#include "main.h"
static __IO uint32_t TimingDelay;
int main(void)
{
bool StanbyWakeUp ;
int a= SystemCoreClock / 1000;
SysTick_Config(a);
if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
{
/* System resumed from STANDBY mode */
/* Clear StandBy flag */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
PWR_ClearFlag(PWR_FLAG_SB);
/* set StandbyWakeup indicator*/
StanbyWakeUp = TRUE;
} else
{
/* Reset StandbyWakeup indicator*/
StanbyWakeUp = FALSE;
}
RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_LCDEN);
LCD_GLASS_Configure_GPIO();
LCD_GLASS_Init();
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_Mode=GPIO_Mode_OUT;
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpio);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);
LCD_GLASS_ScrollSentence("*Hello world* ",1,50);
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);
Delay(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);
Delay(50);
}
}
void SysTick_Handler()
{
TimingDelay_Decrement();
}
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
Все компилируется, заливается и работает. НО стоит отключить и включить питание, как происходит затык, перезаливка не спасает. Стирание памяти тоже. Помогает только заливка бинарника от ST, после которой все повторяется: залил - работает; отключил питание, потом включил - висим; залил прошивку из фирмвари - снова работаем до первого отключения питания. Причем случается все это именно на функциях проверки синхронизации флагов. Первый там где я указал, второй на функции WaitForSynhro() из SPL.
Я тут подумал может с фьюзами чего не то получается, по копание в документации пока ничего не дало.
Может какая-то хитрая настройка в проэкте есть чтобы такого не случалось. Я просто новичек в МК, вот и спрашиваю более опытных товарищей..
Из-за общност
elmot » 28 сен 2014, 10:17
Начальный адрес кривой или вообще в RAM заливается.
Gekatonheyr » 28 сен 2014, 23:09
а как проверить? и как настроить правильный нач. адрес? это параметры среды разработки? если есть ссылка где про это почитать поделись плз.
avr123.nm.ru » 28 сен 2014, 23:25
Попробуй делать проект не с нуля а взять из примеров (там все правильно будет настроено) и в нем изменить код под свою задачу.
Gekatonheyr » 29 сен 2014, 00:26
так в том то и едло - проект взят из коробки. просто ST не дают проекта готового для CoIDE, поэтому все пришлось ручками собирать. Как экспортировать проект из кейла в "кокос" не знаю. Идея с готовым проектом возникла после неудачной своей попытки. Кстати мигать даиодами получается нормаль, программных сбоев не происходит. Может такое быть если начальный адрес прописан неправильно? Короче дурдом какой-то....
avr123.nm.ru » 29 сен 2014, 00:47
пиши в iar keil
Gekatonheyr » 29 сен 2014, 17:58
попробовал написать код для использования lcd в keil - та же история - виснет на функции WaitForSynhro(), которая в свою очередь вызывается из LCD_GLASS_Init() а та - из LCD_Init(). Настройки все вроде скопировал, варианты идей закончились.... Есть предложения кроме тех которые поступали выше?
avr123.nm.ru » 30 сен 2014, 12:34
Зачем копировать? Просто откройте из примеров проект, сохраните его в свою папку и наполните своим кодом.
elmot » 30 сен 2014, 23:31
Gekatonheyr писал(а):а как проверить? и как настроить правильный нач. адрес? это параметры среды разработки? если есть ссылка где про это почитать поделись плз.
Configuration->Вкладка Link->Memory Areas
Правильные адреса есть в даташите.В случае stm32f051 стоит Debug In Flash , IROM1 Start 0x08000000 Size
0x00010000, IRAM1 Start 0x20000000 Size 0x00002000