/*程序介绍:目的是PC机通过USB转串口向stm32发送一个数据,然后stm32返回发送的这个数据。其中PC4是一个LED灯,每次发数据时实现亮灭的变化*/
/*目前实验的结果是每次发数据时LED会发生变化,问题是无数据返回*/
//用的是串口调试助手观察的
#include <stm32f10x.h>
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
int main (void) //中断服务函数在最后面
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
USART_Configuration();
GPIO_SetBits(GPIOC,GPIO_Pin_4); //LED亮
while(1);
}
/*时钟配置*/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
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_USART1|RCC_APB2Periph_GPIOC, ENABLE);//串口和GPIO口的配置
}
/*GPIO配置*/
void GPIO_Configuration(void)
{
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_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*串口配置*/
void USART_Configuration(void)
{
USART_DeInit(USART1);
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_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);
}
/*中断配置*/
void NVIC_Configuration(void)
{
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);
}
/*串口中断服务程序*/
void USART1_IRQHandler(void)
{
u16 dat;
if(USART_GetITStatus(USART1, USART_IT_RXNE)==SET)//判断是不是接收中断
{
GPIO_WriteBit(GPIOC,GPIO_Pin_4,1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_4)); //实现LED灯(PC4)反转
dat = USART_ReceiveData(USART1); //串口接受到的数据
USART_SendData(USART1,dat); //将接收到的数据发送到上位机
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ; //等待数据发送完成
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志位
}
} |