2013-01-11 11:08 PM
I am writing the program on Usart but the program is not function well.
Here is the program:&sharpinclude <STM32F4xx.h>&sharpinclude <stdio.h>&sharpinclude ''stm32f4xx_gpio.h''&sharpinclude ''stm32f4xx_rcc.h''&sharpinclude ''stm32f4xx_usart.h''USART_InitTypeDef UART1_InitS; GPIO_InitTypeDef GPIO_UART1A; GPIO_InitTypeDef GPIO_UART1B; uint16_t Uart_ReadByte(void);void GPIO_Configuration(void);void Uart_Configuration(void);void Uart_WriteByte(uint8_t writeByte);void RCC_Configuration(void); void ledon (int i) { GPIOD->ODR |= ((1UL << (i+12)));}void RCC_Configuration(void){ // RCC->AHB1ENR |= ((1UL << 3) ); /* Enable GPIOD clock */// GPIOD->MODER = 0x55000000;// GPIOD->OTYPER==0x0000; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //Check the port condition RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);}void GPIO_Configuration(void){ GPIO_UART1A.GPIO_Pin = GPIO_Pin_9; GPIO_UART1A.GPIO_Speed = GPIO_Speed_50MHz; GPIO_UART1A.GPIO_Mode = GPIO_Mode_AF; GPIO_UART1A.GPIO_OType = GPIO_OType_PP; GPIO_UART1A.GPIO_PuPd = GPIO_PuPd_UP; // enable pull up resistors GPIO_Init(GPIOA,&GPIO_UART1A); GPIO_UART1B.GPIO_Pin = GPIO_Pin_10; GPIO_UART1B.GPIO_Speed = GPIO_Speed_50MHz; GPIO_UART1B.GPIO_Mode = GPIO_Mode_IN; GPIO_UART1B.GPIO_PuPd = GPIO_PuPd_NOPULL; // enable pull up resistors GPIO_Init(GPIOA, &GPIO_UART1B); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1) ; GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1) ;}void UART_Configuration(void){ UART1_InitS.USART_BaudRate = 9600; UART1_InitS.USART_WordLength = USART_WordLength_8b; UART1_InitS.USART_StopBits = USART_StopBits_1; UART1_InitS.USART_Parity = USART_Parity_No; UART1_InitS.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; UART1_InitS.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART1, &UART1_InitS); USART_Cmd(USART1, ENABLE);}void Delay(void ){int i ; for(i =0; i!= 100000; i++);}void Uart_WriteByte(uint8_t writeByte){ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, (uint8_t)writeByte);}uint16_t UART_ReadByte(){ uint16_t temp =0 ; while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) temp = USART_ReceiveData(USART1); return (uint16_t) temp & 0x00FF;}int main (void) { int loop = 0; RCC_Configuration(); GPIO_Configuration(); UART_Configuration(); for(loop = 'a'; loop != 'z' +1; loop++) {Uart_WriteByte(loop); Delay();} ledon(3); }Here is the char I have recieved : ��������I have read some posts and some of them point out that HSE must be set correctly.So I have already change the HSE In stm32f4xx.h ,&sharpif !defined (HSE_VALUE) &sharpdefine HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */&sharpendif /* HSE_VALUE */In stm32f4xxconf.h ,&sharpif defined (HSE_VALUE)/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */ &sharpundef HSE_VALUE &sharpdefine HSE_VALUE ((uint32_t)8000000) And the exSo, my questions are 1. Are the setting of the USART1 wrong???2. Is that the problem on setting the external clock?? 3. Are the any setting I have to modify in the Keli project setting??? #don't-just-sit-there---debug!2013-01-12 03:42 AM
''the program is not function well''
That's like saying, ''my car is not running well - what's wrong with it?'' !
In what way(s), exactly, does your program ''not function well''? What do you expect it to do? What does it actually do? What debugging have you done to account for the difference? Here's some debugging tips:http://www.8052.com/faqs/120313
http://www.eetimes.com/discussion/break-point/4027526/Developing-a-good-bedside-manner?pageNumber=0
2013-01-12 06:02 AM
Doesn't look unreasonable, I'd perhaps not waste global resources on initialization structures.
You might want to put a scope on the TX pin and confirm the bit timing. If the baud rate is correct then consider how you have this connected. The CMOS outputs from the STM32F4 are NOT compatible with RS232 levels. You would need a MAX232 level converter or similar part to connect to a PC serial port, or USB-to-Serial dongle. There are adapters which interface at CMOS levels.2013-01-12 07:37 AM
Thanks for replying.
1. I have used the 3V Uart to USB converter(5V). So, the voltage level is not a problem.2. I have used the scope and the waveform looks very unreasonable. It keeps oscillate above 2V and without sending a stop bit or any start bit. if you guys really need the photo from scope, I can give you one in next week.2013-01-12 09:42 AM
Doesn't the PA9 pin on the STM32F4-Discovery have a really huge bulk capacitor on it? I would suggest you remove that, or consider using a different USART
2013-01-13 12:34 AM
Thank you for the suggestion. I have used another Uart4 rather than USART1.
But I have problem on receive uart char.uint16_t UART_ReadByte(){
uint16_t temp =0 ;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
temp = USART_ReceiveData(USART1);
return (uint16_t) temp & 0x00FF;
}
Am I writing the correct thing???Which should I use the Transmit data register empty or theUSART_FLAG_RXNE on the receiver sides??
2013-01-13 05:27 AM
uint16_t UART_ReadByte()
{
uint16_t temp =0 ;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
; // << NOTE SEMICOLON HERE
temp = USART_ReceiveData(USART1);return (uint16_t) temp & 0x00FF;
}