реклама на сайте
подробности

 
 
> Прерывания Cortex-M3, HardFault_Handler
rat
сообщение Mar 15 2012, 07:12
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Пробую прерывания в EFM32TG210. Пакет IAR 6.3 Код настройки:

//_______*** RTC ***_______

/* Enable RTC clock */
CMU->LFACLKEN0 |= CMU_LFACLKEN0_RTC;

RTC->IEN |= RTC_IEN_COMP0;

RTC->CTRL = RTC_CTRL_COMP0TOP | RTC_CTRL_DEBUGRUN;

RTC->COMP0 = 0x10000;

RTC->IFC = RTC_IFC_COMP0;

NVIC_EnableIRQ(RTC_IRQn);

RTC->CTRL |= RTC_CTRL_EN;

Хандлер:

void RTC_IRQHandler(void);
{
int current_time, next_time;

RTC->IFC = RTC_IFC_COMP0;

RTC->COMP0 = 0x10000;

GPIO->P[1].DOUT = (( 1<< 13) & (~(GPIO->P[1].DOUT)));
}

В дебугере вхожу в хандлер по шагам F11, процесс "зависает" - вернее начинает бежать не по шагам, как будто F5 нажал, когда останавливаешь, то в дизассемблере всякие BusFault_Handler, DebugMon_Handler, HardFault_Handler и т.д. Я прерывания не так настраиваю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
batisto4ka
сообщение Mar 20 2012, 08:40
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



CODE
void EXTI1_IRQHandler(void)
{
static uint8_t ADC1_Channel=1;
static unsigned char Command=ReadChannelData_0;
static unsigned char Channel;
static uint32_t temp=0;
static uint32_t temp1=0;
static uint8_t lenght=0;
static uint32_t mul=0;
static float k=0;
static float b=0;
static uint8_t ADCBuf_ind;
static uint8_t HR_ind;
static uint8_t adcMode;


if (EXTI->PR&(1<<1)) // Прерывание от EXTI1
{
EXTI_ClearITPendingBit(EXTI_Line1);
k=(float)ReadFromFlash(HR_ADDRESS+F_K_ADC*2)/100000;
b=(float)ReadFromFlash(HR_ADDRESS+F_B_ADC*2)/100000;

if (IfValid(ADC_MODE_REG,ReadFromFlash(HR_ADDRESS+F_ADC_MODE_REG*2)))
adcMode=ReadFromFlash(HR_ADDRESS+F_ADC_MODE_REG*2);
else adcMode=0x40;
if ((adcMode==0x20)||(adcMode==0x40))
{
if ((adcMode>>1)&0x01)
{
lenght=3;
mul=0x10000;
}
else
{
lenght=2;
mul=0x100;
}
switch (ADC1_Channel)
{
case 1: {
Channel=ReadChannelData_0;
Command=WriteToModeChannel_2;
HR_ind=ADC_CODE_1;
ADCBuf_ind=0;
ADC1_Channel++;
} break;
case 2: {
Channel=ReadChannelData_1;
Command=WriteToModeChannel_3;
HR_ind=ADC_CODE_2;
ADCBuf_ind=1;
ADC1_Channel++;
} break;
case 3: {
Channel=ReadChannelData_2;
Command=WriteToModeChannel_4;
HR_ind=ADC_CODE_3;
ADCBuf_ind=2;
ADC1_Channel++;
} break;
case 4: {
Channel=ReadChannelData_3;
Command=WriteToModeChannel_1;
HR_ind=ADC_CODE_4;
ADCBuf_ind=3;
ADC1_Channel=1;
} break;
}
temp=WriteToADC(SPI_1,Channel,8,SPI1);
while (lenght)
{
temp1=WriteToADC(SPI_1,0x00,8,SPI1);
temp=temp+temp1*mul;
mul=mul/0x100;
lenght--;
}
HoldingRegister[HR_ind]=temp; //код ацп
ADCBuffer[ADCBuf_ind]=(float)temp*k+b;
temp=WriteToADC(SPI_1,Command,8,SPI1);
temp=WriteToADC(SPI_1,adcMode,8,SPI1); //16bit resolution
}
}
}
uint8_t WriteToADC(uint8_t type,uint8_t firstParam, uint8_t secondParam, SPI_TypeDef * thirdParam)
{
uint8_t temp=0;

if (type==SPI_1)
temp=WriteSPI(thirdParam,firstParam);
else
temp=WriteSoftSPI(firstParam,secondParam);
return temp;
}
uint8_t WriteSPI(SPI_TypeDef * SPIx,uint8_t val)
{
SPIx->DR = val;
while (!(SPIx->SR & SPI_SR_RXNE));//while(!(SPI1->SR & 0x01));
return SPIx->DR;

}
uint8_t WriteSoftSPI(uint8_t val, uint8_t data_lenght)
{
uint8_t c;

for(c = 0; c < data_lenght; c++)
{
// ADC_Delay(ADC_TIM);
CLR_SCK_ADC1();

if(val & 0x80)
SET_SDI_ADC1();
else
CLR_SDI_ADC1();

// ADC_Delay(ADC_TIM);
SET_SCK_ADC1();
// ADC_Delay(ADC_TIM);
val <<= 1;
if(SDO_ADC1())
val |= 0x01;
}

return val;
}
/*===============================================================================
=====*/
void ADC_Delay (TIM_TypeDef* TIMx)
{
TIMx->CR1|=0x01;
while(!TIMx->SR&TIM_FLAG_Update) {}
TIMx->CR1&=~0x01;
}

Вот и получается, что первый АЦП опрашивается через аппаратный эспиай МК и подвисает на while while (!(SPIx->SR & SPI_SR_RXNE)), а второй АЦП опрашивается программно реализованным эспиай и подвисает на функции задержки на while(!TIMx->SR&TIM_FLAG_Update) {}.

Сообщение отредактировал batisto4ka - Mar 20 2012, 08:41
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- rat   Прерывания Cortex-M3   Mar 15 2012, 07:12
- - Mareng   Цитата(rat @ Mar 15 2012, 14:12) void RTC...   Mar 15 2012, 07:28
|- - rat   Цитата(Mareng @ Mar 15 2012, 14:28) Навер...   Mar 15 2012, 07:44
- - Mareng   ; для начала убрать надо   Mar 15 2012, 07:46
|- - rat   Цитата(Mareng @ Mar 15 2012, 14:46) ; для...   Mar 15 2012, 07:54
|- - Сергей Борщ   QUOTE (rat @ Mar 15 2012, 09:49) При попы...   Mar 15 2012, 07:56
||- - rat   Цитата(Сергей Борщ @ Mar 15 2012, 14:56) ...   Mar 15 2012, 08:16
||- - Сергей Борщ   QUOTE (rat @ Mar 15 2012, 10:16) сразу по...   Mar 15 2012, 08:39
||- - rat   Цитата(Сергей Борщ @ Mar 15 2012, 15:39) ...   Mar 15 2012, 09:12
||- - rat   Вопрос разрешился. Не был подключен файл startup_e...   Mar 15 2012, 10:37
|- - Mareng   Цитата(rat @ Mar 15 2012, 14:54) Поправил...   Mar 15 2012, 08:03
- - Mareng   Можно посмотреть в пдф-е на проц точный адрес вект...   Mar 15 2012, 08:22
- - batisto4ka   Помогите разобраться с приоритетами прерываний. У ...   Mar 19 2012, 08:00
- - batisto4ka   Явно что-то с вайлом. Первыйй АЦП общается с контр...   Mar 19 2012, 10:36
- - Aaron   Если хардварный SPI виснет на ожидании SPI_SR_RXNE...   Mar 19 2012, 12:18
- - batisto4ka   Да, только при работе с АЦП. Еще есть один вопрос,...   Mar 19 2012, 13:42
- - Aaron   Конечно, организовать можно по-разному, и смешать ...   Mar 20 2012, 07:10
- - Aaron   Дак судя по коду вообще получается, что у вас пери...   Mar 20 2012, 09:22
- - batisto4ka   ну это не весь код естесственно, это сами обработч...   Mar 20 2012, 11:30
- - Aaron   я это понимаю. но из кода функций WriteSPI и ADC_D...   Mar 20 2012, 12:52
- - batisto4ka   они не зависают,а подвисают..если сделать функцию ...   Mar 20 2012, 13:08
- - ohmjke   Здравствуйте. Есть такой код: CODE#define STM32F10...   Apr 1 2012, 15:38
- - ohmjke   Решил проблему, мой косяк был. Надо было делать не...   Apr 2 2012, 13:44
- - lead_seller   to batisto4ka: 1. По зависанию SPI в цикле ожидан...   Apr 3 2012, 17:44


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 02:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016