我想用串口二实现串口的实验,各种参数都按照串口二进行了修改,但串口助手上还是没收到数据,我想问三个问题
一、你定义USART_RX_STA变量怎么就能检验串口一的传输状态的呢?我只是在usart.c中看到他的定义u16 USART_RX_STA=0; 关于它内部的各个位是怎么判断是在哪里?
二、你定义USART_RX_STA变量适用于串口二的状态检验吗?
三、如果写一个检测串口二传输状态的变量应该怎么写?(这个问题问的可能有些大,还是希望指点一下学习方向)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[mw_shl_code=c,true]//TX-PC12,RX-PD2
void uart5_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD,ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);//使能USART1时钟
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_UART5); //GPIOA9复用为USART1
GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_UART5); //GPIOA10复用为USART1
//TX-PC12,RX-PD2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ; //GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PA9,PA10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ; //GPIOA9与GPIOA10
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化PA9,PA10
//USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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(UART5, &USART_InitStructure); //初始化串口1
USART_Cmd(UART5, ENABLE); //使能串口1
USART_ClearFlag(UART5, USART_FLAG_TC);
#if EN_USART1_RX
USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启相关中断
USART_ITConfig(UART5, USART_IT_IDLE, ENABLE);//存在BUG,当写为USART_IT_RXNE|USART_IT_IDLE无法打开IDLE中断
//应当是因为USART有CR1-3三个寄存器,由于或运算结果不同于原参数,故库函数默认写入CR3,详见源代码
//UART5 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;//串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
#endif
}
extern OS_Q osq_uart5;
u8 UART5_RX_BUF[64]; //接收缓冲,最大USART_REC_LEN个字节【应小于0x3FFF即16383】.
u16 UART5_RX_STA=0; //接收状态标记
void UART5_IRQHandler(void) //串口1中断服务程序(使用USART_IT_IDLE中断)
{
u32 Temp_Clear_IDLE;
u16 len=UART5_RX_LEN;//已接收长度
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //接收中断
{
UART5_RX_BUF[len]=(uint16_t)(UART5->DR & (uint16_t)0x01FF);//(UART5->DR); //读取接收到的数据
// USART_SendData(USART1,UART5_RX_BUF[len]);
UART5_RX_STA++;
len++;
if(len>=USART_REC_LEN)//缓冲区溢出
{
UART5_RX_STA|=0x4000;
UART5_RX_STA|=0x8000;
UART5_RX_STA&=0xC000;
}
}
if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET) //空闲总线中断
{
Temp_Clear_IDLE=UART5->SR;
Temp_Clear_IDLE=UART5->DR;//读SR再读DR清除USART_IT_IDLE位
if( (UART5_RX_BUF[len-2]==0x0D) && (UART5_RX_BUF[len-1]==0x0A) )//接收到的数据必须是0x0d 0x0a结尾
{
OS_ERR err;
UART5_RX_BUF[len-2]=0;UART5_RX_BUF[len-1]=0;
UART5_RX_STA-=2;
UART5_RX_STA|=0x8000;
OSQPost(&osq_uart5,UART5_RX_BUF,len,OS_OPT_POST_FIFO + OS_OPT_POST_ALL,&err);
}
else UART5_RX_STA=0;
}
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();
#endif
} [/mw_shl_code]
就比如
定义这些我都会,也都搞清楚了,就是STA这个变量的工作原理没太搞清楚
USART_RX_STA是自己定义的一个变量,不是硬件寄存器!USART_RX_STA是自己定义的,跟ST没有半毛钱的关系。
不知道该如何给你说了,你已经完全陷入了思维误区了,最后再回答你一次。USART_RX_STA是自己定义的,至于每个bit代表什么含义也是自己定义的。你如果要问为什么这些bit就代表这些含义的话,那是写程序的人自己定义的,跟什么标准啊、文档啊什么的没有任何关系,完全个人定义的。程序中会根据自己定义的每个bit的含义去做不同的操作。
一周热门 更多>