新手入门
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2015-9-5
- 在线时间
- 1 小时
|
5金钱
能正常发送数据,接收中断只能进去一次。芯片是STM32F103VCT6。
void USART3_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTy Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART3_Configuration(u32 BaudRate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* USART3 GPIO config */
/* Configure USART3 Tx (PB.10) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure USART3 Rx (PB.11) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* USART1 mode config */
USART_DeInit(USART3);
USART_InitStructure.USART_BaudRate = BaudRate; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打开Rx接收和Tx发送功能
USART_Init(USART3, &USART_InitStructure); //初始化
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //串口接收中断使能
USART_Cmd(USART3, ENABLE); //启动串口
USART3_NVIC_Configuration();
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
}
void RCC_Configuration(void)
{
/*使用外部晶振*/
RCC_DeInit(); //初始化为缺省值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速时钟
while(ERROR == RCC_WaitForHSEStartUp());//等待外部高速时钟就绪
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存
FLASH_SetLatency(FLASH_Latency_2); //2延时周期
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK / 2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHZ * 9
RCC_PLLCmd(ENABLE);//打开PLL
while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); //等待PLL锁定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08); //等待PLL作为系统时钟设置成功
/*打开相应外设的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB1Periph_PWR, ENABLE);
}
int main(void)
{
RCC_Configuration();
delay_init(72);
GPIO_Configuration();
USART3_Configuration(115200);
while (1);
}
/*******串口3中断服务函数******/
u8 USART3_Rx_Buf[128] = {0};
u8 USART3_Rx_Count = 0;
u8 USART3_Rx_Sat = 0;
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
dd(1);
USART3_Rx_Buf[++USART3_Rx_Count] = USART_ReceiveData(USART3);
if (128 == USART3_Rx_Count)
USART3_Rx_Count = 0;
if (USART3_Rx_Count >= 8)
{
USART3_Rx_Sat = 1;
USART3_Rx_Count = 0;
}
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
}
}
|
|