#include"stm32f10x.h"
void RCC_Config(void)
{
ErrorStatus HSEStartUpStatus;
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_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
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);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void USART1_Config(void)
{
USART_InitTypeDef USART_InitStructure;
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_Mode=USART_Mode_Rx|USART_Mode_Tx;//指定了使能或者失能发送和接收模式
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置硬件流失能
USART_Init(USART1,&USART_InitStructure); //将以上赋完值的结构体带入库函数USART_Init进行初始化
//USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE); //开启USART1,注意与上面RCC_APB2PeriphClockCmd()设置的区别
}
void Delay(vu16 cnt)
{
unsigned short i,j;
for (i=0;i<cnt;i++)
{ for (j=0;j<1000;j++)
{ }
}
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
RCC_Config();
GPIO_Config();
NVIC_Config();
USART1_Config();
USART_ClearFlag(USART1,USART_FLAG_TC);//清除标志位,否则第1位数据会丢失
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
{
USART_SendData(USART1,0x89);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
Delay(800);
}
}
}
void USART1_IRQHandler(void)
{
u8 dat;
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
{
dat=USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
USART_ClearFlag(USART1,USART_FLAG_RXNE);
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
USART_SendData(USART1,dat);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
USART_SendData(USART1,0x66);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
这段程序中我想让串口在PA0为低电平的时候一直发送0x89,当通过串口调试助手发送和接收一数据后,继续发送0x89。
但现在是我一上电开始可以发送0x89,当在串口调试助手上发送和接收一数据后,程序貌似是卡在中断服务程序里了,无法继续发送0x89。
想请大侠们帮我看看这程序哪出了问题。。。
本人是初学者,也请各位帮我看看我这段程序语句可有用的不恰当的地方,帮忙指点指点。。。。 |