2021-04-16 STM32F103 USART 接收数据不进中断 以及 进中断后数据接收问题

问题1:硬件OK,USART接收数据不进终端

现象:

         硬件以及串口助手通过自检都没有问题,但是使用Keil Debug的时候发现,USART的SR寄存器中在每次接收到数据后,FE位都会置一,该位为帧错误位。具体什么是帧错误请百度,不赘述。且不进接收中断。

解决方法:

    排除硬件问题,时钟问题后,最终导致该问题的原因在于启动文件加载错误,我使用的是STM32F103C8T6芯片,应该加载的是startup_stm32f10x_md.s,我家在的xl.s

    -startup_stm32f10x_ld_vl.s: for STM32 Low density Value linedevices 
- startup_stm32f10x_ld.s: for STM32 Low densitydevices 
- startup_stm32f10x_md_vl.s: for STM32 Medium density Value linedevices 
- startup_stm32f10x_md.s: for STM32 Medium densitydevices 
- startup_stm32f10x_hd.s: for STM32 High densitydevices 
- startup_stm32f10x_xl.s: for STM32 XL densitydevices 
- startup_stm32f10x_cl.s: for STM32 Connectivity linedevices 
cl:互联型产品,stm32f105/107系列 
vl:超值型产品,stm32f100系列 
xl:超高密度产品,stm32f101/103系列
ld࿱

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是stm32f103 usart1串口通讯中断接收代码: ```c #include "stm32f10x.h" #include "stdio.h" uint8_t USART1_Receive_Buffer[500]; //定义一个接收缓冲区 int USART1_Receive_Index = 0; //定义一个接收数据索引 void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO和AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1_TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; //设置波特率为9600 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);//使能接收中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//设置中断组和通道号 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能接收中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级为0 NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE);//使能USART1外设 } void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断是否接收数据 { USART1_Receive_Buffer[USART1_Receive_Index++] = USART_ReceiveData(USART1); //接收数据,存入缓冲区 if (USART1_Receive_Index >= 500) //如果接收到的数据超出缓冲区大小 { USART1_Receive_Index = 0; //重置索引 } } } int main() { USART1_Configuration(); while (1) { if (USART1_Receive_Index) //如果接收数据 { USART_SendData(USART1, USART1_Receive_Buffer[USART1_Receive_Index - 1]); //发送上一次接收到的数据 USART1_Receive_Index--; //接收数据索引减1 } } } ``` 在该代码中,首先对USART1行了初始化配置,包括GPIO配置、波特率、数据位、停止位、校验位、硬件流控制等,以及开启中断并设置中断优先级。然后在中断处理函数中判断是否接收数据,如果接收数据,则将数据存入接收缓冲区中。最后在while循环中对接收缓冲区行处理,将接收到的数据原样发送回去。 需要注意的是,接收中断是在USART1的接收寄存器接收数据后触发的,需要在中断处理函数中行判断和处理。同时,在处理接收到的数据时,需要判断缓冲区是否已满,避免数据溢出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值