完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
用USART1进行串口收发数据,始终收不到数据,mcu始终处于闲的状态,我初始化的代码 和main函数代码在下面,望大神指教到底是啥问题???
void Usart_Configuration(uint32_t BaudRate) { USART_InitTypeDef USART_InitStructure; //定义一个串口结构体 USART_InitStructure.USART_BaudRate =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; //接收和发送模式 USART_Init(USART1, &USART_InitStructure); //根据参数初始化串口寄存器 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口中断接收 USART_Cmd(USART1, ENABLE); //使能串口外设 } int main(void) { SystemInit(); //系统时钟配置 Init_LED(); //各个外设引脚配置 Init_Usart(); //串口引脚配置 Usart_Configuration(115200); //串口配置 设置波特率为115200 while(1) { printf("%d",USART1_Receive_Byte()); } |
|
相关推荐
21个回答
|
|
是stm32fxxx_it.c,刚才写错了
最佳答案
|
|
|
|
是不是没有初始化IO口时钟?
|
|
|
|
我给看看先呗~~
|
|
|
|
学习一下
|
|
|
|
亲,你把代码贴全一点,串口的接收和发送程序没有贴出来,没法看问题出在哪里啊
|
|
|
|
没有初始化时钟;吧,串口和GPIO
|
|
|
|
没有使能串口中断几优先级配置
|
|
|
|
void USART1_Send_Byte(uint16_t Data) { while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位 //USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态 USART_SendData(USART1,Data); //发送一个字符 } uint8_t USART1_Receive_Byte(void) { while(!(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))); //USART_GetFlagStatus:得到接收状态位 //USART_FLAG_RXNE:接收数据寄存器非空标志位 //1:忙状态 0:空闲(没收到数据,等待。。。) return USART_ReceiveData(USART1); //接收一个字符 } |
|
|
|
|
|
|
|
你的中断服务程序呢?
|
|
|
|
|
|
|
|
串口中断使用需注意:在串口中断服务函数里每一次要把读写寄存器里的内容读走,另外 看看有没有别的中断打断了串口中断 使能配置都配置好了没有 时钟都开了没有 IO模式配置对了没有 我能想到的就这些
|
|
|
|
串口中断使用要注意,串口中断服务函数要把读写寄存器里的内容读走
|
|
|
|
我删掉了这条语句,把接收函数直接写到了主函数里 int main(void) { SystemInit(); Init_Usart(); Usart_Configuration(115200); while(1) { u8 i=65; printf(menu); i=USART1_Receive_Byte(); // Delay_Ms(1000); //系统时钟配置 USART1_Send_Byte(i); printf("%c",i); Delay_Ms(1000); } } 这个接受字节的函数必须放到中断里? |
|
|
|
这样肯定是不行的,接收要放到中断里,用一个数组把数据接收下来,然后需要的话把数组读出来,或者不用数组,把接收的数据直接再发回串口
|
|
|
|
哦?好吧,我再试试 |
|
|
|
本帖最后由 魏小延 于 2016-8-3 15:12 编辑
void Init_NVIC(void) { NVIC_InitTypeDef NVIC_InitStructure; USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 不知道是哪里的问题始终不进中断?? |
|
|
|
在stm32fxxx.it中添加这个函数,或是在其他文件中添加这个函数,函数名必须是这个,函数内容自己写,注意必须是void返回void参数
void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { ComRev_ISR(); } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } |
|
|
|
这个函数我写了,现在的问题是,我检测了一下中断进入状态,始终返回0,但是当我吧RX线拔下来是,就进中断了!而且出不来始终在中断里! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1168 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1105 浏览 2 评论
2203 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1297 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1718 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 00:14 , Processed in 0.805985 second(s), Total 79, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号