程序启动后不会初始化全局变量

时间:2017-04-17 09:30:42

标签: c stm32 stm32l152

我正在编程通过UART连接到我的PC的STM32L152。

我使用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 个答案:

答案 0 :(得分:0)

在CooCox IDE(v1.7.6)中,全局变量(实际上是数据段)的初始化在startup_stmxxxxxx_md.c函数的Default_Reset_Handler文件中执行。我不知道这是什么意思,但在我的案例中,执行data段初始化以及bss零填充的代码默认被注释掉了。对于正确的变量初始化,您应该取消注释此代码。