基于STM32F429-Discovery USART1 PA9 PA10 調試成功
原則上,像USART1等這些基本的外設,根據(jù)官方的庫,應該直接成功了,可是,我試了一下,就是不成功。雖然有STM32F10X的基礎,但是感覺打印的就是亂碼,并且發(fā)送時,竟然中斷接收函數(shù)里,中斷進不了??!
后來查看原理圖,原來STLink V2有引腳與PA9 PA10連接。應該是USB轉串口吧,因此,再把USB-TTL 接到PA9 PA10上,就會發(fā)生 兩個TXD->TXD相互干擾的現(xiàn)象,因此不通??!我這里直接去掉連接的短接電阻,程序正常了。
注意開始時需要修改一下庫里的晶振設置:8M外部晶振與PLL_M=8。官方庫好像是基于25MHz晶振的,但是實際的焊接的為:8MHz晶振。
修改后:測試成功了。收發(fā)正常了。
/********************(C)2016***************************
*文件名:usart1.c
*描述:將printf函數(shù)重定向到USART3。這樣就可以用printf函數(shù)將單片機的數(shù)據(jù)
*打印到PC上的超級終端或串口調試助手。
*實驗平臺:STM32F429
*硬件連接:------------------------
*|PA9-USART1(Tx)|
*|PA10-USART1(Rx)|
*------------------------
*庫版本:V1.6.1
*編寫日期:2016-05-22
*修改日期:
*作者:
*****************************************************************************/
#include"usart1.h"
#include
/*
*函數(shù)名:USART1_Config
*描述:USART1GPIO配置
*輸入:uint32_tuBaud
*輸出:無
*調用:外部調用
*/
voidUSART1_Config(uint32_tuBaud)
{
USART1_Configuration(uBaud);
USART1_NVIC_Configuration();
}
/*
*函數(shù)名:USART1_Configuration
*描述:USART1GPIO配置,工作模式配置。uBaud8-N-1
*輸入:uint32_tuBaud
*輸出:無
*調用:外部調用
*/
voidUSART1_Configuration(uint32_tuBaud)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
/*configUSART1clock*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
/*USART1GPIOconfig*/
/*ConfigureUSART1Tx(PA.9)asalternatefunctionpush-pull*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
//GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*ConfigureUSART1Rx(PA.10)asinputfloating*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
//GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*USART1modeconfig*/
USART_InitStructure.USART_BaudRate=uBaud;
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_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
voidUSART1_NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*ConfiguretheNVICPreemptionPriorityBits*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/*EnabletheUSARTyInterrupt*/
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*函數(shù)名:fputc
*描述:重定向c庫函數(shù)printf到USART1
*輸入:無
*輸出:無
*調用:由printf調用
*/
intfputc(intch,FILE*f)
{
/*將Printf內(nèi)容發(fā)往串口*/
USART_SendData(USART1,(unsignedchar)ch);
while(!(USART1->SR&USART_FLAG_TXE));
//while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
return(ch);
}
/**
*@briefThisfunctionhandlesUSART1Handler.
*@paramNone
*@retvalNone
*/
voidUSART1_IRQHandler(void)
{
uint8_tc;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
c=(uint8_t)USART_ReceiveData(USART1);
printf("%c",c);
}
}