Глобальные переменные не инициализируются после запуска программы
Я программирую 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
заполнение нулями, было закомментировано по умолчанию. Для правильной инициализации переменных вы должны раскомментировать этот код.