2008-07-08 10:41 PM
newbie problem timer / UART
2011-05-17 03:39 AM
Hello,
I'm using the Keil STM32 eval board and try to convert my software to the STM32 controller. My program is based on an example project. Now I have 3 questions: 1) In my program I have a little loop waiting for a flag: unsigned char dbgactive; ... void debugByteOut(void) { while (dbgactive); .... } The compiler cannot compile this unless the line is disabled: sys_main.c: Internal fault: [0xe35e83:310914] in debugByteOut sys_main.c: Please contact your supplier. 2) The systick timer is running, now I want to use the TIM1 for a delay: void wait100MicroSec(unsigned char value) { TIM1_TimeBaseInitTypeDef timerinitvals; TIM1_DeInit(); //TIM1 frequency is defined as follow (Prescaler = 0): //TIM1 frequency = TIM1 counter clock / (TIM1_Period + 1) = 10 KHz. timerinitvals.TIM1_Period = (72000000 / 10000) - 1;//Period = 100 µsec timerinitvals.TIM1_Prescaler = 0; timerinitvals.TIM1_ClockDivision = TIM1_CKD_DIV1; timerinitvals.TIM1_CounterMode = TIM1_CounterMode_Down; timerinitvals.TIM1_RepetitionCounter = 0; TIM1_TimeBaseInit(&timerinitvals); TIM1_Cmd(ENABLE); while (value--) { while (TIM1_GetFlagStatus(TIM1_FLAG_Update) == RESET); TIM1_ClearFlag(TIM1_FLAG_Update); } TIM1_DeInit(); TIM1_Cmd(DISABLE); } The TIM1_FLAG_Update never changes, so the timer is not running, what is wrong with the initialisation? 3) I want to use UART with tx and rx interrupts and configure the following way: RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE); /* Configure USART1 Rx (PA10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Tx (PA9) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Clock = USART_Clock_Disable; USART_InitStructure.USART_CPOL = USART_CPOL_Low; USART_InitStructure.USART_CPHA = USART_CPHA_2Edge; USART_InitStructure.USART_LastBit = USART_LastBit_Disable; USART_Init(USART1, &USART_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //Enable the USART1 Interrupt NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //Enable the USART Transmit interrupt: this interrupt is generated when the USART transmit data register is empty USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //Enable the USART Receive interrupt: this interrupt is generated when the USART receive data register is not empty USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); ... void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { i = USART_ReceiveData(USART1); /* Clear the USART1 Receive interrupt */ USART_ClearITPendingBit(USART1, USART_IT_RXNE); } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { USART_SendData(USART1, c); /* Clear the USART1 transmit interrupt */ USART_ClearITPendingBit(USART1, USART_IT_TXE); } } If I want to run this program it crashed the emulator, any idea what is wrong? best regards, matt2011-05-17 03:39 AM
Quote:
sys_main.c: Please contact your supplier.
So it's asking you to contact your supplier - did you do that?2011-05-17 03:39 AM
1) that's a mistake. ''while (dbgactive);'' can cache the value in dbgactive and enter an infinite loop (it *should* do it). that may be triggering the error. try:
volatile unsigned char dbgactive; and see if it compiles. but mind you, the rest of the code (which I didn't read) will probably be buggy since you apparently didn't take theading issues into account when you wrote it. >If I want to run this program it crashed the emulator, any idea what is wrong? I thought it didn't compile.2011-05-17 03:39 AM
You are right, it is code from a different controller where no optimization is used, if I declare volatile or disable optimization the compiler works.
Still the timer and UART does not work yet, no idea what is wrong with the configuration.2011-05-17 03:39 AM
OK, UART problem is the same from the other thread (tx irq constantly triggering when no data available.
Now to the timer: I just want a delay function using timer 1 (without interrupt), can't be that hard, right? I probably forgot to enable the update event (TIM1_GenerateEvent(TIM1_EventSource_Update);) but what else, it is just a simple downcounter or do I have to do it with interrupts?