Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行主程序时,如何在STM32f103xx上正确实现UART1中断?_Stm32_Interrupt_Uart_Gpio_Interrupt Handling - Fatal编程技术网

运行主程序时,如何在STM32f103xx上正确实现UART1中断?

运行主程序时,如何在STM32f103xx上正确实现UART1中断?,stm32,interrupt,uart,gpio,interrupt-handling,Stm32,Interrupt,Uart,Gpio,Interrupt Handling,我正在尝试编程我的bluePill,使PB11引脚的LED闪烁,同时通过串口UART1回显发送的内容 据我所知,中断允许我们运行我们想要的程序,在运行时,如果任何标志触发了中断信号,程序控制将被转移到运行中断服务例程,而原始程序正在运行,我在这里正确吗 因此,我试图保持绿色LED闪烁,当我在串行端口上键入任何内容时,红色LED闪烁,而绿色LED闪烁,蓝色LED必须始终打开,除非发送数据 问题1: 绿色led从不闪烁 问题2: 无论何时通过Arduino串行监视器发送字母或数字,收到的回音总是整个

我正在尝试编程我的bluePill,使PB11引脚的LED闪烁,同时通过串口UART1回显发送的内容

据我所知,中断允许我们运行我们想要的程序,在运行时,如果任何标志触发了中断信号,程序控制将被转移到运行中断服务例程,而原始程序正在运行,我在这里正确吗

因此,我试图保持绿色LED闪烁,当我在串行端口上键入任何内容时,红色LED闪烁,而绿色LED闪烁,蓝色LED必须始终打开,除非发送数据

问题1: 绿色led从不闪烁

问题2: 无论何时通过Arduino串行监视器发送字母或数字,收到的回音总是整个发送字母中的两个字母,而且回音总是在同一行,我的意思是不在换行 因此,键入
Hello
并按enter键可生成
He
,在那里键入
hi
并按enter键时,只会添加前两个字母,如so
Hehi
,为什么

我的代码是


/**************************项目说明***********************
STM32f103xx蓝丸板
PB10=绿色发光二极管
PB11=蓝色LED(待切换)
PB0=红色LED(控制亮度的PWM输出)
PB9=切换蓝色LED状态的按钮
PA0=电位计引脚(模拟输入)
USART1激活并将PA0的电压发送给user1
*/
#包括“stm32f1x.h”//包括MCU标题
#include//Boolean库头
#包括
//原型:
无效UART1_Init(无效)//在PA9(Tx)和PA10(Rx)上启用UART1。
void portsEnable(void)//为所需的MCU端口启用时钟。
无效延迟(uint32\u t延迟)//插管延迟。
void pinsConfig(void)//配置使用的引脚。
//定义和宏
内部主(空)
{
//非宗教化:
portsEnable();
pinsConfig();
UART1_Init();//启用USART1&仅在9600Bps时以8Mhz时钟速度中断
而(1)
{
//*******闪烁绿色指示灯***********************
GPIOB->BSRR=GPIO\U BSRR\U BS11;
延迟(100000);
GPIOB->BSRR=GPIO\U BSRR\U BR11;
延迟(100000);
}//while循环结束
}//结束main()循环
//*************功能实现*****************************
void UART1\u Init(void)//初始化USART1
{
//重置设置(8位,一个停止位,无奇偶校验)
//在已启用端口时钟之后,首先启用UART1的时钟
RCC->APB2ENR |=RCC_APB2ENR_USART1EN;//启用USART1模块的时钟
//USART1外围设备的引脚配置,其中Tx(PA9)=AF推拉,Rx=输入浮动
//设置Tx(PA9)引脚
GPIOA->CRH |=((1SR寄存器将发生变化,因为它由hardwart控制,我们将其与寄存器USART_SR_RXNE的值进行比较,该值表示第5位为1
{
char temp=USART1->DR;//将从数据寄存器接收的8位数据读入名为temp的字符中
USART1->DR=temp;//将相同的数据放入数据寄存器中,以便再次重新发送,这里的数据寄存器是clled阴影寄存器。从硬件角度看,它们不是相同的寄存器,但从编程角度看,我们使用相同的寄存器
而(!(USART1->SR&USART\U SR\U TC))
{
//等待传输完成,并通过闪烁红色led指示正在发送的数据来指示等待过程。
GPIOB->BSRR=GPIO_BSRR_BR10;//当未准备好接受更多数据时(例如,在传输数据过程中),蓝色LED亮起
GPIOB->BSRR=GPIO\U BSRR\U BS1;
延迟(10 000);
GPIOB->BSRR=GPIO\U BSRR\U BR1;
}
} 
//检查我们是否在这里,因为TXIE设置为“或传输完成”,这意味着我们准备接受更多数据传输
如果(USART1->SR&USART\U SR\U TXE)
{
//此处手柄传输完成:(LED闪烁)
GPIOB->BSRR=GPIO\U BSRR\U BS10;//准备接受更多数据时
}
其他的
{
GPIOB->BSRR=GPIO\U BSRR\U BR10;//未准备好接受更多数据时(例如在传输数据过程中)
}
}
void portsEnable(void)/*启用PortA和PortB*/
{
//为“APB2”总线上的端口(A和B)启用时钟。
RCC->APB2ENR |=RCC_APB2ENR_IOPAEN;//启用端口时钟
RCC->APB2ENR |=RCC_APB2ENR_IOPBEN;//启用端口B时钟
}
void pinsConfig(void)//配置使用的管脚。
{  
//将引脚“PB1”设置为输出推拉(红色LED)

GPIOB->CRL |=((1也许下面的链接对您有帮助:

不要使用“神奇”数字