高中生
最后登录1970-1-1
在线时间 小时
注册时间2013-5-25
|
本帖最后由 隔海阳台 于 2014-4-26 20:34 编辑
我的程序搭载ucs-ii实现串口2数据接收,同样的程序,只是将USART2改成USART1都可以实现数据接收,但换成串口2就无法接收,请各路大神解疑答惑!具体相关参数如下:
串口2配置:
void USART2_Config(u32 baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
SystemInit();
/* config USART2 clock */
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE); //换成串口1时是RCC_APB2Periph_USART1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX,换成串口1时是PA9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX,换成串口1时是PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200; //速率
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; //收发模式
/* Configure USART2 */
USART_Init(USART2, &USART_InitStructure); //配置串口参数函数
/*配置USART2 */
USART_Init(USART2,&USART_InitStructure); //配置串口参数函数
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中断
USART_ITConfig(USART2, USART_IT_TXE, ENABLE); //使能发送缓冲空中断
/* 使能USART2 */
USART_Cmd(USART2, ENABLE); //使能USART2
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //设置串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
USART2中断配置:
void USART2_IRQHandler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); //保存全局中断标志,关总中断 Tell uC/OS-II that we are starting an ISR
OSIntNesting++;
OS_EXIT_CRITICAL(); //恢复全局中断标志
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
{
rx_buf_t[RxCount1++] = USART_ReceiveData(USART2); //将读寄存器的数据缓存到接收缓冲区里
if(rx_buf_t[RxCount1-2]==0x0d&&rx_buf_t[RxCount1-1]==0x0a) //结束标志位0D 0A
{
for(i=0; i< RxCount1; i++) rx_buf = rx_buf_t; //将接收缓冲器的数据转到发送缓冲区,准备转发
OSMboxPost(UsartMsgMbox,(void *)&rx_buf);
}
}
/* 避免USART第一个字节发布出去的BUG */
if(USART_GetITStatus(USART2,USART_IT_TXE) != RESET)
{
USART_ITConfig(USART2,USART_IT_TXE,DISABLE); //禁止发缓冲器空中断
}
OSIntExit(); //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换
}
运行之后USART2接收不到数据,调试时:通过串口助手网串口写数据时中断处理函数只能运行到蓝色字体部分( if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) ),下面的中断处理函数进不去!
同样的程序,将红色字体(USART2)换成串口1(USART1),其他不变,能够准确接收数据。
我用的板子是野火STM32,如图所示。单独测试USART2,不加ucos-ii,也是可以接收数据的。
我已经搞这个问题好多天了,至今没有进展,实属无奈,才麻烦各路大神的!在这小弟拜谢了!
|
-
我用的板子
|