你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

无法进入中断接收程序

[复制链接]
kiss_u_999 提问时间:2011-4-21 14:53 /
串口始终无法进入中断接收子程序,但是要是在main()里的for(;;)循环里头刚开始加入USART1_Putc(‘c’);就会一直进入接收中断子程序,并且串口调试助手就会无限循环输出“获取到串口1数据:”,当我发数据给它的话毫无反应哈,不知道怎么回事,你们看看:int main(void){    ChipHalInit();            //片内硬件初始化    ChipOutHalInit();        //片外硬件初始化        for(;;)    {            //串口2使用中断方式置位标志        if(Uart1_Get_Flag)        {            Uart1_Get_Flag=0;            USART1_Puts("\r\n获取到串口1数据:");            USART1_Putc(Uart1_Get_Data);            USART1_Puts("\r\n");        }            }}------------void USART1_IRQHandler(void){    //接收中断    if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)    {        USART_ClearITPendingBit(USART1,USART_IT_RXNE);        Uart1_Get_Data=USART_ReceiveData(USART1);        Uart1_Get_Flag=1;        }        //溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)    {        USART_ClearFlag(USART1,USART_FLAG_ORE);    //清溢出位        USART_ReceiveData(USART1);                //读DR    }}-----void USART_Configuration(void){    GPIO_InitTypeDef GPIO_InitStructure;    USART_InitTypeDef USART_InitStructure;    USART_ClockInitTypeDef USART_ClockInitStructure;        //使能串口1,PA,AFIO总线    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |             RCC_APB2Periph_AFIO |            RCC_APB2Periph_USART1 ,             ENABLE);    /* A9 USART1_Tx */    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //推挽输出-TX    GPIO_Init(GPIOA, &GPIO_InitStructure);    /* A10 USART1_Rx  */    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX    GPIO_Init(GPIOA, &GPIO_InitStructure);    USART_InitStructure.USART_BaudRate = 9600;    USART_InitStructure.USART_WordLength = USART_WordLength_8b;    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_ClockInitStructure.USART_Clock = USART_Clock_Disable;    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;    USART_ClockInit(USART1, &USART_ClockInitStructure);        USART_Init(USART1, &USART_InitStructure);    /* Enable the USARTx */    USART_Cmd(USART1, ENABLE);    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);}void USART1_Putc(unsigned char c){    USART_SendData(USART1, c);    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );}void USART1_Puts(char * str){    while(*str)    {        USART_SendData(USART1, *str++);        /* Loop until the end of transmission */        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    }}-----------------void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 
 /* Configure one bit for preemption priority */
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 
 /*UART2*/
 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}
收藏 评论7 发布时间:2011-4-21 14:53

举报

7个回答
废鱼 回答时间:2011-4-21 17:10:09

RE:无法进入中断接收程序

没有初始化串口、NVIC
瘦猪呆兔 回答时间:2011-4-21 15:09:50

RE:无法进入中断接收程序

兄弟好像串口时钟没使能吧
fxw451 回答时间:2011-4-21 16:02:19

RE:无法进入中断接收程序

中断配置对不??
瘦猪呆兔 回答时间:2011-4-21 19:18:01

RE:无法进入中断接收程序

还有个原因是你串口2、3脚搞短接了,你发送的时候会进中断?
zhouke58 回答时间:2011-4-22 23:31:56

RE:无法进入中断接收程序

串口无非就是以下几个步骤:
1:GPIO口设置TXD,RXD;
2.USARTX和对应GPIO口时钟使能;
3.USARTX全局中断NVIC设置
4.USART初始化设置包括波特率等;
5.使能USARTX外设,接收中断使能,发送中断使能
从你的程序没看出什么问题就一个地方NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;这里的USART1_IRQn应该不是这样写,除非你自己定义要不然应该是USART1_IRQChannel;
,你再看看你自己的初始化程序吧,应该漏掉以上的哪部分的.
wkong501 回答时间:2013-3-23 16:03:57

回复:无法进入中断接收程序

回复第 6 楼 于2011-04-22 23:31:56发表:
串口无非就是以下几个步骤:
1:GPIO口设置TXD,RXD;
2.USARTX和对应GPIO口时钟使能;
3.USARTX全局中断NVIC设置
4.USART初始化设置包括波特率等;
5.使能USARTX外设,接收中断使能,发送中断使能
从你的程序没看出什么问题就一个地方NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;这里的USART1_IRQn应该不是这样写,除非你自己定义要不然应该是USART1_IRQChannel;
,你再看看你自己的初始化程序吧,应该漏掉以上的哪部分的.
 
第5点说错了, USART1_IRQn是3.X固件写法,你说的是2.0的
 
buainilema 回答时间:2013-3-24 23:56:14

RE:无法进入中断接收程序

void USART1_IRQHandler(void)
这里错了!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版