2014-05-30 12:57 AM
Hi, I need your help...
I try to use the USART1 of the STM32F107 to send a string (''HELLO WORLD'') but on the hyperterminal, I receive just the first letter (''H''). I cannot found the fault, I use Coocox CoIDE with the GCC ARM compiler. Here's my code:&sharpinclude ''stm32f10x.h''
&sharpinclude ''stm32f10x_gpio.h''&sharpinclude ''stm32f10x_rcc.h''&sharpinclude ''stm32f10x_flash.h''&sharpinclude ''stm32f10x_usart.h''&sharpinclude ''misc.h''ErrorStatus HSEStartUpStatus;GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void USART_Configuration(void);void USART_Send(USART_TypeDef*,volatile char*);int main(void){ RCC_Configuration(); GPIO_Configuration(); USART_Configuration(); USART_Send(USART1,''HELLO WORLD''); while(1) { } return 0;}void RCC_Configuration(void){ RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PREDIV2Config(RCC_PREDIV2_Div5); RCC_PLL2Config(RCC_PLL2Mul_8); RCC_PLL2Cmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET){} RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2,RCC_PREDIV1_Div5); RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){} RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08){} } SysTick_Config(SystemCoreClock/1000); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);}void GPIO_Configuration(){ /* TX - PA9 */ 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); /* RX - PA10 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure);}void USART_Configuration(void){ USART_InitStructure.USART_BaudRate = 9600; 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_Tx; USART_Init(USART1,&USART_InitStructure); USART_Cmd(USART1,ENABLE);}void USART_Send(USART_TypeDef* USARTx,volatile char *str){ while(*str) { while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET); USART_SendData(USARTx,*str); str++; }} #send #usart #string2014-05-30 06:35 AM
Doesn't look unreasonable, suggest you use your IDE's debugger, and step through the code a little to understand what might be going on. Put a scope on the pin, check bit timings, signal etc.
I wouldn't use volatile in this context, but it should be harmless.2014-05-30 06:45 AM
I found out that it works when I send the ''HELLO WORLD'' from an interrupt handler. Why do it works from an interrupt handler and not from the main ???
2014-05-30 11:17 AM
You'll have to work through it with your debugger, it could be that you tool chain is generating bad code, CooCox is known for not using the CMSIS model correctly. Try an eval version of Keil or IAR, do they also behave oddly?