历史上的今天
今天是:2024年12月10日(星期二)
2018年12月10日 | stm32F030C8单片机串口利用USART_IT_IDLE接收完整的一帧
2018-12-10 来源:eefocus
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寄存器,在使能中断之后就要立即清除一次中断否则会不停的进入中断

史海拾趣
|
单片机又称单片微控制器]它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与 ...… 查看全部问答> |
|
请高手解惑: 在wince5.0下如何读AD卡采集的数据... 用pc104 跑wince5.0,我现在有一块AD卡,用来采集传感器传回的数据,不知道如何才能采集到啊? 用不用编驱动程序啊?直接读地址行不行啊?请高手指点一下啊,最好有原代码参考一下啊,十分感谢啊!… 查看全部问答> |
|
我现在想开发一款USB驱动程序,我目前 的操作系统是Win2003,请问使用win2003DDK开发的驱动程序,能够在WIN2000及XP上使用吗?DDK有什么要求吗?谢谢,见笑了.… 查看全部问答> |
|
接到了二个offer,一个是作电子词典嵌入式开发,一个是作linux计费开发,现在不知去哪个好? 我以前的工作是在linux下的开发,但我有很想往嵌入式那边尝试,但现在不知道作电子词典开发有没有前途?因为那家公司的电子词典的操作系统不是linux,也不 ...… 查看全部问答> |
|
2010 年 8 月 19 日,北京――安捷伦科技公司(NYSE: A)宣布,推出业界首个用于示波器的 GDDR5(图形双倍数据速率第五版)一致性测试应用程序包和 GDDR5 球形栅格阵列(BGA)探头。新工具将帮助工程师更快地启动和调试 GDDR5 系统,高效地确定 GDD ...… 查看全部问答> |
|
下面一个问题,已经困扰我很久了,一直找不到罪魁祸首,希望有高手帮我解答,非常感谢! 问题背景: 1.此项目为BLDC电机供电,提供310V,15V,GND,电机的VSP与FG由其他控制板输出或接收 2.附件原理图只是电源部分的简要示意图,非完整原理图, ...… 查看全部问答> |




