×
单片机 > 单片机程序设计 > 详情

stm32F030C8单片机串口利用USART_IT_IDLE接收完整的一帧

发布时间:2020-09-03 发布时间:
|

USART_IT_RXNE寄存器是在没接收到一个字节时产生中断,而USART_IT_IDLE寄存器是在接收到完整一帧后产生中断,即接收完一个字节在一个字节的时间内再无接收的话就会产生中断


下面是源码:


void USART1_Config(void)

GPIO_InitTypeDef GPIO_InitStructure;  

USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体

NVIC_InitTypeDef NVIC_InitStruct;

  

RCC_AHBPeriphClockCmd(USART1_GPIO_RCC, ENABLE); //使能GPIOA的时钟

RCC_APB2PeriphClockCmd(USART1_RCC, ENABLE);//使能USART的时钟

GPIO_PinAFConfig(USART1_GPIO_PORT, USART1_TX_GPIO_PinSource, GPIO_AF_1);//配置PA9成第二功能引脚  TX

GPIO_PinAFConfig(USART1_GPIO_PORT, USART1_RX_GPIO_PinSource, GPIO_AF_1);//配置PA10成第二功能引脚 RX 


/*USART1_TX ->PA9 USART1_RX ->PA10*/   

GPIO_InitStructure.GPIO_Pin = USART1_TX|USART1_RX;   //选中串口默认输出管脚

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;//定义管脚9的模式

GPIO_Init(USART1_GPIO_PORT, &GPIO_InitStructure); //调用函数,把结构体参数输入进行初始化    


/*串口通讯参数设置*/

USART_InitStructure.USART_BaudRate = UART1_BaudRate;//9600; //波特率

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;   //使能接收和发送引脚


USART_Init(USART1, &USART_InitStructure);

    

//USART_ClearFlag(USART1,USART_FLAG_TC);    

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);

USART1->ICR |= 1<<4; //必须先清除IDLE中断,否则会一直进IDLE中断

USART_Cmd(USART1, ENABLE);

    

    

/* USART1的NVIC中断配置 */

NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStruct);    

}


/**

* @file USART1_IRQHandler

* @brief USART1中断处理

* @param 无

* @retval 无

*/

void USART1_IRQHandler(void)

{

uint32_t temp = 0;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

//USART_SendData(USART1,USART_ReceiveData(USART1));

if (uart_recv[UART_1].count < UART_BUF_LEN)

{

//uart_recv_flag = 1;

uart_recv[UART_1].recv_buf[uart_recv[UART_1].count] = USART_ReceiveData(USART1);

uart_recv[UART_1].count++;

}

while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);

}

if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

{

USART1->ICR |= 1<<4;

uart_recv_flag = 1;

UART_send(USART1, "hello", sizeof("hello"));

}


注意F0芯片的清除中断的方法是用ICR寄存器,在使能中断之后就要立即清除一次中断否则会不停的进入中断




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项