首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局变量在程序启动后不会初始化

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

Stack Overflow用户
提问于 2017-04-17 17:30:42
回答 1查看 815关注 0票数 0

我正在编写通过串口连接到我的PC的STM32L152。

我使用GNU工具ARM Embedded V6.2 2016q4。

编译器控制字符串:

代码语言:javascript
复制
-mcpu=cortex-m3; -mthumb; -Wall; -ffunction-sections; -g; -O0; -DSTM32L152RB; -DSTM32L1XX_MD; -I.; 

链接器控制字符串

代码语言:javascript
复制
-mcpu=cortex-m3; -mthumb; -g; -Map=mufs_stm32l152.map; -O0; --gc-sections; -L${linkdir}; -T${linkdir}/arm-gcc-link.ld;  

实际上,它是Coocox IDE的默认值,我不会更改它。

我的代码:

代码语言:javascript
复制
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);

    }
}

当我在我的PC上按键时,我希望在控制台中看到类似这样的东西

代码语言:javascript
复制
GGGGGGGGGGGG

但我得到的只是一些垃圾。有时它是一些字母,有时它是无法打印的字符。它不会改变,直到我编辑我的代码并重新编译它。我可以赋值,它就能工作。它看起来像是全局变量hh没有初始值。此外,如果我将其标记为常量,它将开始按预期工作。

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2017-04-18 14:49:44

在CooCox集成开发环境(v1.7.6)中,全局变量(实际上是数据段)初始化是在Default_Reset_Handler函数的startup_stmxxxxxx_md.c文件中执行的。我不知道这是什么意思,但在我的例子中,执行data段初始化和bss填零的代码在默认情况下被注释掉了。为了正确初始化变量,您应该取消对此代码的注释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43448771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档