Глобальные переменные не инициализируются после запуска программы

Я программирую STM32L152, который подключен к моему ПК через UART.

Я использую GNU Tools ARM Embedded версии 6.2 2016q4.

Строка управления компилятором:

-mcpu=cortex-m3; -mthumb; -Wall; -ffunction-sections; -g; -O0; -DSTM32L152RB; -DSTM32L1XX_MD; -I.; 

Строка управления линкером

-mcpu=cortex-m3; -mthumb; -g; -Map=mufs_stm32l152.map; -O0; --gc-sections; -L${linkdir}; -T${linkdir}/arm-gcc-link.ld;  

На самом деле это значение по умолчанию для Coocox IDE, я не меняю его.

Мой код:

int main(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //PD6  -> RX UART.
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8| GPIO_Pin_7| GPIO_Pin_6;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //enable pin
    GPIO_SetBits(GPIOB, GPIO_Pin_9);

    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
    USART1->CR1 |= USART_CR1_UE;
    USART1->CR1 &= ~USART_CR1_M;
    USART1->CR2 &= ~USART_CR2_STOP; 
    USART1->BRR = 139; //baud rate 115200 HSI = 16 МГц
    USART1->CR1 |= USART_CR1_TE;
    USART1->CR1 |= USART_CR1_RE;

    USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);
    NVIC_EnableIRQ(USART1_IRQn);

    while(1)
    {}

}

char hh = 'G';
void USART1_IRQHandler(void)
{
    if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))
    {
        char ch = USART_ReceiveData(USART1);
        USART_SendData(USART1, hh);
        if(ch == 'A')
            GPIO_ToggleBits(GPIOB, GPIO_Pin_8);

    }
}

Когда я нажимаю клавиши на моем ПК, я ожидаю увидеть в консоли что-то вроде этого

GGGGGGGGGGGG

Но вместо этого я получаю немного мусора. Иногда это какая-то буква, иногда это непечатный символ. И это не меняется, пока я не отредактирую свой код и не перекомпилирую его. Я могу присвоить значение, и это работает. Это похоже на глобальную переменную hh не имеет ее первоначального значения. Кроме того, если я отмечу его как постоянный, он начнет работать как положено.

Что я делаю неправильно?

1 ответ

В CooCox IDE (v1.7.6) инициализация глобальных переменных (фактически, сегмента данных) выполняется в startup_stmxxxxxx_md.c файл в Default_Reset_Handler функция. И я не знаю, в чем смысл этого, но в моем случае код, который выполняет data инициализация сегмента, а также bss заполнение нулями, было закомментировано по умолчанию. Для правильной инициализации переменных вы должны раскомментировать этот код.

Другие вопросы по тегам