(RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。于是我决定在产生RXNE中断时将接收到的一个字节的数据用数组保存起来。在产生IDLE中断的时候,改变ReceivedFlag(自己定义的一个检测帧数据接收完成状态的标志)的状态。
main.c:
#include "stm32f10x.h"
#include "stdio.h"
extern void delay_ms(u16 time);
void USART_Config(void);
void NVIC_Configuration(void);
int fputc(int ch, FILE *f);
void Usart_SendByte();
uint16_t i;
uint8_t u2_Temp;
extern uint8_t u3Temp;
extern uint16_t uart_p;
int RxFlag;
extern uint8_t ReceivedFlag,tempU3,uart3_RXbuff[];
/*
* UART2: TX: PA2 RX:PA3
* UART3:TX:PB10 RX:PB11 TXRXEN:PD3
* UART5:TX:PC12 RX:PD1 TXRXEN:PD0
*
*/
int main()
{
SystemInit();//72m
NVIC_Configuration();
USART_Config();
// printf("重定向成功\n");
for(i=0;i<=0xff;i++)
{
Usart_SendByte( USART2,i);
// printf("%d",i);
}
while(1)
{
if(ReceivedFlag == 1)//帧数据显示。收到一帧数据时,显示接收中断数组保存的一帧数据
{
for(uart_p= 1; uart_p <= u3Temp; uart_p++)
{
Usart_SendByte(USART2,uart3_RXbuff[uart_p]);
}
ReceivedFlag = 0;
uart_p = 1;
}
}
}
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置USART为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
/* 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 打开串口GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 打开串口外设的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// 将USART Tx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_