ARM 为什么老进不去串口中断呢?用的是正点原子的程序,用的是STM32-MINI开发板,不一定的地方是PORT接口

下面是中断服务函数:#ifdefEN_USART1_RX//如果使能了接收//串口1中断服务程序//注意,读取USARTx->SR能避免莫名其妙的错误u8USART_RX... 下面是中断服务函数:
#ifdef EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0; //接收状态标记

void USART1_IRQHandler(void)
{
u8 res;
if(USART1->SR&(1<<5))//接收到数据
{
res=USART1->DR;
if((USART_RX_STA&0x80)==0)//接收未完成
{
if(USART_RX_STA&0x40)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x80; //接收完成了
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
#endif
下面就是UART初始化了
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XF44444B4;//IO状态设置
// GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; // 1位停止,无校验位.
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
只要一执行到printf就死在里面出不来。
是不是串口中断没有使能?
要不就是这句语句:
MY_NVIC_Init(3,3,USART1_IRQChannel,2);
有什么问题吗?
求大神解答,跪谢~~
展开
 我来答
匿名用户
2012-11-02
展开全部
1. printk是linux内核的打印函数,纯固件的程序中当然不会有这个函数的定义。
2. printf只用到了串口输出,没有输入,如果只是单纯死在这里应该与中断无关。

目前需要继续定位问题:
1. 保证在程序执行到挂死的位置时串口没有输入。
2. 在没有仿真器的情况下,用IO口电压或LED点亮和关闭的方法定位程序死在哪一行代码上。该代码不应该是一个函数调用,应该是函数内部的寄存器判断或某个循环语句。
3. 如果确认是在串口输入到来时才会产生的现象,并且程序也没有执行到中断处理,需要检查中断入口地址是否正确。可以考虑检查所有中断,确认是否因为其它中断引起代码跳转错误。
追问
printf的问题正如你所说的和中断无关。。我换了低版本的MDK编译器就正常输出了,但是现在新问题就是:我发送数据给串口,它不会回我信息。。。这又是什么原因,好懊恼啊。。
追答
现在需要确认的问题是,单片机收到数据了没?你可以在代码里比较一下接收到的数据,正确的话就拉一下IO。
huhotto
2012-11-01 · 超过18用户采纳过TA的回答
知道答主
回答量:92
采纳率:0%
帮助的人:45.1万
展开全部
printf 如果是驱动程序 不是用这个函数 用printk
追问
试过不行了,直接就报错,说printk没有定义。。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
175891641
2016-05-02 · TA获得超过154个赞
知道答主
回答量:213
采纳率:0%
帮助的人:46.5万
展开全部
在中断中 输入
t=USART1->SR;
t++;
就ok了 目的是手动清除SR标志
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式