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

 
 
> STM32F103RET6 уходит в HardFault_Handler
011119xx
сообщение Feb 21 2011, 05:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Работаю в Keil 4. Пытаюсь инициализировать FAT следующей функцией:

Код
void MountDrive(void)
{
    uint32_t    TotSectors;
    uint32_t    DataSectors;
    uint32_t    FirstSector;
    struct    partrecord *pr;
    struct    bpb710 *bpb;
    int i;

    SectorBuffer = (uint32_t*) malloc(512);

    if (SectorBuffer == NULL)
    {
        return;
    }

    readsector(0, (uint8_t *)SectorBuffer);

            то что ниже не привожу, так как проблема возникает выше
}


SectorBuffer объявлено выше как:
Код
uint32_t    *SectorBuffer;


При этом при попытке прочитать сектор программа уходит в HardFault_Handler в файле stm32f10x_it.c и там зависает.

Если поменять код на такой:

Код
void MountDrive(void)
{
    uint32_t TotSectors;
    uint32_t DataSectors;
    uint32_t FirstSector;
    struct partrecord *pr;
    struct bpb710 *bpb;
    int i;
    uint8_t buffer[512];

    SectorBuffer = (uint32_t *)buffer;                            

    if (SectorBuffer == NULL)
    {
        return;
    }
      
    readsector(0, (uint8_t *)SectorBuffer);                        
}


то сектор читается и перехода в HardFault_Handler не происходит. Вопрос: почему не работает первый вариант кода? Что там не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sonycman
сообщение Feb 21 2011, 09:54
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



А куча и стек имеют достаточный размер?

Вообще причины могут быть разные, смотря что там внутри readsector.
Вот что что, а выравнивание буфера для чтения сектора никак не должно быть обязательным.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Feb 21 2011, 10:08
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(sonycman @ Feb 21 2011, 14:54) *
А куча и стек имеют достаточный размер?


Вот этого я не знаю.

Код
static uint8_t readsector(uint32_t lba, uint8_t *buffer)
{
    if(lba == sector_in_buffer)                                
        return 0;                                    

    sector_in_buffer = lba;                                    
    return sd_readsector(lba, buffer);                        
}

int8_t sd_readsector(uint32_t lba, uint8_t *buffer)
{
    uint16_t i;

GPIO_ResetBits(SD_CS_PORT, PIN_CS_SD);                    

    if(sdhc_card)                                            
        sd_command(SD_READ_SINGLE_BLOCK, lba);                
    else                                                    
        sd_command(SD_READ_SINGLE_BLOCK, lba << 9);            
    
    if(sd_get_response() != 0)                                 
        {
            sd_send_dummys();                                 

            GPIO_SetBits(SD_CS_PORT, PIN_CS_SD);        
    
            return SD_ERROR;                                   
        }

    if(sd_get_datatoken() != SD_STARTBLOCK_READ)             
        {
            sd_send_dummys();                                 

            GPIO_SetBits(SD_CS_PORT, PIN_CS_SD);            

            return SD_ERROR;                                   
        }

    for(i = 0; i < 512; i++)                                 
        *buffer++ = SPI_byte(0xff);
        
    SPI_byte(0xff);                                            
    SPI_byte(0xff);                                            

    sd_send_dummys();                                         

    GPIO_SetBits(SD_CS_PORT, PIN_CS_SD);                    

    return SD_OK;                                                 
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 011119xx   STM32F103RET6 уходит в HardFault_Handler   Feb 21 2011, 05:18
- - zhevak   Могу ошибиться. Рассматривайте это как вариант пои...   Feb 21 2011, 06:08
- - 011119xx   SectorBuffer указывает на область ОЗУ по адресу 0x...   Feb 21 2011, 06:25
|- - Dron_Gus   Цитата(011119xx @ Feb 21 2011, 09:25) ......   Feb 21 2011, 08:30
- - 011119xx   Да.   Feb 21 2011, 09:15
|- - sonycman   Цитата(011119xx @ Feb 21 2011, 13:08) Вот...   Feb 21 2011, 16:22
- - ViKo   А stdlib.h включен в исходный файл?   Feb 21 2011, 18:08
- - 011119xx   Да. Дело было в стеке. У меня стоял размер 512 бай...   Feb 22 2011, 03:42
|- - sonycman   Цитата(011119xx @ Feb 22 2011, 06:42) Да....   Feb 22 2011, 06:59
- - zhevak   Цитата(011119xx @ Feb 22 2011, 08:42) Да....   Feb 22 2011, 07:27
|- - aaarrr   Цитата(zhevak @ Feb 22 2011, 10:27) А сей...   Feb 22 2011, 13:31
- - 011119xx   А может память выделяется не из кучи, а из стека?   Feb 22 2011, 08:24
|- - zhevak   Цитата(011119xx @ Feb 22 2011, 13:24) А м...   Feb 22 2011, 08:44
|- - ViKo   Цитата(zhevak @ Feb 22 2011, 10:44) А раз...   Feb 22 2011, 09:02
|- - zhevak   Цитата(ViKo @ Feb 22 2011, 14:02) Скорее ...   Feb 22 2011, 09:26
|- - ViKo   Цитата(zhevak @ Feb 22 2011, 11:26) Вообщ...   Feb 22 2011, 09:51
|- - zhevak   Цитата(ViKo @ Feb 22 2011, 14:51) У меня ...   Feb 22 2011, 12:57
|- - ViKo   Цитата(zhevak @ Feb 22 2011, 14:57) Ну да...   Feb 22 2011, 13:12
|- - sonycman   Цитата(ViKo @ Feb 22 2011, 16:12) Вопрос,...   Feb 22 2011, 16:41
- - zhevak   Цитата(ViKo @ Feb 22 2011, 18:12) Я тольк...   Feb 22 2011, 18:17
- - ViKo   Цитата(zhevak @ Feb 22 2011, 20:17) Невер...   Feb 22 2011, 18:46


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

 


RSS Текстовая версия Сейчас: 19th August 2025 - 12:28
Рейтинг@Mail.ru


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