完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
被这个程序整的没脾气了!大家来看看吧。串口接收中断总是进不去 , 不知道哪里设置错误,
我这个程序是我在 USART1的基础上改过来的,现在接收不了串口调试助手发来的数据,串口调试助手能收到USART3发出去的数据, 程序的意思是这样: STM32 main()里初始化外设,等待接收到数据的标志位flag,然后STM32 串口3中断接受这个数据,然后置位接收到数据的标志flag,把收到的数据存入temp 变量, STM32主程序就一直判断的这个标志位,如果置位了 就把这个收到的数据temp 回传到串口调试助手,并复位flag,进入下次接受 中断处理如下 #include "stm32f10x_it.h" extern volatile unsigned char temp; extern volatile unsigned char flag; void USART3_IRQHandler(void) //串口1中断服务程序 { if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { temp =USART_ReceiveData(USART3); flag=1; } } //主程序 volatile unsigned char flag =0; volatile unsigned char temp =0; void NVIC_Configuration(void); void GPIO_Configuration(void); voidUSART_Configuration(void); int main(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 , ENABLE); NVIC_Configuration(); GPIO_Configuration(); USART_Configuration(); while(1) { if(flag) // 如果保留这行,注释掉下一行 ,调试助手就收不到数据了 //if(1) //不注释这行 调试助手能一直收到数据 { flag=0; USART_SendData(USART3, temp); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); } } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin= GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置优先级分组:先占优先级0位,从优先级4位 //设置向量表的位置和偏移 #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //向量表位于RAM #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //向量表位于FLASH #endif /* Enable the USARTy Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //USART1中断 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1 } void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_StructInit(&USART_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_Mode= USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART3, &USART_InitStructure); USART_ITConfig(USART3,USART_IT_RXNE, ENABLE); USART_Cmd(USART3, ENABLE); } USART3能发送 接收进入不了中断.rar (269.92 KB ) |
|
相关推荐
10个回答
|
|
参考下我们开发板的库函数例子.
|
|
|
|
我是在开发板的库函数的例子的基础上改出来的 ,先用USART1 改出来了 能正常收发,再改成USART3,编译是这句报错:USART3_IRQn没有定义,查了很久的资料发现时 stm32f10x.h这个文件里宏定义 定义的是低密度芯片LD,我用的是开发板上的RBT片子,属于高密度骗子,如是改成HD,
#if !defined (STM32F10X_LD) && !defined (STM32F10X_MD) && !defined (STM32F10X_HD) && !defined (STM32F10X_CL) /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ #define STM32F10X_HD /*!< STM32F10X_HD: STM32 High density devices */ /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */ 启动代码也有***LD.S改成***HD.S然后就 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; 编译到是不报错了,但是还是收不到数据,进不了中断 ,网上很多人碰到了进入不了中断的问题 |
|
|
|
stm32f103rb属于md,不是hd.
|
|
|
|
是的 是md, 我们公司用的是RET的 但是 你的芯片是MD,但是你配给我们的例子是低密度的哦 ,
大家还是指点一下程序哪里有问题吧,求救,求指点,被这个串口搞得受不了了,几天都睡不好,吃不下啊 |
|
|
|
刚刚把代码添加到附件中去了 ,希望有技术高深的好心人路过这里
|
|
|
|
改用查询RXNE标志的方式 也收不到数据, 然后JTAG disable 掉,什么方法都试尽了 ,都没用,
现在我在怀疑是不是一开始新建工程的时候选了 低密度的片子,然后导致这个串口3工作不起来,但是 我后来我把启动代码和 stm32f10x.h的宏定义都改过来了啊,为什么还是不工作呢 |
|
|
|
感觉配置好像没什么问题哦,你调试的时候查查寄存器状态,看看是不是都符合要求了呢。还有晶振是8M的吧?如果换了晶振就不能直接调用SystemInit()了,要改宏定义的。
|
|
|
|
RCC_APB2Periph_AFIO没有使能吧
|
|
|
|
呵呵 我刚才吧这个加上去了 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);还是 没有用
|
|
|
|
看看这个别人的现成的:http://www.openedv.com/posts/list/400.htm#1603
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1659 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1571 浏览 1 评论
998 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
695 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1617 浏览 2 评论
1877浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
663浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
529浏览 3评论
548浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
517浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 05:07 , Processed in 0.986569 second(s), Total 94, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号