本帖最后由 kevin2512 于 2015-8-3 18:29 编辑
stm32f407 discover开发板与PC之间USART通信不成功,按复位键才出个乱码,一个y字母上面两点的乱码。完全不对啊,复位键一直按住不放,就一直出乱码,松开啥都不出。求大虾们指教
下面是我写的代码,全在main.c文件中,没有用到中断什么的。
串口调试助手,波特率,COM口,等参数都设置正确。
不过,我在stm32f4xx.h和system_stm32f4xx.c中改了两个参数,一个是HSE我改成8M(板子上是8M),原来是25M。还有PLLM把25改成8,其他地方没动过。
#include "stm32f4xx.h"
#include "stdio.h"
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)
void USART6_Config(void);
int main(void)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
USART6_Config();
printf("\r\n this is a printf demo \r\n");
printf("\r\n welcome to use discovery board: \r\n");
while (1)
{
}
}
void USART6_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct ;
USART_InitTypeDef USART_InitStruct ;
/*使能USART1外设时钟(挂在APB2上)和GPIOA外设时钟(挂在AHB1上)*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6); //Tx
GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6);//Rx
/*初始化GPIOA*/
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOC,&GPIO_InitStruct);
/*USART1初始化配置*/
USART_InitStruct.USART_BaudRate=115200;/*波特率为115200bps*/
USART_InitStruct.USART_WordLength=USART_WordLength_8b;/*发送字长为8位字长*/
USART_InitStruct.USART_StopBits=USART_StopBits_1;/*停止位为1*/
USART_InitStruct.USART_Parity=USART_Parity_No;/*无奇偶校验位*/
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; /*不采用硬件流*/
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; /*串口双工模式*/
USART_Init(USART6,&USART_InitStruct);
USART_Cmd(USART6,ENABLE); /*使能USART1*/
}
/*实现重定向printf函数,而重写的fputc()这个C标准库函数*/
int fputc(int ch,FILE *f)
{
/*将printf内容发往串口*/
USART_SendData(USART6,(uint8_t)ch);
while(USART_GetFlagStatus(USART6,USART_FLAG_TC)!=SET)/*检测串口数据发送完成标志位TC的值*/
{} /*TC=SET(1),表示发送发成*/
return ch;
}
/*---------------------------------------下面是断言,不用管--------------------------------------------------------------------------------------*/
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
|