本帖最后由 dai410257573 于 2016-11-29 09:26 编辑
学习中碰到一个问题,觉得有点不科学。问题点在于,如果我在初始化的情况下不初始化C口(红色),printf打印不出来,什么都没有。初始化B/C/D/E/F口都行,下面的打印都打印正常,有点纳闷。代码如下,求大神分析下。
/*******************************************************************************
*
*
--------------------------------------------------------------------------------
* 实 验 名 : 串口实验
* 实验说明 : 在串口助手上选择波特率为9600,选择HEX发送和HEX显示,发送数据
在串口上加1进行显示,参考里面图片设置
* 连接方式 :
* 注 意 : 所用函数在头文件.c文件内
*******************************************************************************/
#include "public.h"
#include "usart.h"
#include "systick.h"
#include "stdio.h"
//配置系统时钟,使能各外设时钟
void RCC_Configuration()
{
ErrorStatus HSEStartUpStatus; //定义枚举类型变量HSEStartUpStatus
RCC_DeInit(); //复位系统时钟
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK时钟源为SYSCLK1分频
RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2的时钟源为HCLK1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1的时钟源为HCLK2分频
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //选择PLL时钟源为HSE1分频,9倍频
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //系统时钟为PLL
while(RCC_GetSYSCLKSource() != 0x08); //等待PLL为系统时钟源
}
}
/****************************************************************************
* Function Name : usart_io_init
* Description : IO init program.
* Input : None
* Output : None
* Return : None
****************************************************************************/
void usart_io_init()
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能IO口的时钟
GPIO_InitStructure.GPIO_Pin= LED;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化GPIO */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能IO口的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TX //串口输出PA9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //RX //串口输入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
}
void Usart_mode_init()
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitStructure.USART_BaudRate = 9600; //设置波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据长度8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位1位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure); /* 初始化USART1 */
USART_Cmd(USART1,ENABLE); //使能usart1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //中断开启
USART_ClearFlag(USART1,USART_FLAG_TC); //清楚中断标志
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //打开USART1的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Init_NVIC
** 功能描述: 系统中断配置
** 参数描述:无
** 作 者: Dream
** 日 期: 2011年6月20日
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Init_NVIC(void)
{
#ifdef VECT_TAB_RAM //向量表基地址选择
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //将0x20000000地址作为向量表基地址(RAM)
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //将0x08000000地址作为向量表基地址(FLASH)
#endif
}
int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}
int GetKey (void)
{
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
/****************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
****************************************************************************/
//u8 led_num = 0;
int main()
{
RCC_Configuration();
Init_NVIC();
usart_io_init();
Usart_mode_init();
while(1)
{
printf("学习\r\n");
printf("STM32\r\n");
delay_ms(1000);
}
}
|